LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9mbGFzaC5jDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAdmVyc2lvbiBWMy40LjANCiAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQogICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgRkxBU0ggZmlybXdhcmUgZnVuY3Rpb25zLg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAY29weQ0KICAqDQogICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQogICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCiAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQogICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCiAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQogICoNCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCiAgKi8gDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X2ZsYXNoLmgiDQoNCi8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRkxBU0ggDQogICogQGJyaWVmIEZMQVNIIGRyaXZlciBtb2R1bGVzDQogICogQHsNCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8gDQoNCi8qIEZsYXNoIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyIGJpdHMgKi8NCiNkZWZpbmUgQUNSX0xBVEVOQ1lfTWFzayAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAzOCkNCiNkZWZpbmUgQUNSX0hMRkNZQV9NYXNrICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkZGNykNCiNkZWZpbmUgQUNSX1BSRlRCRV9NYXNrICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkZFRikNCg0KLyogRmxhc2ggQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgYml0cyAqLw0KI2RlZmluZSBBQ1JfUFJGVEJTX01hc2sgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwKSANCg0KLyogRmxhc2ggQ29udHJvbCBSZWdpc3RlciBiaXRzICovDQojZGVmaW5lIENSX1BHX1NldCAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpDQojZGVmaW5lIENSX1BHX1Jlc2V0ICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDFGRkUpIA0KI2RlZmluZSBDUl9QRVJfU2V0ICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKQ0KI2RlZmluZSBDUl9QRVJfUmVzZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxRkZEKQ0KI2RlZmluZSBDUl9NRVJfU2V0ICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0KQ0KI2RlZmluZSBDUl9NRVJfUmVzZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxRkZCKQ0KI2RlZmluZSBDUl9PUFRQR19TZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKQ0KI2RlZmluZSBDUl9PUFRQR19SZXNldCAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxRkVGKQ0KI2RlZmluZSBDUl9PUFRFUl9TZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwKQ0KI2RlZmluZSBDUl9PUFRFUl9SZXNldCAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxRkRGKQ0KI2RlZmluZSBDUl9TVFJUX1NldCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwKQ0KI2RlZmluZSBDUl9MT0NLX1NldCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwKQ0KDQovKiBGTEFTSCBNYXNrICovDQojZGVmaW5lIFJEUFJUX01hc2sgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpDQojZGVmaW5lIFdSUDBfTWFzayAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwRkYpDQojZGVmaW5lIFdSUDFfTWFzayAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMEZGMDApDQojZGVmaW5lIFdSUDJfTWFzayAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDBGRjAwMDApDQojZGVmaW5lIFdSUDNfTWFzayAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4RkYwMDAwMDApDQojZGVmaW5lIE9CX1VTRVJfQkZCMiAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwOCkNCg0KLyogRkxBU0ggS2V5cyAqLw0KI2RlZmluZSBSRFBfS2V5ICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwQTUpDQojZGVmaW5lIEZMQVNIX0tFWTEgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4NDU2NzAxMjMpDQojZGVmaW5lIEZMQVNIX0tFWTIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4Q0RFRjg5QUIpDQoNCi8qIEZMQVNIIEJBTksgYWRkcmVzcyAqLw0KI2RlZmluZSBGTEFTSF9CQU5LMV9FTkRfQUREUkVTUyAgICgodWludDMyX3QpMHg4MDdGRkZGKQ0KDQovKiBEZWxheSBkZWZpbml0aW9uICovICAgDQojZGVmaW5lIEVyYXNlVGltZW91dCAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwQjAwMDApDQojZGVmaW5lIFByb2dyYW1UaW1lb3V0ICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDApDQovKioNCiAgKiBAfQ0KICAqLyANCg0KLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX01hY3Jvcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovIA0KDQovKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfVmFyaWFibGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KICANCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9GdW5jdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKioNCkBjb2RlICANCiANCiBUaGlzIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgdG8gY29uZmlndXJlIGFuZCBwcm9ncmFtIHRoZSBGbGFzaCBtZW1vcnkgb2YgYWxsIFNUTTMyRjEweCBkZXZpY2VzLA0KIGluY2x1ZGluZyB0aGUgbGF0ZXN0IFNUTTMyRjEweF9YTCBkZW5zaXR5IGRldmljZXMuIA0KDQogU1RNMzJGMTB4X1hMIGRldmljZXMgZmVhdHVyZSB1cCB0byAxIE1ieXRlIHdpdGggZHVhbCBiYW5rIGFyY2hpdGVjdHVyZSBmb3IgcmVhZC13aGlsZS13cml0ZSAoUldXKSBjYXBhYmlsaXR5Og0KICAgIC0gYmFuazE6IGZpeGVkIHNpemUgb2YgNTEyIEtieXRlcyAoMjU2IHBhZ2VzIG9mIDJLYnl0ZXMgZWFjaCkNCiAgICAtIGJhbmsyOiB1cCB0byA1MTIgS2J5dGVzICh1cCB0byAyNTYgcGFnZXMgb2YgMktieXRlcyBlYWNoKQ0KIFdoaWxlIG90aGVyIFNUTTMyRjEweCBkZXZpY2VzIGZlYXR1cmVzIG9ubHkgb25lIGJhbmsgd2l0aCBtZW1vcnkgdXAgdG8gNTEyIEtieXRlcy4NCg0KIEluIHZlcnNpb24gVjMuMy4wLCBzb21lIGZ1bmN0aW9ucyB3ZXJlIHVwZGF0ZWQgYW5kIG5ldyBvbmVzIHdlcmUgYWRkZWQgdG8gc3VwcG9ydA0KIFNUTTMyRjEweF9YTCBkZXZpY2VzLiBUaHVzIHNvbWUgZnVuY3Rpb25zIG1hbmFnZXMgYWxsIGRldmljZXMsIHdoaWxlIG90aGVyIGFyZSANCiBkZWRpY2F0ZWQgZm9yIFhMIGRldmljZXMgb25seS4NCiANCiBUaGUgdGFibGUgYmVsb3cgcHJlc2VudHMgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGZ1bmN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHVzZWQgU1RNMzJGMTB4IGRldmljZXMuICANCiAgICAgIA0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAqIExlZ2FjeSBmdW5jdGlvbnMgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzICoNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQogICB8ICAgICAgIEZ1bmN0aW9ucyBwcm90b3R5cGVzICAgICAgICAgfFNUTTMyRjEweF9YTHxPdGhlciBTVE0zMkYxMHh8ICAgIENvbW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgZGV2aWNlcyAgfCAgZGV2aWNlcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8RkxBU0hfU2V0TGF0ZW5jeSAgICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IE5vIGNoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX0hhbGZDeWNsZUFjY2Vzc0NtZCAgICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCBObyBjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCiAgIHxGTEFTSF9QcmVmZXRjaEJ1ZmZlckNtZCAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8RkxBU0hfVW5sb2NrICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gRm9yIFNUTTMyRjEwWF9YTCBkZXZpY2VzOiB1bmxvY2sgQmFuazEgYW5kIEJhbmsyLiAgICAgICAgICAgIHwNCiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgLSBGb3Igb3RoZXIgZGV2aWNlczogdW5sb2NrIEJhbmsxIGFuZCBpdCBpcyBlcXVpdmFsZW50ICAgICAgICAgfA0KICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgIHRvIEZMQVNIX1VubG9ja0JhbmsxIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCiAgIHxGTEFTSF9Mb2NrICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgLSBGb3IgU1RNMzJGMTBYX1hMIGRldmljZXM6IGxvY2sgQmFuazEgYW5kIEJhbmsyLiAgICAgICAgICAgICAgfA0KICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAtIEZvciBvdGhlciBkZXZpY2VzOiBsb2NrIEJhbmsxIGFuZCBpdCBpcyBlcXVpdmFsZW50ICAgICAgICAgICB8DQogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgdG8gRkxBU0hfTG9ja0JhbmsxIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX0VyYXNlUGFnZSAgICAgICAgICAgICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCAtIEZvciBTVE0zMkYxMHhfWEwgZGV2aWNlczogZXJhc2UgYSBwYWdlIGluIEJhbmsxIGFuZCBCYW5rMiAgICB8DQogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IC0gRm9yIG90aGVyIGRldmljZXM6IGVyYXNlIGEgcGFnZSBpbiBCYW5rMSAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX0VyYXNlQWxsUGFnZXMgICAgICAgICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCAtIEZvciBTVE0zMkYxMHhfWEwgZGV2aWNlczogZXJhc2UgYWxsIHBhZ2VzIGluIEJhbmsxIGFuZCBCYW5rMiB8DQogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IC0gRm9yIG90aGVyIGRldmljZXM6IGVyYXNlIGFsbCBwYWdlcyBpbiBCYW5rMSAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX0VyYXNlT3B0aW9uQnl0ZXMgICAgICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCBObyBjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCiAgIHxGTEFTSF9Qcm9ncmFtV29yZCAgICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgVXBkYXRlZCB0byBwcm9ncmFtIHVwIHRvIDFNQnl0ZSAoZGVwZW5kaW5nIG9uIHRoZSB1c2VkIGRldmljZSkgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8RkxBU0hfUHJvZ3JhbUhhbGZXb3JkICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IFVwZGF0ZWQgdG8gcHJvZ3JhbSB1cCB0byAxTUJ5dGUgKGRlcGVuZGluZyBvbiB0aGUgdXNlZCBkZXZpY2UpIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX1Byb2dyYW1PcHRpb25CeXRlRGF0YSAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCBObyBjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCiAgIHxGTEFTSF9FbmFibGVXcml0ZVByb3RlY3Rpb24gICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8RkxBU0hfUmVhZE91dFByb3RlY3Rpb24gICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IE5vIGNoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX1VzZXJPcHRpb25CeXRlQ29uZmlnICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCBObyBjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCiAgIHxGTEFTSF9HZXRVc2VyT3B0aW9uQnl0ZSAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8RkxBU0hfR2V0V3JpdGVQcm90ZWN0aW9uT3B0aW9uQnl0ZSAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IE5vIGNoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX0dldFJlYWRPdXRQcm90ZWN0aW9uU3RhdHVzICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCBObyBjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCiAgIHxGTEFTSF9HZXRQcmVmZXRjaEJ1ZmZlclN0YXR1cyAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8RkxBU0hfSVRDb25maWcgICAgICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gRm9yIFNUTTMyRjEweF9YTCBkZXZpY2VzOiBlbmFibGUgQmFuazEgYW5kIEJhbmsyJ3MgaW50ZXJydXB0c3wNCiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgLSBGb3Igb3RoZXIgZGV2aWNlczogZW5hYmxlIEJhbmsxJ3MgaW50ZXJydXB0cyAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8RkxBU0hfR2V0RmxhZ1N0YXR1cyAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gRm9yIFNUTTMyRjEweF9YTCBkZXZpY2VzOiByZXR1cm4gQmFuazEgYW5kIEJhbmsyJ3MgZmxhZyBzdGF0dXN8DQogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IC0gRm9yIG90aGVyIGRldmljZXM6IHJldHVybiBCYW5rMSdzIGZsYWcgc3RhdHVzICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX0NsZWFyRmxhZyAgICAgICAgICAgICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCAtIEZvciBTVE0zMkYxMHhfWEwgZGV2aWNlczogY2xlYXIgQmFuazEgYW5kIEJhbmsyJ3MgZmxhZyAgICAgICB8DQogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IC0gRm9yIG90aGVyIGRldmljZXM6IGNsZWFyIEJhbmsxJ3MgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX0dldFN0YXR1cyAgICAgICAgICAgICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCAtIFJldHVybiB0aGUgc3RhdHVzIG9mIEJhbmsxIChmb3IgYWxsIGRldmljZXMpICAgICAgICAgICAgICAgICB8DQogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgZXF1aXZhbGVudCB0byBGTEFTSF9HZXRCYW5rMVN0YXR1cyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCAtIFdhaXQgZm9yIEJhbmsxIGxhc3Qgb3BlcmF0aW9uIChmb3IgYWxsIGRldmljZXMpICAgICAgICAgICAgICB8DQogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgZXF1aXZhbGVudCB0bzogRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbiBmdW5jdGlvbiAgICAgIHwNCiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICogTmV3IGZ1bmN0aW9ucyB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMgdG8gbWFuYWdlIEJhbmsxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgKiAgIC0gVGhlc2UgZnVuY3Rpb25zIGFyZSBtYWlubHkgdXNlZnVsIGZvciBTVE0zMkYxMHhfWEwgZGVuc2l0eSBkZXZpY2VzLCB0byBoYXZlIHNlcGFyYXRlIGNvbnRyb2wgZm9yIEJhbmsxIGFuZCBiYW5rMiAqDQogICAqICAgLSBGb3Igb3RoZXIgZGV2aWNlcywgdGhlc2UgZnVuY3Rpb25zIGFyZSBvcHRpb25hbCAoY292ZXJlZCBieSBmdW5jdGlvbnMgbGlzdGVkIGFib3ZlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQogICB8ICAgICAgIEZ1bmN0aW9ucyBwcm90b3R5cGVzICAgICAgICAgfFNUTTMyRjEweF9YTHxPdGhlciBTVE0zMkYxMHh8ICAgIENvbW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgZGV2aWNlcyAgfCAgZGV2aWNlcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8IEZMQVNIX1VubG9ja0JhbmsxICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gVW5sb2NrIEJhbmsxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX0xvY2tCYW5rMSAgICAgICAgICAgICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCAtIExvY2sgQmFuazEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCiAgIHwgRkxBU0hfRXJhc2VBbGxCYW5rMVBhZ2VzICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgLSBFcmFzZSBhbGwgcGFnZXMgaW4gQmFuazEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8IEZMQVNIX0dldEJhbmsxU3RhdHVzICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gUmV0dXJuIHRoZSBzdGF0dXMgb2YgQmFuazEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfCBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uICAgIHwgICAgWWVzICAgICB8ICAgICAgWWVzICAgICAgfCAtIFdhaXQgZm9yIEJhbmsxIGxhc3Qgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCg0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICogTmV3IEZ1bmN0aW9ucyB1c2VkIG9ubHkgd2l0aCBTVE0zMkYxMHhfWEwgZGVuc2l0eSBkZXZpY2VzIHRvIG1hbmFnZSBCYW5rMiAqDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQogICB8ICAgICAgIEZ1bmN0aW9ucyBwcm90b3R5cGVzICAgICAgICAgfFNUTTMyRjEweF9YTHxPdGhlciBTVE0zMkYxMHh8ICAgIENvbW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgZGV2aWNlcyAgfCAgZGV2aWNlcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8IEZMQVNIX1VubG9ja0JhbmsyICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBObyAgICAgICB8IC0gVW5sb2NrIEJhbmsyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfEZMQVNIX0xvY2tCYW5rMiAgICAgICAgICAgICAgICAgICAgIHwgICAgWWVzICAgICB8ICAgICAgTm8gICAgICAgfCAtIExvY2sgQmFuazIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCiAgIHwgRkxBU0hfRXJhc2VBbGxCYW5rMlBhZ2VzICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIE5vICAgICAgIHwgLSBFcmFzZSBhbGwgcGFnZXMgaW4gQmFuazIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQogICB8IEZMQVNIX0dldEJhbmsyU3RhdHVzICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBObyAgICAgICB8IC0gUmV0dXJuIHRoZSBzdGF0dXMgb2YgQmFuazIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KICAgfCBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uICAgIHwgICAgWWVzICAgICB8ICAgICAgTm8gICAgICAgfCAtIFdhaXQgZm9yIEJhbmsyIGxhc3Qgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCiAgIHwgRkxBU0hfQm9vdENvbmZpZyAgICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIE5vICAgICAgIHwgLSBDb25maWd1cmUgdG8gYm9vdCBmcm9tIEJhbmsxIG9yIEJhbmsyICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQpAZW5kY29kZQ0KKi8NCg0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIGNvZGUgbGF0ZW5jeSB2YWx1ZS4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCiAgKiBAcGFyYW0gIEZMQVNIX0xhdGVuY3k6IHNwZWNpZmllcyB0aGUgRkxBU0ggTGF0ZW5jeSB2YWx1ZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRkxBU0hfTGF0ZW5jeV8wOiBGTEFTSCBaZXJvIExhdGVuY3kgY3ljbGUNCiAgKiAgICAgQGFyZyBGTEFTSF9MYXRlbmN5XzE6IEZMQVNIIE9uZSBMYXRlbmN5IGN5Y2xlDQogICogICAgIEBhcmcgRkxBU0hfTGF0ZW5jeV8yOiBGTEFTSCBUd28gTGF0ZW5jeSBjeWNsZXMNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgRkxBU0hfU2V0TGF0ZW5jeSh1aW50MzJfdCBGTEFTSF9MYXRlbmN5KQ0Kew0KICB1aW50MzJfdCB0bXByZWcgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0xBVEVOQ1koRkxBU0hfTGF0ZW5jeSkpOw0KICANCiAgLyogUmVhZCB0aGUgQUNSIHJlZ2lzdGVyICovDQogIHRtcHJlZyA9IEZMQVNILT5BQ1I7ICANCiAgDQogIC8qIFNldHMgdGhlIExhdGVuY3kgdmFsdWUgKi8NCiAgdG1wcmVnICY9IEFDUl9MQVRFTkNZX01hc2s7DQogIHRtcHJlZyB8PSBGTEFTSF9MYXRlbmN5Ow0KICANCiAgLyogV3JpdGUgdGhlIEFDUiByZWdpc3RlciAqLw0KICBGTEFTSC0+QUNSID0gdG1wcmVnOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEhhbGYgY3ljbGUgZmxhc2ggYWNjZXNzLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KICAqIEBwYXJhbSAgRkxBU0hfSGFsZkN5Y2xlQWNjZXNzOiBzcGVjaWZpZXMgdGhlIEZMQVNIIEhhbGYgY3ljbGUgQWNjZXNzIG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEZMQVNIX0hhbGZDeWNsZUFjY2Vzc19FbmFibGU6IEZMQVNIIEhhbGYgQ3ljbGUgRW5hYmxlDQogICogICAgIEBhcmcgRkxBU0hfSGFsZkN5Y2xlQWNjZXNzX0Rpc2FibGU6IEZMQVNIIEhhbGYgQ3ljbGUgRGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGTEFTSF9IYWxmQ3ljbGVBY2Nlc3NDbWQodWludDMyX3QgRkxBU0hfSGFsZkN5Y2xlQWNjZXNzKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfSEFMRkNZQ0xFQUNDRVNTX1NUQVRFKEZMQVNIX0hhbGZDeWNsZUFjY2VzcykpOw0KICANCiAgLyogRW5hYmxlIG9yIGRpc2FibGUgdGhlIEhhbGYgY3ljbGUgYWNjZXNzICovDQogIEZMQVNILT5BQ1IgJj0gQUNSX0hMRkNZQV9NYXNrOw0KICBGTEFTSC0+QUNSIHw9IEZMQVNIX0hhbGZDeWNsZUFjY2VzczsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBQcmVmZXRjaCBCdWZmZXIuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQogICogQHBhcmFtICBGTEFTSF9QcmVmZXRjaEJ1ZmZlcjogc3BlY2lmaWVzIHRoZSBQcmVmZXRjaCBidWZmZXIgc3RhdHVzLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBGTEFTSF9QcmVmZXRjaEJ1ZmZlcl9FbmFibGU6IEZMQVNIIFByZWZldGNoIEJ1ZmZlciBFbmFibGUNCiAgKiAgICAgQGFyZyBGTEFTSF9QcmVmZXRjaEJ1ZmZlcl9EaXNhYmxlOiBGTEFTSCBQcmVmZXRjaCBCdWZmZXIgRGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGTEFTSF9QcmVmZXRjaEJ1ZmZlckNtZCh1aW50MzJfdCBGTEFTSF9QcmVmZXRjaEJ1ZmZlcikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BSRUZFVENIQlVGRkVSX1NUQVRFKEZMQVNIX1ByZWZldGNoQnVmZmVyKSk7DQogIA0KICAvKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgUHJlZmV0Y2ggQnVmZmVyICovDQogIEZMQVNILT5BQ1IgJj0gQUNSX1BSRlRCRV9NYXNrOw0KICBGTEFTSC0+QUNSIHw9IEZMQVNIX1ByZWZldGNoQnVmZmVyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFVubG9ja3MgdGhlIEZMQVNIIFByb2dyYW0gRXJhc2UgQ29udHJvbGxlci4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCiAgKiAgICAgICAgIC0gRm9yIFNUTTMyRjEwWF9YTCBkZXZpY2VzIHRoaXMgZnVuY3Rpb24gdW5sb2NrcyBCYW5rMSBhbmQgQmFuazIuDQogICogICAgICAgICAtIEZvciBhbGwgb3RoZXIgZGV2aWNlcyBpdCB1bmxvY2tzIEJhbmsxIGFuZCBpdCBpcyBlcXVpdmFsZW50IA0KICAqICAgICAgICAgICB0byBGTEFTSF9VbmxvY2tCYW5rMSBmdW5jdGlvbi4uIA0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGTEFTSF9VbmxvY2sodm9pZCkNCnsNCiAgLyogQXV0aG9yaXplIHRoZSBGUEVDIG9mIEJhbmsxIEFjY2VzcyAqLw0KICBGTEFTSC0+S0VZUiA9IEZMQVNIX0tFWTE7DQogIEZMQVNILT5LRVlSID0gRkxBU0hfS0VZMjsNCg0KI2lmZGVmIFNUTTMyRjEwWF9YTA0KICAvKiBBdXRob3JpemUgdGhlIEZQRUMgb2YgQmFuazIgQWNjZXNzICovDQogIEZMQVNILT5LRVlSMiA9IEZMQVNIX0tFWTE7DQogIEZMQVNILT5LRVlSMiA9IEZMQVNIX0tFWTI7DQojZW5kaWYgLyogU1RNMzJGMTBYX1hMICovDQp9DQovKioNCiAgKiBAYnJpZWYgIFVubG9ja3MgdGhlIEZMQVNIIEJhbmsxIFByb2dyYW0gRXJhc2UgQ29udHJvbGxlci4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCiAgKiAgICAgICAgIC0gRm9yIFNUTTMyRjEwWF9YTCBkZXZpY2VzIHRoaXMgZnVuY3Rpb24gdW5sb2NrcyBCYW5rMS4NCiAgKiAgICAgICAgIC0gRm9yIGFsbCBvdGhlciBkZXZpY2VzIGl0IHVubG9ja3MgQmFuazEgYW5kIGl0IGlzIA0KICAqICAgICAgICAgICBlcXVpdmFsZW50IHRvIEZMQVNIX1VubG9jayBmdW5jdGlvbi4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgRkxBU0hfVW5sb2NrQmFuazEodm9pZCkNCnsNCiAgLyogQXV0aG9yaXplIHRoZSBGUEVDIG9mIEJhbmsxIEFjY2VzcyAqLw0KICBGTEFTSC0+S0VZUiA9IEZMQVNIX0tFWTE7DQogIEZMQVNILT5LRVlSID0gRkxBU0hfS0VZMjsNCn0NCg0KI2lmZGVmIFNUTTMyRjEwWF9YTA0KLyoqDQogICogQGJyaWVmICBVbmxvY2tzIHRoZSBGTEFTSCBCYW5rMiBQcm9ncmFtIEVyYXNlIENvbnRyb2xsZXIuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgZm9yIFNUTTMyRjEwWF9YTCBkZW5zaXR5IGRldmljZXMuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEZMQVNIX1VubG9ja0JhbmsyKHZvaWQpDQp7DQogIC8qIEF1dGhvcml6ZSB0aGUgRlBFQyBvZiBCYW5rMiBBY2Nlc3MgKi8NCiAgRkxBU0gtPktFWVIyID0gRkxBU0hfS0VZMTsNCiAgRkxBU0gtPktFWVIyID0gRkxBU0hfS0VZMjsNCg0KfQ0KI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KDQovKioNCiAgKiBAYnJpZWYgIExvY2tzIHRoZSBGTEFTSCBQcm9ncmFtIEVyYXNlIENvbnRyb2xsZXIuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQogICogICAgICAgICAtIEZvciBTVE0zMkYxMFhfWEwgZGV2aWNlcyB0aGlzIGZ1bmN0aW9uIExvY2tzIEJhbmsxIGFuZCBCYW5rMi4NCiAgKiAgICAgICAgIC0gRm9yIGFsbCBvdGhlciBkZXZpY2VzIGl0IExvY2tzIEJhbmsxIGFuZCBpdCBpcyBlcXVpdmFsZW50IA0KICAqICAgICAgICAgICB0byBGTEFTSF9Mb2NrQmFuazEgZnVuY3Rpb24uDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEZMQVNIX0xvY2sodm9pZCkNCnsNCiAgLyogU2V0IHRoZSBMb2NrIEJpdCB0byBsb2NrIHRoZSBGUEVDIGFuZCB0aGUgQ1Igb2YgIEJhbmsxICovDQogIEZMQVNILT5DUiB8PSBDUl9MT0NLX1NldDsNCg0KI2lmZGVmIFNUTTMyRjEwWF9YTA0KICAvKiBTZXQgdGhlIExvY2sgQml0IHRvIGxvY2sgdGhlIEZQRUMgYW5kIHRoZSBDUiBvZiAgQmFuazIgKi8NCiAgRkxBU0gtPkNSMiB8PSBDUl9MT0NLX1NldDsNCiNlbmRpZiAvKiBTVE0zMkYxMFhfWEwgKi8NCn0NCg0KLyoqDQogICogQGJyaWVmICBMb2NrcyB0aGUgRkxBU0ggQmFuazEgUHJvZ3JhbSBFcmFzZSBDb250cm9sbGVyLg0KICAqIEBub3RlICAgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KICAqICAgICAgICAgLSBGb3IgU1RNMzJGMTBYX1hMIGRldmljZXMgdGhpcyBmdW5jdGlvbiBMb2NrcyBCYW5rMS4NCiAgKiAgICAgICAgIC0gRm9yIGFsbCBvdGhlciBkZXZpY2VzIGl0IExvY2tzIEJhbmsxIGFuZCBpdCBpcyBlcXVpdmFsZW50IA0KICAqICAgICAgICAgICB0byBGTEFTSF9Mb2NrIGZ1bmN0aW9uLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGTEFTSF9Mb2NrQmFuazEodm9pZCkNCnsNCiAgLyogU2V0IHRoZSBMb2NrIEJpdCB0byBsb2NrIHRoZSBGUEVDIGFuZCB0aGUgQ1Igb2YgIEJhbmsxICovDQogIEZMQVNILT5DUiB8PSBDUl9MT0NLX1NldDsNCn0NCg0KI2lmZGVmIFNUTTMyRjEwWF9YTA0KLyoqDQogICogQGJyaWVmICBMb2NrcyB0aGUgRkxBU0ggQmFuazIgUHJvZ3JhbSBFcmFzZSBDb250cm9sbGVyLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBvbmx5IGZvciBTVE0zMkYxMFhfWEwgZGVuc2l0eSBkZXZpY2VzLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGTEFTSF9Mb2NrQmFuazIodm9pZCkNCnsNCiAgLyogU2V0IHRoZSBMb2NrIEJpdCB0byBsb2NrIHRoZSBGUEVDIGFuZCB0aGUgQ1Igb2YgIEJhbmsyICovDQogIEZMQVNILT5DUjIgfD0gQ1JfTE9DS19TZXQ7DQp9DQojZW5kaWYgLyogU1RNMzJGMTBYX1hMICovDQoNCi8qKg0KICAqIEBicmllZiAgRXJhc2VzIGEgc3BlY2lmaWVkIEZMQVNIIHBhZ2UuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQogICogQHBhcmFtICBQYWdlX0FkZHJlc3M6IFRoZSBwYWdlIGFkZHJlc3MgdG8gYmUgZXJhc2VkLg0KICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9CVVNZLCBGTEFTSF9FUlJPUl9QRywNCiAgKiAgIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4NCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9FcmFzZVBhZ2UodWludDMyX3QgUGFnZV9BZGRyZXNzKQ0Kew0KICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9BRERSRVNTKFBhZ2VfQWRkcmVzcykpOw0KDQojaWZkZWYgU1RNMzJGMTBYX1hMDQogIGlmKFBhZ2VfQWRkcmVzcyA8IEZMQVNIX0JBTksxX0VORF9BRERSRVNTKSAgDQogIHsNCiAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogICAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICAgIHsgDQogICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSB0aGUgcGFnZSAqLw0KICAgICAgRkxBU0gtPkNSfD0gQ1JfUEVSX1NldDsNCiAgICAgIEZMQVNILT5BUiA9IFBhZ2VfQWRkcmVzczsgDQogICAgICBGTEFTSC0+Q1J8PSBDUl9TVFJUX1NldDsNCiAgICANCiAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KDQogICAgICAvKiBEaXNhYmxlIHRoZSBQRVIgQml0ICovDQogICAgICBGTEFTSC0+Q1IgJj0gQ1JfUEVSX1Jlc2V0Ow0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogICAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICAgIHsgDQogICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSB0aGUgcGFnZSAqLw0KICAgICAgRkxBU0gtPkNSMnw9IENSX1BFUl9TZXQ7DQogICAgICBGTEFTSC0+QVIyID0gUGFnZV9BZGRyZXNzOyANCiAgICAgIEZMQVNILT5DUjJ8PSBDUl9TVFJUX1NldDsNCiAgICANCiAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KICAgICAgDQogICAgICAvKiBEaXNhYmxlIHRoZSBQRVIgQml0ICovDQogICAgICBGTEFTSC0+Q1IyICY9IENSX1BFUl9SZXNldDsNCiAgICB9DQogIH0NCiNlbHNlDQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KICANCiAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICB7IA0KICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIGVyYXNlIHRoZSBwYWdlICovDQogICAgRkxBU0gtPkNSfD0gQ1JfUEVSX1NldDsNCiAgICBGTEFTSC0+QVIgPSBQYWdlX0FkZHJlc3M7IA0KICAgIEZMQVNILT5DUnw9IENSX1NUUlRfU2V0Ow0KICAgIA0KICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogICAgDQogICAgLyogRGlzYWJsZSB0aGUgUEVSIEJpdCAqLw0KICAgIEZMQVNILT5DUiAmPSBDUl9QRVJfUmVzZXQ7DQogIH0NCiNlbmRpZiAvKiBTVE0zMkYxMFhfWEwgKi8NCg0KICAvKiBSZXR1cm4gdGhlIEVyYXNlIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVyYXNlcyBhbGwgRkxBU0ggcGFnZXMuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLA0KICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULg0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX0VyYXNlQWxsUGFnZXModm9pZCkNCnsNCiAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KDQojaWZkZWYgU1RNMzJGMTBYX1hMDQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogIA0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSBhbGwgcGFnZXMgKi8NCiAgICAgRkxBU0gtPkNSIHw9IENSX01FUl9TZXQ7DQogICAgIEZMQVNILT5DUiB8PSBDUl9TVFJUX1NldDsNCiAgICANCiAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogICAgDQogICAgLyogRGlzYWJsZSB0aGUgTUVSIEJpdCAqLw0KICAgIEZMQVNILT5DUiAmPSBDUl9NRVJfUmVzZXQ7DQogIH0gICAgDQogIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCiAgew0KICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIGVyYXNlIGFsbCBwYWdlcyAqLw0KICAgICBGTEFTSC0+Q1IyIHw9IENSX01FUl9TZXQ7DQogICAgIEZMQVNILT5DUjIgfD0gQ1JfU1RSVF9TZXQ7DQogICAgDQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KICAgIA0KICAgIC8qIERpc2FibGUgdGhlIE1FUiBCaXQgKi8NCiAgICBGTEFTSC0+Q1IyICY9IENSX01FUl9SZXNldDsNCiAgfQ0KI2Vsc2UNCiAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCiAgew0KICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIGVyYXNlIGFsbCBwYWdlcyAqLw0KICAgICBGTEFTSC0+Q1IgfD0gQ1JfTUVSX1NldDsNCiAgICAgRkxBU0gtPkNSIHw9IENSX1NUUlRfU2V0Ow0KICAgIA0KICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQoNCiAgICAvKiBEaXNhYmxlIHRoZSBNRVIgQml0ICovDQogICAgRkxBU0gtPkNSICY9IENSX01FUl9SZXNldDsNCiAgfQ0KI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KDQogIC8qIFJldHVybiB0aGUgRXJhc2UgU3RhdHVzICovDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRXJhc2VzIGFsbCBCYW5rMSBGTEFTSCBwYWdlcy4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCiAgKiAgICAgICAgIC0gRm9yIFNUTTMyRjEwWF9YTCBkZXZpY2VzIHRoaXMgZnVuY3Rpb24gZXJhc2VzIGFsbCBCYW5rMSBwYWdlcy4NCiAgKiAgICAgICAgIC0gRm9yIGFsbCBvdGhlciBkZXZpY2VzIGl0IGVyYXNlcyBhbGwgQmFuazEgcGFnZXMgYW5kIGl0IGlzIGVxdWl2YWxlbnQgDQogICogICAgICAgICAgIHRvIEZMQVNIX0VyYXNlQWxsUGFnZXMgZnVuY3Rpb24uDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLA0KICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULg0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX0VyYXNlQWxsQmFuazFQYWdlcyh2b2lkKQ0Kew0KICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogIA0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSBhbGwgcGFnZXMgKi8NCiAgICAgRkxBU0gtPkNSIHw9IENSX01FUl9TZXQ7DQogICAgIEZMQVNILT5DUiB8PSBDUl9TVFJUX1NldDsNCiAgICANCiAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogICAgDQogICAgLyogRGlzYWJsZSB0aGUgTUVSIEJpdCAqLw0KICAgIEZMQVNILT5DUiAmPSBDUl9NRVJfUmVzZXQ7DQogIH0gICAgDQogIC8qIFJldHVybiB0aGUgRXJhc2UgU3RhdHVzICovDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCiNpZmRlZiBTVE0zMkYxMFhfWEwNCi8qKg0KICAqIEBicmllZiAgRXJhc2VzIGFsbCBCYW5rMiBGTEFTSCBwYWdlcy4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgb25seSBmb3IgU1RNMzJGMTB4X1hMIGRlbnNpdHkgZGV2aWNlcy4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsDQogICogICBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIEZMQVNIX1RJTUVPVVQuDQogICovDQpGTEFTSF9TdGF0dXMgRkxBU0hfRXJhc2VBbGxCYW5rMlBhZ2VzKHZvaWQpDQp7DQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0QmFuazJPcGVyYXRpb24oRXJhc2VUaW1lb3V0KTsNCiAgDQogIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCiAgew0KICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIGVyYXNlIGFsbCBwYWdlcyAqLw0KICAgICBGTEFTSC0+Q1IyIHw9IENSX01FUl9TZXQ7DQogICAgIEZMQVNILT5DUjIgfD0gQ1JfU1RSVF9TZXQ7DQogICAgDQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KDQogICAgLyogRGlzYWJsZSB0aGUgTUVSIEJpdCAqLw0KICAgIEZMQVNILT5DUjIgJj0gQ1JfTUVSX1Jlc2V0Ow0KICB9ICAgIA0KICAvKiBSZXR1cm4gdGhlIEVyYXNlIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOw0KfQ0KI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KDQovKioNCiAgKiBAYnJpZWYgIEVyYXNlcyB0aGUgRkxBU0ggb3B0aW9uIGJ5dGVzLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbnMgZXJhc2VzIGFsbCBvcHRpb24gYnl0ZXMgZXhjZXB0IHRoZSBSZWFkIHByb3RlY3Rpb24gKFJEUCkuIA0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9FUlJPUl9QRywNCiAgKiAgIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4NCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9FcmFzZU9wdGlvbkJ5dGVzKHZvaWQpDQp7DQogIHVpbnQxNl90IHJkcHRtcCA9IFJEUF9LZXk7DQoNCiAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KDQogIC8qIEdldCB0aGUgYWN0dWFsIHJlYWQgcHJvdGVjdGlvbiBPcHRpb24gQnl0ZSB2YWx1ZSAqLyANCiAgaWYoRkxBU0hfR2V0UmVhZE91dFByb3RlY3Rpb25TdGF0dXMoKSAhPSBSRVNFVCkNCiAgew0KICAgIHJkcHRtcCA9IDB4MDA7ICANCiAgfQ0KDQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBBdXRob3JpemUgdGhlIHNtYWxsIGluZm9ybWF0aW9uIGJsb2NrIHByb2dyYW1taW5nICovDQogICAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkxOw0KICAgIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMjsNCiAgICANCiAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSB0aGUgb3B0aW9uIGJ5dGVzICovDQogICAgRkxBU0gtPkNSIHw9IENSX09QVEVSX1NldDsNCiAgICBGTEFTSC0+Q1IgfD0gQ1JfU1RSVF9TZXQ7DQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRXJhc2VUaW1lb3V0KTsNCiAgICANCiAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogICAgew0KICAgICAgLyogaWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVEVSIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX09QVEVSX1Jlc2V0Ow0KICAgICAgIA0KICAgICAgLyogRW5hYmxlIHRoZSBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uICovDQogICAgICBGTEFTSC0+Q1IgfD0gQ1JfT1BUUEdfU2V0Ow0KICAgICAgLyogUmVzdG9yZSB0aGUgbGFzdCByZWFkIHByb3RlY3Rpb24gT3B0aW9uIEJ5dGUgdmFsdWUgKi8NCiAgICAgIE9CLT5SRFAgPSAodWludDE2X3QpcmRwdG1wOyANCiAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KIA0KICAgICAgaWYoc3RhdHVzICE9IEZMQVNIX1RJTUVPVVQpDQogICAgICB7DQogICAgICAgIC8qIGlmIHRoZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVFBHIEJpdCAqLw0KICAgICAgICBGTEFTSC0+Q1IgJj0gQ1JfT1BUUEdfUmVzZXQ7DQogICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBpZiAoc3RhdHVzICE9IEZMQVNIX1RJTUVPVVQpDQogICAgICB7DQogICAgICAgIC8qIERpc2FibGUgdGhlIE9QVFBHIEJpdCAqLw0KICAgICAgICBGTEFTSC0+Q1IgJj0gQ1JfT1BUUEdfUmVzZXQ7DQogICAgICB9DQogICAgfSAgDQogIH0NCiAgLyogUmV0dXJuIHRoZSBlcmFzZSBzdGF0dXMgKi8NCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBQcm9ncmFtcyBhIHdvcmQgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCiAgKiBAcGFyYW0gIEFkZHJlc3M6IHNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLg0KICAqIEBwYXJhbSAgRGF0YTogc3BlY2lmaWVzIHRoZSBkYXRhIHRvIGJlIHByb2dyYW1tZWQuDQogICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLA0KICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULiANCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9Qcm9ncmFtV29yZCh1aW50MzJfdCBBZGRyZXNzLCB1aW50MzJfdCBEYXRhKQ0Kew0KICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQogIF9fSU8gdWludDMyX3QgdG1wID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQUREUkVTUyhBZGRyZXNzKSk7DQoNCiNpZmRlZiBTVE0zMkYxMFhfWEwNCiAgaWYoQWRkcmVzcyA8IEZMQVNIX0JBTksxX0VORF9BRERSRVNTIC0gMikNCiAgeyANCiAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsgDQogICAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICAgIHsNCiAgICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBmaXJzdCANCiAgICAgICAgaGFsZiB3b3JkICovDQogICAgICBGTEFTSC0+Q1IgfD0gQ1JfUEdfU2V0Ow0KICANCiAgICAgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9ICh1aW50MTZfdClEYXRhOw0KICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogDQogICAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogICAgICB7DQogICAgICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBzZWNvbmQgDQogICAgICAgIGhhbGYgd29yZCAqLw0KICAgICAgICB0bXAgPSBBZGRyZXNzICsgMjsNCg0KICAgICAgICAqKF9fSU8gdWludDE2X3QqKSB0bXAgPSBEYXRhID4+IDE2Ow0KICAgIA0KICAgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICAgICAgICANCiAgICAgICAgLyogRGlzYWJsZSB0aGUgUEcgQml0ICovDQogICAgICAgIEZMQVNILT5DUiAmPSBDUl9QR19SZXNldDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgLyogRGlzYWJsZSB0aGUgUEcgQml0ICovDQogICAgICAgIEZMQVNILT5DUiAmPSBDUl9QR19SZXNldDsNCiAgICAgICB9DQogICAgfQ0KICB9DQogIGVsc2UgaWYoQWRkcmVzcyA9PSAoRkxBU0hfQkFOSzFfRU5EX0FERFJFU1MgLSAxKSkNCiAgew0KICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0QmFuazFPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KDQogICAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICAgIHsNCiAgICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBmaXJzdCANCiAgICAgICAgaGFsZiB3b3JkICovDQogICAgICBGTEFTSC0+Q1IgfD0gQ1JfUEdfU2V0Ow0KICANCiAgICAgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9ICh1aW50MTZfdClEYXRhOw0KDQogICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0QmFuazFPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICAgICAgDQoJICAvKiBEaXNhYmxlIHRoZSBQRyBCaXQgKi8NCiAgICAgIEZMQVNILT5DUiAmPSBDUl9QR19SZXNldDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX1BHX1Jlc2V0Ow0KICAgIH0NCg0KICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0QmFuazJPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KDQogICAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICAgIHsNCiAgICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBzZWNvbmQgDQogICAgICBoYWxmIHdvcmQgKi8NCiAgICAgIEZMQVNILT5DUjIgfD0gQ1JfUEdfU2V0Ow0KICAgICAgdG1wID0gQWRkcmVzcyArIDI7DQoNCiAgICAgICooX19JTyB1aW50MTZfdCopIHRtcCA9IERhdGEgPj4gMTY7DQogICAgDQogICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0QmFuazJPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICAgICAgICANCiAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSMiAmPSBDUl9QR19SZXNldDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSMiAmPSBDUl9QR19SZXNldDsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQoNCiAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogICAgew0KICAgICAgLyogaWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gcHJvZ3JhbSB0aGUgbmV3IGZpcnN0IA0KICAgICAgICBoYWxmIHdvcmQgKi8NCiAgICAgIEZMQVNILT5DUjIgfD0gQ1JfUEdfU2V0Ow0KICANCiAgICAgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9ICh1aW50MTZfdClEYXRhOw0KICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiANCiAgICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCiAgICAgIHsNCiAgICAgICAgLyogaWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gcHJvZ3JhbSB0aGUgbmV3IHNlY29uZCANCiAgICAgICAgaGFsZiB3b3JkICovDQogICAgICAgIHRtcCA9IEFkZHJlc3MgKyAyOw0KDQogICAgICAgICooX19JTyB1aW50MTZfdCopIHRtcCA9IERhdGEgPj4gMTY7DQogICAgDQogICAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiAgICAgICAgDQogICAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KICAgICAgICBGTEFTSC0+Q1IyICY9IENSX1BHX1Jlc2V0Ow0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICAvKiBEaXNhYmxlIHRoZSBQRyBCaXQgKi8NCiAgICAgICAgRkxBU0gtPkNSMiAmPSBDUl9QR19SZXNldDsNCiAgICAgIH0NCiAgICB9DQogIH0NCiNlbHNlDQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogIA0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgZmlyc3QgDQogICAgaGFsZiB3b3JkICovDQogICAgRkxBU0gtPkNSIHw9IENSX1BHX1NldDsNCiAgDQogICAgKihfX0lPIHVpbnQxNl90KilBZGRyZXNzID0gKHVpbnQxNl90KURhdGE7DQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KIA0KICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCiAgICB7DQogICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgc2Vjb25kIA0KICAgICAgaGFsZiB3b3JkICovDQogICAgICB0bXAgPSBBZGRyZXNzICsgMjsNCg0KICAgICAgKihfX0lPIHVpbnQxNl90KikgdG1wID0gRGF0YSA+PiAxNjsNCiAgICANCiAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICAgICAgICANCiAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX1BHX1Jlc2V0Ow0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgLyogRGlzYWJsZSB0aGUgUEcgQml0ICovDQogICAgICBGTEFTSC0+Q1IgJj0gQ1JfUEdfUmVzZXQ7DQogICAgfQ0KICB9ICAgICAgICAgDQojZW5kaWYgLyogU1RNMzJGMTBYX1hMICovDQogICANCiAgLyogUmV0dXJuIHRoZSBQcm9ncmFtIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFByb2dyYW1zIGEgaGFsZiB3b3JkIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQogICogQHBhcmFtICBBZGRyZXNzOiBzcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4NCiAgKiBAcGFyYW0gIERhdGE6IHNwZWNpZmllcyB0aGUgZGF0YSB0byBiZSBwcm9ncmFtbWVkLg0KICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9FUlJPUl9QRywNCiAgKiAgIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4gDQogICovDQpGTEFTSF9TdGF0dXMgRkxBU0hfUHJvZ3JhbUhhbGZXb3JkKHVpbnQzMl90IEFkZHJlc3MsIHVpbnQxNl90IERhdGEpDQp7DQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0FERFJFU1MoQWRkcmVzcykpOw0KDQojaWZkZWYgU1RNMzJGMTBYX1hMDQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogIA0KICBpZihBZGRyZXNzIDwgRkxBU0hfQkFOSzFfRU5EX0FERFJFU1MpDQogIHsNCiAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogICAgew0KICAgICAgLyogaWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gcHJvZ3JhbSB0aGUgbmV3IGRhdGEgKi8NCiAgICAgIEZMQVNILT5DUiB8PSBDUl9QR19TZXQ7DQogIA0KICAgICAgKihfX0lPIHVpbnQxNl90KilBZGRyZXNzID0gRGF0YTsNCiAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQoNCiAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX1BHX1Jlc2V0Ow0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogICAgew0KICAgICAgLyogaWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gcHJvZ3JhbSB0aGUgbmV3IGRhdGEgKi8NCiAgICAgIEZMQVNILT5DUjIgfD0gQ1JfUEdfU2V0Ow0KICANCiAgICAgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9IERhdGE7DQogICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0QmFuazJPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KDQogICAgICAvKiBEaXNhYmxlIHRoZSBQRyBCaXQgKi8NCiAgICAgIEZMQVNILT5DUjIgJj0gQ1JfUEdfUmVzZXQ7DQogICAgfQ0KICB9DQojZWxzZQ0KICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICANCiAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICB7DQogICAgLyogaWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gcHJvZ3JhbSB0aGUgbmV3IGRhdGEgKi8NCiAgICBGTEFTSC0+Q1IgfD0gQ1JfUEdfU2V0Ow0KICANCiAgICAqKF9fSU8gdWludDE2X3QqKUFkZHJlc3MgPSBEYXRhOw0KICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiAgICANCiAgICAvKiBEaXNhYmxlIHRoZSBQRyBCaXQgKi8NCiAgICBGTEFTSC0+Q1IgJj0gQ1JfUEdfUmVzZXQ7DQogIH0gDQojZW5kaWYgIC8qIFNUTTMyRjEwWF9YTCAqLw0KICANCiAgLyogUmV0dXJuIHRoZSBQcm9ncmFtIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFByb2dyYW1zIGEgaGFsZiB3b3JkIGF0IGEgc3BlY2lmaWVkIE9wdGlvbiBCeXRlIERhdGEgYWRkcmVzcy4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCiAgKiBAcGFyYW0gIEFkZHJlc3M6IHNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIDB4MUZGRkY4MDQgb3IgMHgxRkZGRjgwNi4gDQogICogQHBhcmFtICBEYXRhOiBzcGVjaWZpZXMgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZC4NCiAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsDQogICogICBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIEZMQVNIX1RJTUVPVVQuIA0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX1Byb2dyYW1PcHRpb25CeXRlRGF0YSh1aW50MzJfdCBBZGRyZXNzLCB1aW50OF90IERhdGEpDQp7DQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX09CX0RBVEFfQUREUkVTUyhBZGRyZXNzKSk7DQogIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCg0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBBdXRob3JpemUgdGhlIHNtYWxsIGluZm9ybWF0aW9uIGJsb2NrIHByb2dyYW1taW5nICovDQogICAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkxOw0KICAgIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMjsNCiAgICAvKiBFbmFibGVzIHRoZSBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uICovDQogICAgRkxBU0gtPkNSIHw9IENSX09QVFBHX1NldDsgDQogICAgKihfX0lPIHVpbnQxNl90KilBZGRyZXNzID0gRGF0YTsNCiAgICANCiAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogICAgaWYoc3RhdHVzICE9IEZMQVNIX1RJTUVPVVQpDQogICAgew0KICAgICAgLyogaWYgdGhlIHByb2dyYW0gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgT1BUUEcgQml0ICovDQogICAgICBGTEFTSC0+Q1IgJj0gQ1JfT1BUUEdfUmVzZXQ7DQogICAgfQ0KICB9DQogIC8qIFJldHVybiB0aGUgT3B0aW9uIEJ5dGUgRGF0YSBQcm9ncmFtIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFdyaXRlIHByb3RlY3RzIHRoZSBkZXNpcmVkIHBhZ2VzDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQogICogQHBhcmFtICBGTEFTSF9QYWdlczogc3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBwYWdlcyB0byBiZSB3cml0ZSBwcm90ZWN0ZWQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6DQogICogICAgIEBhcmcgRm9yIEBiIFNUTTMyX0xvdy1kZW5zaXR5X2RldmljZXM6IHZhbHVlIGJldHdlZW4gRkxBU0hfV1JQcm90X1BhZ2VzMHRvMyBhbmQgRkxBU0hfV1JQcm90X1BhZ2VzMjh0bzMxICANCiAgKiAgICAgQGFyZyBGb3IgQGIgU1RNMzJfTWVkaXVtLWRlbnNpdHlfZGV2aWNlczogdmFsdWUgYmV0d2VlbiBGTEFTSF9XUlByb3RfUGFnZXMwdG8zDQogICogICAgICAgYW5kIEZMQVNIX1dSUHJvdF9QYWdlczEyNHRvMTI3DQogICogICAgIEBhcmcgRm9yIEBiIFNUTTMyX0hpZ2gtZGVuc2l0eV9kZXZpY2VzOiB2YWx1ZSBiZXR3ZWVuIEZMQVNIX1dSUHJvdF9QYWdlczB0bzEgYW5kDQogICogICAgICAgRkxBU0hfV1JQcm90X1BhZ2VzNjB0bzYxIG9yIEZMQVNIX1dSUHJvdF9QYWdlczYydG8yNTUNCiAgKiAgICAgQGFyZyBGb3IgQGIgU1RNMzJfQ29ubmVjdGl2aXR5X2xpbmVfZGV2aWNlczogdmFsdWUgYmV0d2VlbiBGTEFTSF9XUlByb3RfUGFnZXMwdG8xIGFuZA0KICAqICAgICAgIEZMQVNIX1dSUHJvdF9QYWdlczYwdG82MSBvciBGTEFTSF9XUlByb3RfUGFnZXM2MnRvMTI3ICAgIA0KICAqICAgICBAYXJnIEZvciBAYiBTVE0zMl9YTC1kZW5zaXR5X2RldmljZXM6IHZhbHVlIGJldHdlZW4gRkxBU0hfV1JQcm90X1BhZ2VzMHRvMSBhbmQNCiAgKiAgICAgICBGTEFTSF9XUlByb3RfUGFnZXM2MHRvNjEgb3IgRkxBU0hfV1JQcm90X1BhZ2VzNjJ0bzUxMQ0KICAqICAgICBAYXJnIEZMQVNIX1dSUHJvdF9BbGxQYWdlcw0KICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9FUlJPUl9QRywNCiAgKiAgIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4NCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9FbmFibGVXcml0ZVByb3RlY3Rpb24odWludDMyX3QgRkxBU0hfUGFnZXMpDQp7DQogIHVpbnQxNl90IFdSUDBfRGF0YSA9IDB4RkZGRiwgV1JQMV9EYXRhID0gMHhGRkZGLCBXUlAyX0RhdGEgPSAweEZGRkYsIFdSUDNfRGF0YSA9IDB4RkZGRjsNCiAgDQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9XUlBST1RfUEFHRShGTEFTSF9QYWdlcykpOw0KICANCiAgRkxBU0hfUGFnZXMgPSAodWludDMyX3QpKH5GTEFTSF9QYWdlcyk7DQogIFdSUDBfRGF0YSA9ICh1aW50MTZfdCkoRkxBU0hfUGFnZXMgJiBXUlAwX01hc2spOw0KICBXUlAxX0RhdGEgPSAodWludDE2X3QpKChGTEFTSF9QYWdlcyAmIFdSUDFfTWFzaykgPj4gOCk7DQogIFdSUDJfRGF0YSA9ICh1aW50MTZfdCkoKEZMQVNIX1BhZ2VzICYgV1JQMl9NYXNrKSA+PiAxNik7DQogIFdSUDNfRGF0YSA9ICh1aW50MTZfdCkoKEZMQVNIX1BhZ2VzICYgV1JQM19NYXNrKSA+PiAyNCk7DQogIA0KICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICANCiAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICB7DQogICAgLyogQXV0aG9yaXplcyB0aGUgc21hbGwgaW5mb3JtYXRpb24gYmxvY2sgcHJvZ3JhbW1pbmcgKi8NCiAgICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTE7DQogICAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkyOw0KICAgIEZMQVNILT5DUiB8PSBDUl9PUFRQR19TZXQ7DQogICAgaWYoV1JQMF9EYXRhICE9IDB4RkYpDQogICAgew0KICAgICAgT0ItPldSUDAgPSBXUlAwX0RhdGE7DQogICAgICANCiAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICAgIH0NCiAgICBpZigoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKSAmJiAoV1JQMV9EYXRhICE9IDB4RkYpKQ0KICAgIHsNCiAgICAgIE9CLT5XUlAxID0gV1JQMV9EYXRhOw0KICAgICAgDQogICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiAgICB9DQogICAgaWYoKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkgJiYgKFdSUDJfRGF0YSAhPSAweEZGKSkNCiAgICB7DQogICAgICBPQi0+V1JQMiA9IFdSUDJfRGF0YTsNCiAgICAgIA0KICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogICAgfQ0KICAgIA0KICAgIGlmKChzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpJiYgKFdSUDNfRGF0YSAhPSAweEZGKSkNCiAgICB7DQogICAgICBPQi0+V1JQMyA9IFdSUDNfRGF0YTsNCiAgICAgDQogICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiAgICB9DQogICAgICAgICAgDQogICAgaWYoc3RhdHVzICE9IEZMQVNIX1RJTUVPVVQpDQogICAgew0KICAgICAgLyogaWYgdGhlIHByb2dyYW0gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgT1BUUEcgQml0ICovDQogICAgICBGTEFTSC0+Q1IgJj0gQ1JfT1BUUEdfUmVzZXQ7DQogICAgfQ0KICB9IA0KICAvKiBSZXR1cm4gdGhlIHdyaXRlIHByb3RlY3Rpb24gb3BlcmF0aW9uIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOyAgICAgICANCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSByZWFkIG91dCBwcm90ZWN0aW9uLg0KICAqIEBub3RlICAgSWYgdGhlIHVzZXIgaGFzIGFscmVhZHkgcHJvZ3JhbW1lZCB0aGUgb3RoZXIgb3B0aW9uIGJ5dGVzIGJlZm9yZSBjYWxsaW5nIA0KICAqICAgdGhpcyBmdW5jdGlvbiwgaGUgbXVzdCByZS1wcm9ncmFtIHRoZW0gc2luY2UgdGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIG9wdGlvbiBieXRlcy4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCiAgKiBAcGFyYW0gIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFJlYWRPdXQgUHJvdGVjdGlvbi4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLA0KICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULg0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX1JlYWRPdXRQcm90ZWN0aW9uKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBBdXRob3JpemVzIHRoZSBzbWFsbCBpbmZvcm1hdGlvbiBibG9jayBwcm9ncmFtbWluZyAqLw0KICAgIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMTsNCiAgICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTI7DQogICAgRkxBU0gtPkNSIHw9IENSX09QVEVSX1NldDsNCiAgICBGTEFTSC0+Q1IgfD0gQ1JfU1RSVF9TZXQ7DQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRXJhc2VUaW1lb3V0KTsNCiAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogICAgew0KICAgICAgLyogaWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVEVSIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX09QVEVSX1Jlc2V0Ow0KICAgICAgLyogRW5hYmxlIHRoZSBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uICovDQogICAgICBGTEFTSC0+Q1IgfD0gQ1JfT1BUUEdfU2V0OyANCiAgICAgIGlmKE5ld1N0YXRlICE9IERJU0FCTEUpDQogICAgICB7DQogICAgICAgIE9CLT5SRFAgPSAweDAwOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBPQi0+UkRQID0gUkRQX0tleTsgIA0KICAgICAgfQ0KICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOyANCiAgICANCiAgICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9USU1FT1VUKQ0KICAgICAgew0KICAgICAgICAvKiBpZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8NCiAgICAgICAgRkxBU0gtPkNSICY9IENSX09QVFBHX1Jlc2V0Ow0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIA0KICAgIHsNCiAgICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9USU1FT1VUKQ0KICAgICAgew0KICAgICAgICAvKiBEaXNhYmxlIHRoZSBPUFRFUiBCaXQgKi8NCiAgICAgICAgRkxBU0gtPkNSICY9IENSX09QVEVSX1Jlc2V0Ow0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICAvKiBSZXR1cm4gdGhlIHByb3RlY3Rpb24gb3BlcmF0aW9uIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOyAgICAgICANCn0NCg0KLyoqDQogICogQGJyaWVmICBQcm9ncmFtcyB0aGUgRkxBU0ggVXNlciBPcHRpb24gQnl0ZTogSVdER19TVyAvIFJTVF9TVE9QIC8gUlNUX1NUREJZLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KICAqIEBwYXJhbSAgT0JfSVdERzogU2VsZWN0cyB0aGUgSVdERyBtb2RlDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIE9CX0lXREdfU1c6IFNvZnR3YXJlIElXREcgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBPQl9JV0RHX0hXOiBIYXJkd2FyZSBJV0RHIHNlbGVjdGVkDQogICogQHBhcmFtICBPQl9TVE9QOiBSZXNldCBldmVudCB3aGVuIGVudGVyaW5nIFNUT1AgbW9kZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgT0JfU1RPUF9Ob1JTVDogTm8gcmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgaW4gU1RPUA0KICAqICAgICBAYXJnIE9CX1NUT1BfUlNUOiBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVE9QDQogICogQHBhcmFtICBPQl9TVERCWTogUmVzZXQgZXZlbnQgd2hlbiBlbnRlcmluZyBTdGFuZGJ5IG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIE9CX1NUREJZX05vUlNUOiBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVEFOREJZDQogICogICAgIEBhcmcgT0JfU1REQllfUlNUOiBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVEFOREJZDQogICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLCANCiAgKiBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIEZMQVNIX1RJTUVPVVQuDQogICovDQpGTEFTSF9TdGF0dXMgRkxBU0hfVXNlck9wdGlvbkJ5dGVDb25maWcodWludDE2X3QgT0JfSVdERywgdWludDE2X3QgT0JfU1RPUCwgdWludDE2X3QgT0JfU1REQlkpDQp7DQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsgDQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX09CX0lXREdfU09VUkNFKE9CX0lXREcpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX09CX1NUT1BfU09VUkNFKE9CX1NUT1ApKTsNCiAgYXNzZXJ0X3BhcmFtKElTX09CX1NUREJZX1NPVVJDRShPQl9TVERCWSkpOw0KDQogIC8qIEF1dGhvcml6ZSB0aGUgc21hbGwgaW5mb3JtYXRpb24gYmxvY2sgcHJvZ3JhbW1pbmcgKi8NCiAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkxOw0KICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTI7DQogIA0KICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICANCiAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICB7ICANCiAgICAvKiBFbmFibGUgdGhlIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBvcGVyYXRpb24gKi8NCiAgICBGTEFTSC0+Q1IgfD0gQ1JfT1BUUEdfU2V0OyANCiAgICAgICAgICAgDQogICAgT0ItPlVTRVIgPSBPQl9JV0RHIHwgKHVpbnQxNl90KShPQl9TVE9QIHwgKHVpbnQxNl90KShPQl9TVERCWSB8ICgodWludDE2X3QpMHhGOCkpKTsgDQogIA0KICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiAgICBpZihzdGF0dXMgIT0gRkxBU0hfVElNRU9VVCkNCiAgICB7DQogICAgICAvKiBpZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8NCiAgICAgIEZMQVNILT5DUiAmPSBDUl9PUFRQR19SZXNldDsNCiAgICB9DQogIH0gICAgDQogIC8qIFJldHVybiB0aGUgT3B0aW9uIEJ5dGUgcHJvZ3JhbSBTdGF0dXMgKi8NCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KI2lmZGVmIFNUTTMyRjEwWF9YTA0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRvIGJvb3QgZnJvbSBCYW5rMSBvciBCYW5rMi4gIA0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBvbmx5IGZvciBTVE0zMkYxMHhfWEwgZGVuc2l0eSBkZXZpY2VzLg0KICAqIEBwYXJhbSAgRkxBU0hfQk9PVDogc2VsZWN0IHRoZSBGTEFTSCBCYW5rIHRvIGJvb3QgZnJvbS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRkxBU0hfQk9PVF9CYW5rMTogQXQgc3RhcnR1cCwgaWYgYm9vdCBwaW5zIGFyZSBzZXQgaW4gYm9vdCBmcm9tIHVzZXIgRmxhc2gNCiAgKiAgICAgICAgcG9zaXRpb24gYW5kIHRoaXMgcGFyYW1ldGVyIGlzIHNlbGVjdGVkIHRoZSBkZXZpY2Ugd2lsbCBib290IGZyb20gQmFuazEoRGVmYXVsdCkuDQogICogICAgIEBhcmcgRkxBU0hfQk9PVF9CYW5rMjogQXQgc3RhcnR1cCwgaWYgYm9vdCBwaW5zIGFyZSBzZXQgaW4gYm9vdCBmcm9tIHVzZXIgRmxhc2gNCiAgKiAgICAgICAgcG9zaXRpb24gYW5kIHRoaXMgcGFyYW1ldGVyIGlzIHNlbGVjdGVkIHRoZSBkZXZpY2Ugd2lsbCBib290IGZyb20gQmFuazIgb3IgQmFuazEsDQogICogICAgICAgIGRlcGVuZGluZyBvbiB0aGUgYWN0aXZhdGlvbiBvZiB0aGUgYmFuay4gVGhlIGFjdGl2ZSBiYW5rcyBhcmUgY2hlY2tlZCBpbg0KICAqICAgICAgICB0aGUgZm9sbG93aW5nIG9yZGVyOiBCYW5rMiwgZm9sbG93ZWQgYnkgQmFuazEuDQogICogICAgICAgIFRoZSBhY3RpdmUgYmFuayBpcyByZWNvZ25pemVkIGJ5IHRoZSB2YWx1ZSBwcm9ncmFtbWVkIGF0IHRoZSBiYXNlIGFkZHJlc3MNCiAgKiAgICAgICAgb2YgdGhlIHJlc3BlY3RpdmUgYmFuayAoY29ycmVzcG9uZGluZyB0byB0aGUgaW5pdGlhbCBzdGFjayBwb2ludGVyIHZhbHVlDQogICogICAgICAgIGluIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlKS4NCiAgKiAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byBBTjI2MDYgZnJvbSB3d3cuc3QuY29tLiAgICANCiAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsIA0KICAqIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4NCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9Cb290Q29uZmlnKHVpbnQxNl90IEZMQVNIX0JPT1QpDQp7IA0KICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7IA0KICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQk9PVChGTEFTSF9CT09UKSk7DQogIC8qIEF1dGhvcml6ZSB0aGUgc21hbGwgaW5mb3JtYXRpb24gYmxvY2sgcHJvZ3JhbW1pbmcgKi8NCiAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkxOw0KICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTI7DQogIA0KICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICANCiAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICB7ICANCiAgICAvKiBFbmFibGUgdGhlIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBvcGVyYXRpb24gKi8NCiAgICBGTEFTSC0+Q1IgfD0gQ1JfT1BUUEdfU2V0OyANCg0KICAgIGlmKEZMQVNIX0JPT1QgPT0gRkxBU0hfQk9PVF9CYW5rMSkNCiAgICB7DQogICAgICBPQi0+VVNFUiB8PSBPQl9VU0VSX0JGQjI7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBPQi0+VVNFUiAmPSAodWludDE2X3QpKH4odWludDE2X3QpKE9CX1VTRVJfQkZCMikpOw0KICAgIH0NCiAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogICAgaWYoc3RhdHVzICE9IEZMQVNIX1RJTUVPVVQpDQogICAgew0KICAgICAgLyogaWYgdGhlIHByb2dyYW0gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgT1BUUEcgQml0ICovDQogICAgICBGTEFTSC0+Q1IgJj0gQ1JfT1BUUEdfUmVzZXQ7DQogICAgfQ0KICB9ICAgIA0KICAvKiBSZXR1cm4gdGhlIE9wdGlvbiBCeXRlIHByb2dyYW0gU3RhdHVzICovDQogIHJldHVybiBzdGF0dXM7DQp9DQojZW5kaWYgLyogU1RNMzJGMTBYX1hMICovDQoNCi8qKg0KICAqIEBicmllZiAgUmV0dXJucyB0aGUgRkxBU0ggVXNlciBPcHRpb24gQnl0ZXMgdmFsdWVzLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgVGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGVzIHZhbHVlczpJV0RHX1NXKEJpdDApLCBSU1RfU1RPUChCaXQxKQ0KICAqICAgYW5kIFJTVF9TVERCWShCaXQyKS4NCiAgKi8NCnVpbnQzMl90IEZMQVNIX0dldFVzZXJPcHRpb25CeXRlKHZvaWQpDQp7DQogIC8qIFJldHVybiB0aGUgVXNlciBPcHRpb24gQnl0ZSAqLw0KICByZXR1cm4gKHVpbnQzMl90KShGTEFTSC0+T0JSID4+IDIpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIFdyaXRlIFByb3RlY3Rpb24gT3B0aW9uIEJ5dGVzIFJlZ2lzdGVyIHZhbHVlLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgVGhlIEZMQVNIIFdyaXRlIFByb3RlY3Rpb24gIE9wdGlvbiBCeXRlcyBSZWdpc3RlciB2YWx1ZQ0KICAqLw0KdWludDMyX3QgRkxBU0hfR2V0V3JpdGVQcm90ZWN0aW9uT3B0aW9uQnl0ZSh2b2lkKQ0Kew0KICAvKiBSZXR1cm4gdGhlIEZhbHNoIHdyaXRlIHByb3RlY3Rpb24gUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuICh1aW50MzJfdCkoRkxBU0gtPldSUFIpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBGTEFTSCBSZWFkIE91dCBQcm90ZWN0aW9uIFN0YXR1cyBpcyBzZXQgb3Igbm90Lg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgRkxBU0ggUmVhZE91dCBQcm90ZWN0aW9uIFN0YXR1cyhTRVQgb3IgUkVTRVQpDQogICovDQpGbGFnU3RhdHVzIEZMQVNIX0dldFJlYWRPdXRQcm90ZWN0aW9uU3RhdHVzKHZvaWQpDQp7DQogIEZsYWdTdGF0dXMgcmVhZG91dHN0YXR1cyA9IFJFU0VUOw0KICBpZiAoKEZMQVNILT5PQlIgJiBSRFBSVF9NYXNrKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICByZWFkb3V0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJlYWRvdXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gcmVhZG91dHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgRkxBU0ggUHJlZmV0Y2ggQnVmZmVyIHN0YXR1cyBpcyBzZXQgb3Igbm90Lg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgRkxBU0ggUHJlZmV0Y2ggQnVmZmVyIFN0YXR1cyAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCkZsYWdTdGF0dXMgRkxBU0hfR2V0UHJlZmV0Y2hCdWZmZXJTdGF0dXModm9pZCkNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgDQogIGlmICgoRkxBU0gtPkFDUiAmIEFDUl9QUkZUQlNfTWFzaykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgbmV3IHN0YXRlIG9mIEZMQVNIIFByZWZldGNoIEJ1ZmZlciBTdGF0dXMgKFNFVCBvciBSRVNFVCkgKi8NCiAgcmV0dXJuIGJpdHN0YXR1czsgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEZMQVNIIGludGVycnVwdHMuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQogICogICAgICAgICAtIEZvciBTVE0zMkYxMFhfWEwgZGV2aWNlcywgZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEZMQVNIIGludGVycnVwdHMNCiAgICAgICAgICAgICAgZm9yIEJhbmsxIGFuZCBCYW5rMi4NCiAgKiAgICAgICAgIC0gRm9yIG90aGVyIGRldmljZXMgaXQgZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEZMQVNIIGludGVycnVwdHMgZm9yIEJhbmsxLg0KICAqIEBwYXJhbSAgRkxBU0hfSVQ6IHNwZWNpZmllcyB0aGUgRkxBU0ggaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRkxBU0hfSVRfRVJST1I6IEZMQVNIIEVycm9yIEludGVycnVwdA0KICAqICAgICBAYXJnIEZMQVNIX0lUX0VPUDogRkxBU0ggZW5kIG9mIG9wZXJhdGlvbiBJbnRlcnJ1cHQNCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBGbGFzaCBpbnRlcnJ1cHRzLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4gICAgICANCiAgKiBAcmV0dmFsIE5vbmUgDQogICovDQp2b2lkIEZMQVNIX0lUQ29uZmlnKHVpbnQzMl90IEZMQVNIX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQojaWZkZWYgU1RNMzJGMTBYX1hMDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9JVChGTEFTSF9JVCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZigoRkxBU0hfSVQgJiAweDgwMDAwMDAwKSAhPSAweDApDQogIHsNCiAgICBpZihOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICAgIHsNCiAgICAgIC8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IHNvdXJjZXMgKi8NCiAgICAgIEZMQVNILT5DUjIgfD0gKEZMQVNIX0lUICYgMHg3RkZGRkZGRik7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAqLw0KICAgICAgRkxBU0gtPkNSMiAmPSB+KHVpbnQzMl90KShGTEFTSF9JVCAmIDB4N0ZGRkZGRkYpOw0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICBpZihOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICAgIHsNCiAgICAgIC8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IHNvdXJjZXMgKi8NCiAgICAgIEZMQVNILT5DUiB8PSBGTEFTSF9JVDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8qIERpc2FibGUgdGhlIGludGVycnVwdCBzb3VyY2VzICovDQogICAgICBGTEFTSC0+Q1IgJj0gfih1aW50MzJfdClGTEFTSF9JVDsNCiAgICB9DQogIH0NCiNlbHNlDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9JVChGTEFTSF9JVCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZihOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAqLw0KICAgIEZMQVNILT5DUiB8PSBGTEFTSF9JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAqLw0KICAgIEZMQVNILT5DUiAmPSB+KHVpbnQzMl90KUZMQVNIX0lUOw0KICB9DQojZW5kaWYgLyogU1RNMzJGMTBYX1hMICovDQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGTEFTSCBmbGFnIGlzIHNldCBvciBub3QuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQogICogICAgICAgICAtIEZvciBTVE0zMkYxMFhfWEwgZGV2aWNlcywgdGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIA0KICAqICAgICAgICAgICBCYW5rMSBvciBCYW5rMiBmbGFnIGlzIHNldCBvciBub3QuDQogICogICAgICAgICAtIEZvciBvdGhlciBkZXZpY2VzLCBpdCBjaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEJhbmsxIGZsYWcgaXMgDQogICogICAgICAgICAgIHNldCBvciBub3QuDQogICogQHBhcmFtICBGTEFTSF9GTEFHOiBzcGVjaWZpZXMgdGhlIEZMQVNIIGZsYWcgdG8gY2hlY2suDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEZMQVNIX0ZMQUdfQlNZOiBGTEFTSCBCdXN5IGZsYWcgICAgICAgICAgIA0KICAqICAgICBAYXJnIEZMQVNIX0ZMQUdfUEdFUlI6IEZMQVNIIFByb2dyYW0gZXJyb3IgZmxhZyAgICAgICANCiAgKiAgICAgQGFyZyBGTEFTSF9GTEFHX1dSUFJURVJSOiBGTEFTSCBXcml0ZSBwcm90ZWN0ZWQgZXJyb3IgZmxhZyAgICAgIA0KICAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRU9QOiBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIGZsYWcgICAgICAgICAgIA0KICAqICAgICBAYXJnIEZMQVNIX0ZMQUdfT1BURVJSOiAgRkxBU0ggT3B0aW9uIEJ5dGUgZXJyb3IgZmxhZyAgICAgDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIEZMQVNIX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQogICovDQpGbGFnU3RhdHVzIEZMQVNIX0dldEZsYWdTdGF0dXModWludDMyX3QgRkxBU0hfRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCg0KI2lmZGVmIFNUTTMyRjEwWF9YTA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBRykpIDsNCiAgaWYoRkxBU0hfRkxBRyA9PSBGTEFTSF9GTEFHX09QVEVSUikgDQogIHsNCiAgICBpZigoRkxBU0gtPk9CUiAmIEZMQVNIX0ZMQUdfT1BURVJSKSAhPSAodWludDMyX3QpUkVTRVQpDQogICAgew0KICAgICAgYml0c3RhdHVzID0gU0VUOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQogICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIGlmKChGTEFTSF9GTEFHICYgMHg4MDAwMDAwMCkgIT0gMHgwKQ0KICAgIHsNCiAgICAgIGlmKChGTEFTSC0+U1IyICYgRkxBU0hfRkxBRykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICAgICAgew0KICAgICAgICBiaXRzdGF0dXMgPSBTRVQ7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgaWYoKEZMQVNILT5TUiAmIEZMQVNIX0ZMQUcpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgICAgIHsNCiAgICAgICAgYml0c3RhdHVzID0gU0VUOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgICAgIH0NCiAgICB9DQogIH0NCiNlbHNlDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHKSkgOw0KICBpZihGTEFTSF9GTEFHID09IEZMQVNIX0ZMQUdfT1BURVJSKSANCiAgew0KICAgIGlmKChGTEFTSC0+T0JSICYgRkxBU0hfRkxBR19PUFRFUlIpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgICB7DQogICAgICBiaXRzdGF0dXMgPSBTRVQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICBpZigoRkxBU0gtPlNSICYgRkxBU0hfRkxBRykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICAgIHsNCiAgICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICAgIH0NCiAgfQ0KI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KDQogIC8qIFJldHVybiB0aGUgbmV3IHN0YXRlIG9mIEZMQVNIX0ZMQUcgKFNFVCBvciBSRVNFVCkgKi8NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIEZMQVNIknMgcGVuZGluZyBmbGFncy4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCiAgKiAgICAgICAgIC0gRm9yIFNUTTMyRjEwWF9YTCBkZXZpY2VzLCB0aGlzIGZ1bmN0aW9uIGNsZWFycyBCYW5rMSBvciBCYW5rMpJzIHBlbmRpbmcgZmxhZ3MNCiAgKiAgICAgICAgIC0gRm9yIG90aGVyIGRldmljZXMsIGl0IGNsZWFycyBCYW5rMZJzIHBlbmRpbmcgZmxhZ3MuDQogICogQHBhcmFtICBGTEFTSF9GTEFHOiBzcGVjaWZpZXMgdGhlIEZMQVNIIGZsYWdzIHRvIGNsZWFyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICAgICAgICANCiAgKiAgICAgQGFyZyBGTEFTSF9GTEFHX1BHRVJSOiBGTEFTSCBQcm9ncmFtIGVycm9yIGZsYWcgICAgICAgDQogICogICAgIEBhcmcgRkxBU0hfRkxBR19XUlBSVEVSUjogRkxBU0ggV3JpdGUgcHJvdGVjdGVkIGVycm9yIGZsYWcgICAgICANCiAgKiAgICAgQGFyZyBGTEFTSF9GTEFHX0VPUDogRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICAgICAgICAgICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgRkxBU0hfQ2xlYXJGbGFnKHVpbnQzMl90IEZMQVNIX0ZMQUcpDQp7DQojaWZkZWYgU1RNMzJGMTBYX1hMDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9DTEVBUl9GTEFHKEZMQVNIX0ZMQUcpKSA7DQoNCiAgaWYoKEZMQVNIX0ZMQUcgJiAweDgwMDAwMDAwKSAhPSAweDApDQogIHsNCiAgICAvKiBDbGVhciB0aGUgZmxhZ3MgKi8NCiAgICBGTEFTSC0+U1IyID0gRkxBU0hfRkxBRzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBDbGVhciB0aGUgZmxhZ3MgKi8NCiAgICBGTEFTSC0+U1IgPSBGTEFTSF9GTEFHOw0KICB9ICANCg0KI2Vsc2UNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBU0hfRkxBRykpIDsNCiAgDQogIC8qIENsZWFyIHRoZSBmbGFncyAqLw0KICBGTEFTSC0+U1IgPSBGTEFTSF9GTEFHOw0KI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIFN0YXR1cy4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcywgaXQgaXMgZXF1aXZhbGVudA0KICAqICAgIHRvIEZMQVNIX0dldEJhbmsxU3RhdHVzIGZ1bmN0aW9uLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9CVVNZLCBGTEFTSF9FUlJPUl9QRywNCiAgKiAgIEZMQVNIX0VSUk9SX1dSUCBvciBGTEFTSF9DT01QTEVURQ0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX0dldFN0YXR1cyh2b2lkKQ0Kew0KICBGTEFTSF9TdGF0dXMgZmxhc2hzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgDQogIGlmKChGTEFTSC0+U1IgJiBGTEFTSF9GTEFHX0JTWSkgPT0gRkxBU0hfRkxBR19CU1kpIA0KICB7DQogICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9CVVNZOw0KICB9DQogIGVsc2UgDQogIHsgIA0KICAgIGlmKChGTEFTSC0+U1IgJiBGTEFTSF9GTEFHX1BHRVJSKSAhPSAwKQ0KICAgIHsgDQogICAgICBmbGFzaHN0YXR1cyA9IEZMQVNIX0VSUk9SX1BHOw0KICAgIH0NCiAgICBlbHNlIA0KICAgIHsNCiAgICAgIGlmKChGTEFTSC0+U1IgJiBGTEFTSF9GTEFHX1dSUFJURVJSKSAhPSAwICkNCiAgICAgIHsNCiAgICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9FUlJPUl9XUlA7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIGZsYXNoc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQogICAgICB9DQogICAgfQ0KICB9DQogIC8qIFJldHVybiB0aGUgRmxhc2ggU3RhdHVzICovDQogIHJldHVybiBmbGFzaHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBGTEFTSCBCYW5rMSBTdGF0dXMuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMsIGl0IGlzIGVxdWl2YWxlbnQNCiAgKiAgIHRvIEZMQVNIX0dldFN0YXR1cyBmdW5jdGlvbi4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfQlVTWSwgRkxBU0hfRVJST1JfUEcsDQogICogICBGTEFTSF9FUlJPUl9XUlAgb3IgRkxBU0hfQ09NUExFVEUNCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9HZXRCYW5rMVN0YXR1cyh2b2lkKQ0Kew0KICBGTEFTSF9TdGF0dXMgZmxhc2hzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgDQogIGlmKChGTEFTSC0+U1IgJiBGTEFTSF9GTEFHX0JBTksxX0JTWSkgPT0gRkxBU0hfRkxBR19CU1kpIA0KICB7DQogICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9CVVNZOw0KICB9DQogIGVsc2UgDQogIHsgIA0KICAgIGlmKChGTEFTSC0+U1IgJiBGTEFTSF9GTEFHX0JBTksxX1BHRVJSKSAhPSAwKQ0KICAgIHsgDQogICAgICBmbGFzaHN0YXR1cyA9IEZMQVNIX0VSUk9SX1BHOw0KICAgIH0NCiAgICBlbHNlIA0KICAgIHsNCiAgICAgIGlmKChGTEFTSC0+U1IgJiBGTEFTSF9GTEFHX0JBTksxX1dSUFJURVJSKSAhPSAwICkNCiAgICAgIHsNCiAgICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9FUlJPUl9XUlA7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIGZsYXNoc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQogICAgICB9DQogICAgfQ0KICB9DQogIC8qIFJldHVybiB0aGUgRmxhc2ggU3RhdHVzICovDQogIHJldHVybiBmbGFzaHN0YXR1czsNCn0NCg0KI2lmZGVmIFNUTTMyRjEwWF9YTA0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBGTEFTSCBCYW5rMiBTdGF0dXMuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBTVE0zMkYxMHhfWEwgZGVuc2l0eSBkZXZpY2VzLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9CVVNZLCBGTEFTSF9FUlJPUl9QRywNCiAgKiAgIEZMQVNIX0VSUk9SX1dSUCBvciBGTEFTSF9DT01QTEVURQ0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX0dldEJhbmsyU3RhdHVzKHZvaWQpDQp7DQogIEZMQVNIX1N0YXR1cyBmbGFzaHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KICANCiAgaWYoKEZMQVNILT5TUjIgJiAoRkxBU0hfRkxBR19CQU5LMl9CU1kgJiAweDdGRkZGRkZGKSkgPT0gKEZMQVNIX0ZMQUdfQkFOSzJfQlNZICYgMHg3RkZGRkZGRikpIA0KICB7DQogICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9CVVNZOw0KICB9DQogIGVsc2UgDQogIHsgIA0KICAgIGlmKChGTEFTSC0+U1IyICYgKEZMQVNIX0ZMQUdfQkFOSzJfUEdFUlIgJiAweDdGRkZGRkZGKSkgIT0gMCkNCiAgICB7IA0KICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9FUlJPUl9QRzsNCiAgICB9DQogICAgZWxzZSANCiAgICB7DQogICAgICBpZigoRkxBU0gtPlNSMiAmIChGTEFTSF9GTEFHX0JBTksyX1dSUFJURVJSICYgMHg3RkZGRkZGRikpICE9IDAgKQ0KICAgICAgew0KICAgICAgICBmbGFzaHN0YXR1cyA9IEZMQVNIX0VSUk9SX1dSUDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgLyogUmV0dXJuIHRoZSBGbGFzaCBTdGF0dXMgKi8NCiAgcmV0dXJuIGZsYXNoc3RhdHVzOw0KfQ0KI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KLyoqDQogICogQGJyaWVmICBXYWl0cyBmb3IgYSBGbGFzaCBvcGVyYXRpb24gdG8gY29tcGxldGUgb3IgYSBUSU1FT1VUIHRvIG9jY3VyLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLCANCiAgKiAgICAgICAgIGl0IGlzIGVxdWl2YWxlbnQgdG8gRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbi4NCiAgKiAgICAgICAgIC0gRm9yIFNUTTMyRjEwWF9YTCBkZXZpY2VzIHRoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIGEgQmFuazEgRmxhc2ggb3BlcmF0aW9uDQogICogICAgICAgICAgIHRvIGNvbXBsZXRlIG9yIGEgVElNRU9VVCB0byBvY2N1ci4NCiAgKiAgICAgICAgIC0gRm9yIGFsbCBvdGhlciBkZXZpY2VzIGl0IHdhaXRzIGZvciBhIEZsYXNoIG9wZXJhdGlvbiB0byBjb21wbGV0ZSANCiAgKiAgICAgICAgICAgb3IgYSBUSU1FT1VUIHRvIG9jY3VyLg0KICAqIEBwYXJhbSAgVGltZW91dDogRkxBU0ggcHJvZ2FtbWluZyBUaW1lb3V0DQogICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLA0KICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULg0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKHVpbnQzMl90IFRpbWVvdXQpDQp7IA0KICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQogICANCiAgLyogQ2hlY2sgZm9yIHRoZSBGbGFzaCBTdGF0dXMgKi8NCiAgc3RhdHVzID0gRkxBU0hfR2V0QmFuazFTdGF0dXMoKTsNCiAgLyogV2FpdCBmb3IgYSBGbGFzaCBvcGVyYXRpb24gdG8gY29tcGxldGUgb3IgYSBUSU1FT1VUIHRvIG9jY3VyICovDQogIHdoaWxlKChzdGF0dXMgPT0gRkxBU0hfQlVTWSkgJiYgKFRpbWVvdXQgIT0gMHgwMCkpDQogIHsNCiAgICBzdGF0dXMgPSBGTEFTSF9HZXRCYW5rMVN0YXR1cygpOw0KICAgIFRpbWVvdXQtLTsNCiAgfQ0KICBpZihUaW1lb3V0ID09IDB4MDAgKQ0KICB7DQogICAgc3RhdHVzID0gRkxBU0hfVElNRU9VVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIG9wZXJhdGlvbiBzdGF0dXMgKi8NCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBXYWl0cyBmb3IgYSBGbGFzaCBvcGVyYXRpb24gb24gQmFuazEgdG8gY29tcGxldGUgb3IgYSBUSU1FT1VUIHRvIG9jY3VyLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLCANCiAgKiAgICAgICAgIGl0IGlzIGVxdWl2YWxlbnQgdG8gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24uDQogICogQHBhcmFtICBUaW1lb3V0OiBGTEFTSCBwcm9nYW1taW5nIFRpbWVvdXQNCiAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsDQogICogICBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIEZMQVNIX1RJTUVPVVQuDQogICovDQpGTEFTSF9TdGF0dXMgRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KQ0KeyANCiAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KICAgDQogIC8qIENoZWNrIGZvciB0aGUgRmxhc2ggU3RhdHVzICovDQogIHN0YXR1cyA9IEZMQVNIX0dldEJhbmsxU3RhdHVzKCk7DQogIC8qIFdhaXQgZm9yIGEgRmxhc2ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIG9yIGEgVElNRU9VVCB0byBvY2N1ciAqLw0KICB3aGlsZSgoc3RhdHVzID09IEZMQVNIX0ZMQUdfQkFOSzFfQlNZKSAmJiAoVGltZW91dCAhPSAweDAwKSkNCiAgew0KICAgIHN0YXR1cyA9IEZMQVNIX0dldEJhbmsxU3RhdHVzKCk7DQogICAgVGltZW91dC0tOw0KICB9DQogIGlmKFRpbWVvdXQgPT0gMHgwMCApDQogIHsNCiAgICBzdGF0dXMgPSBGTEFTSF9USU1FT1VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgb3BlcmF0aW9uIHN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQojaWZkZWYgU1RNMzJGMTBYX1hMDQovKioNCiAgKiBAYnJpZWYgIFdhaXRzIGZvciBhIEZsYXNoIG9wZXJhdGlvbiBvbiBCYW5rMiB0byBjb21wbGV0ZSBvciBhIFRJTUVPVVQgdG8gb2NjdXIuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgZm9yIFNUTTMyRjEweF9YTCBkZW5zaXR5IGRldmljZXMuDQogICogQHBhcmFtICBUaW1lb3V0OiBGTEFTSCBwcm9nYW1taW5nIFRpbWVvdXQNCiAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsDQogICogICBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIEZMQVNIX1RJTUVPVVQuDQogICovDQpGTEFTSF9TdGF0dXMgRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KQ0KeyANCiAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KICAgDQogIC8qIENoZWNrIGZvciB0aGUgRmxhc2ggU3RhdHVzICovDQogIHN0YXR1cyA9IEZMQVNIX0dldEJhbmsyU3RhdHVzKCk7DQogIC8qIFdhaXQgZm9yIGEgRmxhc2ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIG9yIGEgVElNRU9VVCB0byBvY2N1ciAqLw0KICB3aGlsZSgoc3RhdHVzID09IChGTEFTSF9GTEFHX0JBTksyX0JTWSAmIDB4N0ZGRkZGRkYpKSAmJiAoVGltZW91dCAhPSAweDAwKSkNCiAgew0KICAgIHN0YXR1cyA9IEZMQVNIX0dldEJhbmsyU3RhdHVzKCk7DQogICAgVGltZW91dC0tOw0KICB9DQogIGlmKFRpbWVvdXQgPT0gMHgwMCApDQogIHsNCiAgICBzdGF0dXMgPSBGTEFTSF9USU1FT1VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgb3BlcmF0aW9uIHN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOw0KfQ0KI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K