LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCgovKiAzMmJpdCAtPiAxNmJpdCAtPiAzMmJpdCBtb2RlIHN3aXRjaCBjb2RlICovCgovKgogKiBTdGFjayBmcmFtZSBhdCAweGUwMAogKiAgICAgIGUwMCBlYng7CiAqCWUwNCBlY3g7CiAqCWUwOCBlZHg7CiAqCWUwYyBlc2k7CiAqCWUxMCBlZGk7CiAqCWUxNCBlYnA7CiAqCWUxOCBlYXg7CiAqCWUxYyBkczsKICoJZTIwIGVzOwogKgllMjQgZnM7CiAqCWUyOCBnczsKICoJZTJjIG9yaWdfZWF4OwogKgllMzAgZWlwOwogKgllMzQgY3M7CiAqCWUzOCBlZmxhZ3M7CiAqCWUzYyBlc3A7CiAqCWU0MCBzczsKICovCgojZGVmaW5lIGEzMgkJLmJ5dGUgMHg2NzsJCS8qIGFkZHJlc3Mgc2l6ZSBwcmVmaXggMzIgKi8KI2RlZmluZSBvMzIJCS5ieXRlIDB4NjY7CQkvKiBvcGVyYW5kIHNpemUgcHJlZml4IDMyICovCgouc2VjdGlvbiAucmVhbG1vZGUsICJheCIKLmNvZGUxNgoJCQkJCQkvKiAxNmJpdCBwcm90ZWN0ZWQgbW9kZSBjb2RlIGhlcmUgKi8KLmdsb2JsIHJlYWxtb2RlX2VudGVyCnJlYWxtb2RlX2VudGVyOgpvMzIJcHVzaGEKbzMyCXB1c2hmCgljbGkKCXNpZHQgICAJc2F2ZWRfaWR0CglzZ2R0ICAgIHNhdmVkX2dkdAoJbW92bCAgICAlZXNwLCAlZWF4Cgltb3ZsICAgICVlYXgsIHNhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcAoKCW1vdmwJJDB4MTAsICVlYXgKCW1vdmwgICAgJWVheCwgJWVzcAoJbW92dwkkMHgyOCwgJWF4Cgltb3Z3CSVheCwgJWRzCgltb3Z3CSVheCwgJWVzCgltb3Z3CSVheCwgJWZzCgltb3Z3CSVheCwgJWdzCgoJbGlkdAlyZWFsbW9kZV9pZHRfcHRyCgltb3ZsCSVjcjAsICVlYXggICAgICAgICAgICAgICAgCS8qIEdvIGJhY2sgaW50byByZWFsIG1vZGUgYnkgKi8KCWFuZGwJJDB4N2ZmZmZmZmUsICVlYXggICAgICAgICAJLyogY2xlYXJpbmcgUEUgdG8gMCAqLwoJbW92bAklZWF4LCAlY3IwCglsam1wCSQweDAsJGRvX3JlYWxtb2RlICAgICAgICAgICAgIAkvKiBzd2l0Y2ggdG8gcmVhbCBtb2RlICovCgpkb19yZWFsbW9kZToJCQkJCS8qIHJlYWxtb2RlIGNvZGUgZnJvbSBoZXJlICovCgltb3Z3CSVjcywlYXgKCW1vdncJJWF4LCVkcwoJbW92dwklYXgsJWVzCgltb3Z3CSVheCwlZnMKCW1vdncJJWF4LCVncwoKCQkJCQkJLyogY3JlYXRlIGEgdGVtcG9yYXJ5IHN0YWNrICovCgoJbW92dwkkMHhjMCwgJWF4Cgltb3Z3CSVheCwgJXNzCgltb3Z3CSQweDIwMCwgJWF4Cgltb3Z3CSVheCwgJXNwCgoJcG9wbAklZWJ4Cglwb3BsCSVlY3gKCXBvcGwJJWVkeAoJcG9wbAklZXNpCglwb3BsCSVlZGkKCXBvcGwJJWVicAoJcG9wbAklZWF4Cgltb3ZsCSVlYXgsIHRlbXBfZWF4Cglwb3BsCSVlYXgKCW1vdncJJWF4LCAlZHMKCXBvcGwJJWVheAoJbW92dwklYXgsICVlcwoJcG9wbAklZWF4Cgltb3Z3CSVheCwgJWZzCglwb3BsCSVlYXgKCW1vdncJJWF4LCAlZ3MKCXBvcGwJJWVheAkJCQkvKiBvcmlnX2VheCAqLwoJcG9wbAklZWF4CmNzCW1vdncJJWF4LCB0ZW1wX2lwCglwb3BsCSVlYXgKY3MJbW92dwklYXgsIHRlbXBfY3MKbzMyCXBvcGYKCXBvcGwJJWVheAoJcG9wdwklc3MKCW1vdmwJJWVheCwgJWVzcApjcwltb3ZsCXRlbXBfZWF4LCAlZWF4Cgl3YmludmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VsZi1tb2RpZnlpbmcgY29kZSwKCQkJCQkJICogYmV0dGVyIGZsdXNoIHRoZSBjYWNoZSAqLwoKCS5ieXRlCTB4OWEJCQkJLyogbGNhbGwgKi8KdGVtcF9pcDoKCS53b3JkCTAJICAgICAJCQkvKiBuZXcgaXAgKi8KdGVtcF9jczoKCS53b3JkICAgMAkJCQkvKiBuZXcgY3MgKi8KcmVhbG1vZGVfcmV0OgoJCQkJCQkvKiBzYXZlIGVheCwgZXNwIGFuZCBzcyAqLwpjcwltb3ZsCSVlYXgsIHNhdmVkX2VheAoJbW92bAklZXNwLCAlZWF4CmNzCW1vdmwJJWVheCwgc2F2ZWRfZXNwCgltb3Z3ICAgICVzcywgJWF4CmNzCW1vdncJJWF4LCBzYXZlZF9zcwoKCS8qIHJlc3RvcmUgdGhlIHN0YWNrLCBub3RlIHRoYXQgd2Ugc2V0IHNwIHRvIDB4MjQ0OwoJICogcHRfcmVncyBpcyAweDQ0IGJ5dGVzIGxvbmcgYW5kIHdlIHB1c2ggdGhlIHN0cnVjdHVyZQoJICogYmFja3dhcmRzIG9uIHRvIHRoZSBzdGFjaywgYm90dG9tIGZpcnN0ICovCgoJbW92dwkkMHhjMCwgJWF4Cgltb3Z3CSVheCwgJXNzCgltb3Z3CSQweDI0NCwgJWF4Cgltb3Z3CSVheCwgJXNwCgoJeG9ybAklZWF4LCVlYXgKY3MJbW92dwlzYXZlZF9zcywgJWF4CglwdXNobAklZWF4CmNzCW1vdmwJc2F2ZWRfZXNwLCAlZWF4CglwdXNobAklZWF4Cm8zMglwdXNoZgoJeG9ybAklZWF4LCVlYXgKY3MJbW92dwl0ZW1wX2NzLCAlYXgKCXB1c2hsCSVlYXgKY3MJbW92dwl0ZW1wX2lwLCAlYXgKCXB1c2hsCSVlYXgKCXB1c2hsCSQwCgltb3Z3CSVncywgJWF4CglwdXNobAklZWF4Cgltb3Z3CSVmcywgJWF4CglwdXNobAklZWF4Cgltb3Z3CSVlcywgJWF4CglwdXNobAklZWF4Cgltb3Z3CSVkcywgJWF4CglwdXNobAklZWF4Cgltb3ZsCXNhdmVkX2VheCwgJWVheAoJcHVzaGwJJWVheAoJcHVzaGwJJWVicAoJcHVzaGwJJWVkaQoJcHVzaGwJJWVzaQoJcHVzaGwJJWVkeAoJcHVzaGwJJWVjeAoJcHVzaGwJJWVieAoKbzMyIGNzCWxpZHQJc2F2ZWRfaWR0Cm8zMiBjcwlsZ2R0ICAgIHNhdmVkX2dkdAkJCS8qIFNldCBHRFRSICovCgoJbW92bCAgICAlY3IwLCAlZWF4ICAgICAgICAgICAgICAJLyogR28gYmFjayBpbnRvIHByb3RlY3RlZCBtb2RlICovCglvcmwgICAgICQxLCVlYXggICAgICAgICAgICAgICAgIAkvKiByZXNldCBQRSB0byAxICovCgltb3ZsICAgICVlYXgsICVjcjAKCWptcCAgICAgbmV4dF9saW5lICAgICAgICAgICAgICAgCS8qIGZsdXNoIHByZWZldGNoIHF1ZXVlICovCm5leHRfbGluZToKCW1vdncJJHJldHVybl9wdHIsICVheAoJbW92dyAgICAlYXgsJWJwCm8zMiBjcwlsam1wCSooJWJwKQoKLmNvZGUzMgpwcm90ZWN0ZWRfbW9kZToKCW1vdmwgICAgJDB4MTgsJWVheCAgICAgICAgIAkJLyogcmVsb2FkIEdEVFszXSAqLwoJbW92dyAgICAlYXgsJWZzICAgICAgICAgICAgICAgICAJLyogcmVzZXQgRlMgKi8KCW1vdncJJWF4LCVkcyAgICAgICAgICAgICAgICAJCS8qIHJlc2V0IERTICovCgltb3Z3ICAgICVheCwlZ3MgICAgICAgICAgICAgICAgIAkvKiByZXNldCBHUyAqLwoJbW92dyAgICAlYXgsJWVzICAgICAgICAgICAgICAgICAJLyogcmVzZXQgRVMgKi8KCW1vdncgICAgJWF4LCVzcyAgICAgICAgICAgICAgICAgCS8qIHJlc2V0IFNTICovCgltb3ZsICAgIHNhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcCwgJWVheAoJbW92bAklZWF4LCAlZXNwCglwb3BmCglwb3BhCglyZXQKCnRlbXBfZWF4OgoJLmxvbmcJMAoKc2F2ZWRfc3M6Cgkud29yZCAgIDAKc2F2ZWRfZXNwOgoJLmxvbmcJMApzYXZlZF9lYXg6CgkubG9uZwkwCgpyZWFsbW9kZV9pZHRfcHRyOgoJLndvcmQJMHg0MDAKCS53b3JkCTB4MCwgMHgwCgpzYXZlZF9nZHQ6Cgkud29yZCAJMCwgMCwgMCwgMApzYXZlZF9pZHQ6Cgkud29yZCAJMCwgMCwgMCwgMAoKc2F2ZWRfcHJvdGVjdGVkX21vZGVfZXNwOgoJLmxvbmcgCTAKCnJldHVybl9wdHI6CgkubG9uZwlwcm90ZWN0ZWRfbW9kZQoJLndvcmQJMHgxMAo=