LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydA0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogQ29weXJpZ2h0IChjKSAyMDA4LCBBdG1lbCBDb3Jwb3JhdGlvbg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAqDQogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZGlzY2xhaW1lciBiZWxvdy4NCiAqDQogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0KICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUg0KICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVCBBUkUNCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQogKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwNCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQogKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsDQogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQoNCi8qKg0KICogXGZpbGUNCiAqDQogKiBcc2VjdGlvbiBQdXJwb3NlDQogKg0KICogRGVmaW5pdGlvbiBvZiBhIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgYSBVU0IgZGV2aWNlIENEQyBzZXJpYWwgZHJpdmVyLg0KICoNCiAqIFxzZWN0aW9uIFVzYWdlDQogKg0KICogLSMgUmUtaW1wbGVtZW50IHRoZSBVU0JEQ2FsbGJhY2tzX1JlcXVlc3RSZWNlaXZlZCBtZXRob2QgdG8gcGFzcw0KICogICAgcmVjZWl2ZWQgcmVxdWVzdHMgdG8gQ0RDRFNlcmlhbERyaXZlcl9SZXF1ZXN0SGFuZGxlci4gKlRoaXMgaXMNCiAqICAgIGF1dG9tYXRpY2FsbHkgZG9uZSB1bmxlc3MgdGhlIE5PQVVUT0NBTExCQUNLIHN5bWJvbCBpcyBkZWZpbmVkKi4NCiAqIC0jIEluaXRpYWxpemUgdGhlIENEQyBzZXJpYWwgYW5kIFVTQiBkcml2ZXJzIHVzaW5nDQogKiAgICBDRENEU2VyaWFsRHJpdmVyX0luaXRpYWxpemUuDQogKiAtIyBMb2dpY2FsbHkgY29ubmVjdCB0aGUgZGV2aWNlIHRvIHRoZSBob3N0IHVzaW5nIFVTQkRfQ29ubmVjdC4NCiAqIC0jIFNlbmQgc2VyaWFsIGRhdGEgdG8gdGhlIFVTQiBob3N0IHVzaW5nIENEQ0RTZXJpYWxEcml2ZXJfV3JpdGUuDQogKiAtIyBSZWNlaXZlIHNlcmlhbCBkYXRhIGZyb20gdGhlIFVTQiBob3N0IHVzaW5nIENEQ0RTZXJpYWxEcml2ZXJfUmVhZC4NCiAqLw0KDQojaWZuZGVmIENEQ0RTRVJJQUxEUklWRVJfSA0KI2RlZmluZSBDRENEU0VSSUFMRFJJVkVSX0gNCg0KLyoqIFxhZGR0b2dyb3VwIHVzYmRfY2RjDQogKkB7DQogKi8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgSGVhZGVycw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBUaGVzZSBoZWFkZXJzIHdlcmUgaW50cm9kdWNlZCBpbiBDOTkNCiAgIGJ5IHdvcmtpbmcgZ3JvdXAgSVNPL0lFQyBKVEMxL1NDMjIvV0cxNC4gKi8NCiNpbmNsdWRlIDxzdGRpbnQuaD4NCg0KI2luY2x1ZGUgPFVTQlJlcXVlc3RzLmg+DQojaW5jbHVkZSA8Q0RDUmVxdWVzdHMuaD4NCiNpbmNsdWRlIDxDRENEZXNjcmlwdG9ycy5oPg0KI2luY2x1ZGUgPENEQ05vdGlmaWNhdGlvbnMuaD4NCg0KI2luY2x1ZGUgPENEQ0RTZXJpYWwuaD4NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgRGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIFxhZGR0b2dyb3VwIHVzYmRfY2RjX2lmIFVTQiBEZXZpY2UgQ0RDIFNlcmlhbCBJbnRlcmZhY2UgSURzDQogKiAgICAgIEB7DQogKi8NCi8qKiBDb21tdW5pY2F0aW9uIENsYXNzIEludGVyZmFjZSBJRCAqLw0KI2RlZmluZSBDRENEU2VyaWFsRHJpdmVyX0NDX0lOVEVSRkFDRSAgICAgICAgICAgMA0KLyoqIERhdGEgQ2xhc3MgSW50ZXJmYWNlIElEICovDQojZGVmaW5lIENEQ0RTZXJpYWxEcml2ZXJfRENfSU5URVJGQUNFICAgICAgICAgICAxDQovKiogICAgIEB9Ki8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgVHlwZXMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNwcmFnbWEgcGFjaygxKQ0KI2lmIGRlZmluZWQgICAoIF9fQ0NfQVJNICAgKSAvKiBLZWlsIKbMVmlzaW9uIDQgKi8NCiNlbGlmIGRlZmluZWQgKCBfX0lDQ0FSTV9fICkgLyogSUFSIEV3YXJtICovDQojZGVmaW5lIF9fYXR0cmlidXRlX18oLi4uKQ0KI2RlZmluZSBfX3BhY2tlZF9fICBwYWNrZWQNCiNlbGlmIGRlZmluZWQgKCAgX19HTlVDX18gICkgLyogR0NDIENTMyAqLw0KI2RlZmluZSBfX3BhY2tlZF9fICBhbGlnbmVkKDEpDQojZW5kaWYNCg0KLyoqDQogKiBcdHlwZWRlZiBDRENEU2VyaWFsRHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzDQogKiBcYnJpZWYgQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGxpc3QgZm9yIGEgZGV2aWNlIGltcGxlbWVudGluZyBhDQogKiAgICAgICAgQ0RDIHNlcmlhbCBkcml2ZXIuDQogKi8NCnR5cGVkZWYgc3RydWN0IF9DRENEU2VyaWFsRHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzIHsNCg0KICAgIC8qKiBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IuICovDQogICAgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgY29uZmlndXJhdGlvbjsNCiAgICAvKiogQ29tbXVuaWNhdGlvbiBpbnRlcmZhY2UgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yICBjb21tdW5pY2F0aW9uOw0KICAgIC8qKiBDREMgaGVhZGVyIGZ1bmN0aW9uYWwgZGVzY3JpcHRvci4gKi8NCiAgICBDRENIZWFkZXJEZXNjcmlwdG9yIGhlYWRlcjsNCiAgICAvKiogQ0RDIGNhbGwgbWFuYWdlbWVudCBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDQ2FsbE1hbmFnZW1lbnREZXNjcmlwdG9yIGNhbGxNYW5hZ2VtZW50Ow0KICAgIC8qKiBDREMgYWJzdHJhY3QgY29udHJvbCBtYW5hZ2VtZW50IGZ1bmN0aW9uYWwgZGVzY3JpcHRvci4gKi8NCiAgICBDRENBYnN0cmFjdENvbnRyb2xNYW5hZ2VtZW50RGVzY3JpcHRvciBhYnN0cmFjdENvbnRyb2xNYW5hZ2VtZW50Ow0KICAgIC8qKiBDREMgdW5pb24gZnVuY3Rpb25hbCBkZXNjcmlwdG9yICh3aXRoIG9uZSBzbGF2ZSBpbnRlcmZhY2UpLiAqLw0KICAgIENEQ1VuaW9uRGVzY3JpcHRvciB1bmlvbjE7DQogICAgLyoqIE5vdGlmaWNhdGlvbiBlbmRwb2ludCBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciBub3RpZmljYXRpb247DQogICAgLyoqIERhdGEgaW50ZXJmYWNlIGRlc2NyaXB0b3IuICovDQogICAgVVNCSW50ZXJmYWNlRGVzY3JpcHRvciBkYXRhOw0KICAgIC8qKiBEYXRhIE9VVCBlbmRwb2ludCBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciBkYXRhT3V0Ow0KICAgIC8qKiBEYXRhIElOIGVuZHBvaW50IGRlc2NyaXB0b3IuICovDQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIGRhdGFJbjsNCg0KfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIENEQ0RTZXJpYWxEcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnM7DQoNCi8qKg0KICogXHR5cGVkZWYgQ0RDRFNlcmlhbERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc09URw0KICogXGJyaWVmIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciBsaXN0IGZvciBhIGRldmljZSBpbXBsZW1lbnRpbmcgYQ0KICogICAgICAgIENEQyBzZXJpYWwgT1RHIGRyaXZlci4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgX0NEQ0RTZXJpYWxEcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnNPVEcgew0KDQogICAgLyoqIFN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvci4gKi8NCiAgICBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciBjb25maWd1cmF0aW9uOw0KICAgIC8qIE9URyBkZXNjcmlwdG9yICovDQogICAgVVNCT3RnRGVzY3JpcHRvciBvdGdEZXNjcmlwdG9yOw0KICAgIC8qKiBDb21tdW5pY2F0aW9uIGludGVyZmFjZSBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkludGVyZmFjZURlc2NyaXB0b3IgIGNvbW11bmljYXRpb247DQogICAgLyoqIENEQyBoZWFkZXIgZnVuY3Rpb25hbCBkZXNjcmlwdG9yLiAqLw0KICAgIENEQ0hlYWRlckRlc2NyaXB0b3IgaGVhZGVyOw0KICAgIC8qKiBDREMgY2FsbCBtYW5hZ2VtZW50IGZ1bmN0aW9uYWwgZGVzY3JpcHRvci4gKi8NCiAgICBDRENDYWxsTWFuYWdlbWVudERlc2NyaXB0b3IgY2FsbE1hbmFnZW1lbnQ7DQogICAgLyoqIENEQyBhYnN0cmFjdCBjb250cm9sIG1hbmFnZW1lbnQgZnVuY3Rpb25hbCBkZXNjcmlwdG9yLiAqLw0KICAgIENEQ0Fic3RyYWN0Q29udHJvbE1hbmFnZW1lbnREZXNjcmlwdG9yIGFic3RyYWN0Q29udHJvbE1hbmFnZW1lbnQ7DQogICAgLyoqIENEQyB1bmlvbiBmdW5jdGlvbmFsIGRlc2NyaXB0b3IgKHdpdGggb25lIHNsYXZlIGludGVyZmFjZSkuICovDQogICAgQ0RDVW5pb25EZXNjcmlwdG9yIHVuaW9uMTsNCiAgICAvKiogTm90aWZpY2F0aW9uIGVuZHBvaW50IGRlc2NyaXB0b3IuICovDQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIG5vdGlmaWNhdGlvbjsNCiAgICAvKiogRGF0YSBpbnRlcmZhY2UgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yIGRhdGE7DQogICAgLyoqIERhdGEgT1VUIGVuZHBvaW50IGRlc2NyaXB0b3IuICovDQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIGRhdGFPdXQ7DQogICAgLyoqIERhdGEgSU4gZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgZGF0YUluOw0KDQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQ0RDRFNlcmlhbERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc09URzsNCg0KI3ByYWdtYSBwYWNrKCkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCmV4dGVybiB2b2lkIENEQ0RTZXJpYWxEcml2ZXJfSW5pdGlhbGl6ZSgNCiAgICBjb25zdCBVU0JERHJpdmVyRGVzY3JpcHRvcnMgKnBEZXNjcmlwdG9ycyk7DQoNCmV4dGVybiB2b2lkIENEQ0RTZXJpYWxEcml2ZXJfQ29uZmlndXJhdGlvbkNoYW5nZWRIYW5kbGVyKHVpbnQ4X3QgY2ZnbnVtKTsNCg0KZXh0ZXJuIHZvaWQgQ0RDRFNlcmlhbERyaXZlcl9SZXF1ZXN0SGFuZGxlcigNCiAgICBjb25zdCBVU0JHZW5lcmljUmVxdWVzdCAqcmVxdWVzdCk7DQoNCi8qKg0KICogU2VuZHMgYSBkYXRhIGJ1ZmZlciB0aHJvdWdoIHRoZSB2aXJ0dWFsIENPTSBwb3J0IGNyZWF0ZWQgYnkgdGhlIENEQw0KICogZGV2aWNlIHNlcmlhbCBkcml2ZXIuIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBleGFjdGx5IGxpa2UgVVNCRF9Xcml0ZS4NCiAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIHNlbmQuDQogKiBccGFyYW0gc2l6ZSBTaXplIG9mIHRoZSBkYXRhIGJ1ZmZlciBpbiBieXRlcy4NCiAqIFxwYXJhbSBjYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgdHJhbnNmZXINCiAqICAgICAgICAgICAgICAgICBmaW5pc2hlcy4NCiAqIFxwYXJhbSBhcmd1bWVudCBPcHRpb25hbCBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uDQogKiBccmV0dXJuIFVTQkRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIHJlYWQgb3BlcmF0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQgbm9ybWFsbHk7DQogKiAgICAgICAgIG90aGVyd2lzZSwgdGhlIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZS4NCiAqLw0Kc3RhdGljIGlubGluZSB1aW50MzJfdCBDRENEU2VyaWFsRHJpdmVyX1dyaXRlKA0KICAgIHZvaWQgKmRhdGEsDQogICAgdWludDMyX3Qgc2l6ZSwNCiAgICBUcmFuc2ZlckNhbGxiYWNrIGNhbGxiYWNrLA0KICAgIHZvaWQgKmFyZ3VtZW50KQ0Kew0KICAgIHJldHVybiBDRENEU2VyaWFsX1dyaXRlKGRhdGEsIHNpemUsIGNhbGxiYWNrLCBhcmd1bWVudCk7DQp9DQoNCi8qKg0KICogUmVjZWl2ZXMgZGF0YSBmcm9tIHRoZSBob3N0IHRocm91Z2ggdGhlIHZpcnR1YWwgQ09NIHBvcnQgY3JlYXRlZCBieQ0KICogdGhlIENEQyBkZXZpY2Ugc2VyaWFsIGRyaXZlci4gVGhpcyBmdW5jdGlvbiBiZWhhdmVzIGxpa2UgVVNCRF9SZWFkLg0KICogXHBhcmFtIGRhdGEgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcHV0IHJlY2VpdmVkIGRhdGEuDQogKiBccGFyYW0gc2l6ZSBTaXplIG9mIHRoZSBkYXRhIGJ1ZmZlciBpbiBieXRlcy4NCiAqIFxwYXJhbSBjYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgdHJhbnNmZXINCiAqICAgICAgICAgICAgICAgICBmaW5pc2hlcy4NCiAqIFxwYXJhbSBhcmd1bWVudCBPcHRpb25hbCBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uDQogKiBccmV0dXJuIFVTQkRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIHJlYWQgb3BlcmF0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQgbm9ybWFsbHk7DQogKiAgICAgICAgIG90aGVyd2lzZSwgdGhlIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZS4NCiAqLw0Kc3RhdGljIGlubGluZSB1aW50MzJfdCBDRENEU2VyaWFsRHJpdmVyX1JlYWQoDQogICAgdm9pZCAqZGF0YSwNCiAgICB1aW50MzJfdCBzaXplLA0KICAgIFRyYW5zZmVyQ2FsbGJhY2sgY2FsbGJhY2ssDQogICAgdm9pZCAqYXJndW1lbnQpDQp7DQogICAgcmV0dXJuIENEQ0RTZXJpYWxfUmVhZChkYXRhLCBzaXplLCBjYWxsYmFjaywgYXJndW1lbnQpOw0KfQ0KDQovKioNCiAqIENvcHkgY3VycmVudCBsaW5lIGNvZGluZyBzZXR0aW5ncyB0byBwb2ludGVyZWQgc3BhY2UuDQogKiBccGFyYW0gcExpbmVDb2RpbmcgUG9pbnRlciB0byBDRENMaW5lQ29kaW5nIGluc3RhbmNlLg0KICovDQpzdGF0aWMgaW5saW5lIHZvaWQgQ0RDRFNlcmlhbERyaXZlcl9HZXRMaW5lQ29kaW5nKENEQ0xpbmVDb2RpbmcgKiBwTGluZUNvZGluZykNCnsNCiAgICBDRENEU2VyaWFsX0dldExpbmVDb2RpbmcocExpbmVDb2RpbmcpOw0KfQ0KDQovKioNCiAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29udHJvbCBsaW5lIHN0YXRlIG9mIHRoZSBSUy0yMzIgbGluZS4NCiAqLw0Kc3RhdGljIGlubGluZSB1aW50OF90IENEQ0RTZXJpYWxEcml2ZXJfR2V0Q29udHJvbExpbmVTdGF0ZSh2b2lkKQ0Kew0KICAgIHJldHVybiBDRENEU2VyaWFsX0dldENvbnRyb2xMaW5lU3RhdGUoKTsNCn0NCg0KLyoqDQogKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgUlMtMjMyIGxpbmUuDQogKi8NCnN0YXRpYyBpbmxpbmUgdWludDE2X3QgQ0RDRFNlcmlhbERyaXZlcl9HZXRTZXJpYWxTdGF0ZSh2b2lkKQ0Kew0KICAgIHJldHVybiBDRENEU2VyaWFsX0dldFNlcmlhbFN0YXRlKCk7DQp9DQoNCi8qKg0KICogU2V0cyB0aGUgY3VycmVudCBzZXJpYWwgc3RhdGUgb2YgdGhlIGRldmljZSB0byB0aGUgZ2l2ZW4gdmFsdWUuDQogKiBccGFyYW0gc2VyaWFsU3RhdGUgIE5ldyBkZXZpY2Ugc3RhdGUuDQogKi8NCnN0YXRpYyBpbmxpbmUgdm9pZCBDRENEU2VyaWFsRHJpdmVyX1NldFNlcmlhbFN0YXRlKHVpbnQxNl90IHNlcmlhbFN0YXRlKQ0Kew0KICAgIENEQ0RTZXJpYWxfU2V0U2VyaWFsU3RhdGUoc2VyaWFsU3RhdGUpOw0KfQ0KDQovKipAfSovDQoNCiNlbmRpZiAvKiNpZm5kZWYgQ0RDU0VSSUFMRFJJVkVSX0gqLw0KDQo=