LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3B5cmlnaHQgqTIwMTIgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KDQpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQoNCiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQoNClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQpTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pDQpIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsDQpFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgojaWZuZGVmIF9fQ0xfS0VSTkVMX0lORk9fQU1EX0gKI2RlZmluZSBfX0NMX0tFUk5FTF9JTkZPX0FNRF9ICgojaW5jbHVkZSAiQ0wvY2xfcGxhdGZvcm0uaCIKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmIC8qX19jcGx1c3BsdXMqLwoKdHlwZWRlZiBjbF91aW50IGNsX2tlcm5lbF9pbmZvX2FtZDsKCi8qIGNsX2tlcm5lbF9pbmZvICovCmVudW0gS2VybmVsSW5mb0FNRAp7CiAgICBDTF9LRVJORUxJTkZPX05PTkUgPSAweDAsCiAgICBDTF9LRVJORUxJTkZPX1NDUkFUQ0hfUkVHUywKICAgIENMX0tFUk5FTElORk9fV0FWRUZST05UX1BFUl9TSU1ELAogICAgQ0xfS0VSTkVMSU5GT19XQVZFRlJPTlRfU0laRSwKICAgIENMX0tFUk5FTElORk9fQVZBSUxBQkxFX0dQUlMsCiAgICBDTF9LRVJORUxJTkZPX1VTRURfR1BSUywKICAgIENMX0tFUk5FTElORk9fQVZBSUxBQkxFX0xEU19TSVpFLAogICAgQ0xfS0VSTkVMSU5GT19VU0VEX0xEU19TSVpFLAogICAgQ0xfS0VSTkVMSU5GT19BVkFJTEFCTEVfU1RBQ0tfU0laRSwKICAgIENMX0tFUk5FTElORk9fVVNFRF9TVEFDS19TSVpFLAogICAgQ0xfS0VSTkVMSU5GT19BVkFJTEFCTEVfU0dQUlMsCiAgICBDTF9LRVJORUxJTkZPX1VTRURfU0dQUlMsCiAgICBDTF9LRVJORUxJTkZPX0FWQUlMQUJMRV9WR1BSUywKICAgIENMX0tFUk5FTElORk9fVVNFRF9WR1BSUywKICAgIENMX0tFUk5FTElORk9fTEFTVAp9OwoKLyohIFxicmllZiBSZXRyaWV2ZXMgdGhlIGtlcm5lbCBpbmZvcm1hdGlvbi4KICoKICogIFxwYXJhbSBrZXJuZWwgc3BlY2lmaWVzIHRoZSBrZXJuZWwgb2JqZWN0IGJlaW5nIHF1ZXJpZWQuCiAqCiAqICBccGFyYW0gZGV2aWNlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBkZXZpY2UgaW4gdGhlIGxpc3Qgb2YgZGV2aWNlcyBhc3NvY2lhdGVkCiAqICB3aXRoIFxhIGtlcm5lbC4gVGhlIGxpc3Qgb2YgZGV2aWNlcyBpcyB0aGUgbGlzdCBvZiBkZXZpY2VzIGluIHRoZSBPcGVuQ0wKICogIGNvbnRleHQgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggXGEga2VybmVsLiBJZiB0aGUgbGlzdCBvZiBkZXZpY2VzIGFzc29jaWF0ZWQKICogIHdpdGgga2VybmVsIGlzIGEgc2luZ2xlIGRldmljZSwgXGEgZGV2aWNlIGNhbiBiZSBhIE5VTEwgdmFsdWUuCiAqCiAqICBccGFyYW0gcGFyYW1fbmFtZSBzcGVjaWZpZXMgdGhlIGluZm9ybWF0aW9uIHRvIHF1ZXJ5LgogKgogKiAgXHBhcmFtIHBhcmFtX3ZhbHVlIGlzIGEgcG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdGhlIGFwcHJvcHJpYXRlIHJlc3VsdAogKiAgYmVpbmcgcXVlcmllZCBpcyByZXR1cm5lZC4gSWYgXGEgcGFyYW1fdmFsdWUgaXMgTlVMTCwgaXQgaXMgaWdub3JlZC4KICoKICogIFxwYXJhbSBwYXJhbV92YWx1ZV9zaXplIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgc2l6ZSBpbiBieXRlcyBvZiBtZW1vcnkKICogIHBvaW50ZWQgdG8gYnkgXGEgcGFyYW1fdmFsdWUuIFRoaXMgc2l6ZSBtdXN0IGJlID49IHNpemUgb2YgcmV0dXJuIHR5cGUuCiAqCiAqICBccGFyYW0gcGFyYW1fdmFsdWVfc2l6ZV9yZXQgcmV0dXJucyB0aGUgYWN0dWFsIHNpemUgaW4gYnl0ZXMgb2YgZGF0YSBjb3BpZWQKICogIHRvIFxhIHBhcmFtX3ZhbHVlLiBJZiBcYSBwYXJhbV92YWx1ZV9zaXplX3JldCBpcyBOVUxMLCBpdCBpcyBpZ25vcmVkLgogKgogKiAgXHJldHVybiBPbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAqICAtIENMX1NVQ0NFU1MgaWYgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseQogKiAgLSBDTF9JTlZBTElEX1ZBTFVFIGlmIFxhIHBhcmFtX25hbWUgaXMgbm90IHZhbGlkLCBvciBpZiBzaXplIGluIGJ5dGVzCiAqICAgIHNwZWNpZmllZCBieSBcYSBwYXJhbV92YWx1ZV9zaXplIGlzIDwgc2l6ZSBvZiByZXR1cm4gdHlwZSBhbmQKICogICAgXGEgcGFyYW1fdmFsdWUgaXMgbm90IE5VTEwKICogIC0gQ0xfSU5WQUxJRF9LRVJORUwgaWYgXGEga2VybmVsIGlzIGEgbm90IGEgdmFsaWQgcHJvZ3JhbSBvYmplY3QKICovCmV4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCmNsR2V0S2VybmVsSW5mb0FNRCgKICAgIGNsX2tlcm5lbCAgICAgICAgICAgLyoga2VybmVsICovLAogICAgY2xfZGV2aWNlX2lkICAgICAgICAvKiBkZXZpY2UgKi8sCiAgICBjbF9rZXJuZWxfaW5mb19hbWQgIC8qIHBhcmFtX25hbWUgKi8sCiAgICBzaXplX3QgICAgICAgICAgICAgIC8qIHBhcmFtX3ZhbHVlX3NpemUgKi8sCiAgICB2b2lkKiAgICAgICAgICAgICAgIC8qIHBhcmFtX3ZhbHVlICovLAogICAgc2l6ZV90KiAgICAgICAgICAgICAvKiBwYXJhbV92YWx1ZV9zaXplX3JldCAqLwogICApIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0gLypleHRlcm4gIkMiKi8KI2VuZGlmIC8qX19jcGx1c3BsdXMqLwoKI2VuZGlmICAvKl9fQ0xfS0VSTkVMX0lORk9fQU1EX0gqLwo=