LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogKg0KICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGRpc2NsYWltZXIgYmVsb3cuDQogKg0KICogQXRtZWwncyBuYW1lIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIERJU0NMQUlNRVI6IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVRNRUwgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1INCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQogKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBVE1FTCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQogKiBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gICAgICAgICBIZWFkZXJzDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojaW5jbHVkZSA8Ym9hcmQuaD4NCg0KI2lmZGVmIEFUOTFDX0JBU0VfVFNBREMNCg0KI2luY2x1ZGUgPHV0aWxpdHkvdHJhY2UuaD4NCiNpbmNsdWRlIDx1dGlsaXR5L2Fzc2VydC5oPg0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gICAgICAgICBMb2NhbCB2YXJpYWJsZXMNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vLyBUU0FEQyBjbG9jayBmcmVxdWVuY3kgaW4gSHouDQpzdGF0aWMgdW5zaWduZWQgaW50IGxBZGNjbGsgPSAwOw0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gICAgICAgICBHbG9iYWwgZnVuY3Rpb25zDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8vIFNldHMgdGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZSBUU0FEQ0MgcGVyaXBoZXJhbC4gVGhlIG1vZGUgdmFsdWUgY2FuIGJlDQovLy8gb25lIG9mIHRoZSBmb2xsb3dpbmc6DQovLy8gLSBBVDkxQ19UU0FEQ19UU0FNT0RfQURDX09OTFlfTU9ERQ0KLy8vIC0gQVQ5MUNfVFNBRENfVFNBTU9EX1RTX09OTFlfTU9ERQ0KLy8vIFxwYXJhbSBtb2RlICBEZXNpcmVkIG1vZGUgZm9yIHRoZSBUU0FEQ0MuDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0Kdm9pZCBUU0FEQ0NfU2V0T3BlcmF0aW5nTW9kZSh1bnNpZ25lZCBpbnQgbW9kZSkNCnsNCiAgICBTQU5JVFlfQ0hFQ0soICAobW9kZSA9PSBBVDkxQ19UU0FEQ19UU0FNT0RfQURDX09OTFlfTU9ERSkNCiAgICAgICAgICAgICAgICAgfCAobW9kZSA9PSBBVDkxQ19UU0FEQ19UU0FNT0RfVFNfT05MWV9NT0RFKSk7DQogICAgICAgICAgICAgICAgIA0KICAgIEFUOTFDX0JBU0VfVFNBREMtPlRTQURDX01SID0gKEFUOTFDX0JBU0VfVFNBREMtPlRTQURDX01SDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiB+QVQ5MUNfVFNBRENfVFNBTU9EKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtb2RlOw0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8vIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGxvdyByZXNvbHV0aW9uIHByZWNpc2lvbiBvbiB0aGUgVFNBREMuDQovLy8gXHBhcmFtIGVuYWJsZSAgSWYgdHJ1ZSwgbG93IHJlc29sdXRpb24gKDggYml0KSBpcyB1c2VkOyBvdGhlcndpc2UgdGhlIFRTQURDDQovLy8gICAgICAgICAgICAgICAgd2lsbCB1c2UgYSAxMC1iaXQgcmVzb2x1dGlvbi4NCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp2b2lkIFRTQURDQ19TZXRMb3dSZXNvbHV0aW9uKHVuc2lnbmVkIGNoYXIgZW5hYmxlKQ0Kew0KICAgIGlmIChlbmFibGUpIHsNCiAgICANCiAgICAgICAgQVQ5MUNfQkFTRV9UU0FEQy0+VFNBRENfTVIgfD0gQVQ5MUNfVFNBRENfTE9XUkVTOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICANCiAgICAgICAgQVQ5MUNfQkFTRV9UU0FEQy0+VFNBRENfTVIgJj0gfkFUOTFDX1RTQURDX0xPV1JFUzsNCiAgICB9DQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gRW5hYmxlcyBvciBkaXNhYmxlIFNMRUVQIG1vZGUgb24gdGhlIFRTQURDLg0KLy8vIFxwYXJhbSBlbmFibGUgIElmIHRydWUsIHRoZSBUU0FEQyBpcyBwdXQgaW50byBzbGVlcCBtb2RlOyBpbiBub3JtYWwgbW9kZQ0KLy8vICAgICAgICAgICAgICAgIG90aGVyd2lzZS4NCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp2b2lkIFRTQURDQ19TZXRTbGVlcE1vZGUodW5zaWduZWQgY2hhciBlbmFibGUpDQp7DQogICAgaWYgKGVuYWJsZSkgew0KICAgIA0KICAgICAgICBBVDkxQ19CQVNFX1RTQURDLT5UU0FEQ19NUiB8PSBBVDkxQ19UU0FEQ19TTEVFUDsNCiAgICB9DQogICAgZWxzZSB7DQogICAgDQogICAgICAgIEFUOTFDX0JBU0VfVFNBREMtPlRTQURDX01SICY9IH5BVDkxQ19UU0FEQ19TTEVFUDsNCiAgICB9DQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gRW5hYmxlcyBvciBkaXNhYmxlcyBwZW4gZGV0ZWN0aW9uIG9uIHRoZSBUU0FEQy4NCi8vLyBccGFyYW0gZW5hYmxlICBJZiB0cnVlLCBwZW4gZGV0ZWN0aW9uIGlzIGVuYWJsZWQ7IG90aGVyd2lzZSBpdCBpcyBkaXNhYmxlZC4NCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp2b2lkIFRTQURDQ19TZXRQZW5EZXRlY3QodW5zaWduZWQgY2hhciBlbmFibGUpDQp7DQogICAgaWYgKGVuYWJsZSkgew0KICAgIA0KICAgICAgICBBVDkxQ19CQVNFX1RTQURDLT5UU0FEQ19NUiB8PSBBVDkxQ19UU0FEQ19QRU5ERVQ7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICANCiAgICAgICAgQVQ5MUNfQkFTRV9UU0FEQy0+VFNBRENfTVIgJj0gfkFUOTFDX1RTQURDX1BFTkRFVDsNCiAgICB9DQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gU2V0cyB0aGUgVFNBREMgY2xvY2sgdG8gdGhlIGRlc2lyZWQgZnJlcXVlbmN5LiBUaGUgcHJlc2NhbGVyIGlzIGNhbGN1bGF0ZWQNCi8vLyBieSB0aGlzIGZ1bmN0aW9uIHNvIHRoZSByZXN1bHRpbmcgZnJlcXVlbmN5IGlzIGVxdWFsIG9yIGluZmVyaW9yIHRvIHRoZQ0KLy8vIGRlc2lyZWQgb25lLg0KLy8vIFxwYXJhbSBhZGNjbGsgIERlc2lyZWQgQURDIGNsb2NrIGZyZXF1ZW5jeSBpbiBIei4NCi8vLyBccGFyYW0gbWNrICBNYXN0ZXIgY2xvY2sgZnJlcXVlbmN5IGluIEh6Lg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnZvaWQgVFNBRENDX1NldEFkY0ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgYWRjY2xrLCB1bnNpZ25lZCBpbnQgbWNrKQ0Kew0KICAgIHVuc2lnbmVkIGludCBwcmVzY2FsOw0KICAgIA0KICAgIC8vIEZvcm11bGEgZm9yIFBSRVNDQUwgaXM6DQogICAgLy8gUFJFU0NBTCA9IChNQ0sgLyAoMiAqIEFEQ0NMSykpICsgMQ0KICAgIC8vIEZpcnN0LCB3ZSBkbyB0aGUgZGl2aXNpb24sIG11bHRpcGxpZWQgYnkgMTAgdG8gZ2V0IGhpZ2hlciBwcmVjaXNpb24NCiAgICAvLyBJZiB0aGUgbGFzdCBkaWdpdCBpcyBub3QgemVybywgd2Ugcm91bmQgdXAgdG8gYXZvaWQgZ2VuZXJhdGluZyBhIGhpZ2hlcg0KICAgIC8vIHRoYW4gcmVxdWlyZWQgZnJlcXVlbmN5Lg0KICAgIHByZXNjYWwgPSAobWNrICogNSkgLyBhZGNjbGs7DQogICAgaWYgKChwcmVzY2FsICUgMTApID4gMCkgew0KICAgIA0KICAgICAgICBwcmVzY2FsID0gKHByZXNjYWwgLyAxMCk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgIA0KICAgICAgICBTQU5JVFlfQ0hFQ0soKHByZXNjYWwgLyAxMCkgIT0gMCk7DQogICAgICAgIHByZXNjYWwgPSAocHJlc2NhbCAvIDEwKSAtIDE7DQogICAgfQ0KICAgIFNBTklUWV9DSEVDSygocHJlc2NhbCAmIH4weDNGKSA9PSAwKTsNCiAgICANCiAgICBBVDkxQ19CQVNFX1RTQURDLT5UU0FEQ19NUiA9ICggIEFUOTFDX0JBU0VfVFNBREMtPlRTQURDX01SDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiB+QVQ5MUNfVFNBRENfUFJFU0NBTCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHByZXNjYWwgPDwgOCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAvLyBTYXZlIGNsb2NrIGZyZXF1ZW5jeSBmb3IgZnVydGhlciB0aW1pbmcgY2FsY3VsYXRpb25zDQogICAgbEFkY2NsayA9IGFkY2NsazsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBTZXRzIHRoZSBUU0FEQyBzdGFydHVwIHRpbWUuIFRoaXMgZnVuY3Rpb24gcmVsaWVzIG9uIHRoZSBBRENDTEsgZnJlcXVlbmN5DQovLy8gdGhhdCBoYXMgYmVlbiBzZXQgdXNpbmcgVFNBRENDX1NldEFkY0ZyZXF1ZW5jeSgpLCBzbyBpdCBtdXN0IGhhdmUgYmVlbg0KLy8vIGNhbGxlZCBmaXJzdC4NCi8vLyBccGFyYW0gdGltZSAgU3RhcnR1cCB0aW1lIGluILVzZWNvbmRzLg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnZvaWQgVFNBRENDX1NldFN0YXJ0dXBUaW1lKHVuc2lnbmVkIGludCB0aW1lKQ0Kew0KICAgIHVuc2lnbmVkIGludCBzdGFydHVwOw0KICAgIA0KICAgIFNBTklUWV9DSEVDSyhsQWRjY2xrICE9IDApOw0KICAgICAgICANCiAgICAvLyBGb3JtdWxhIGZvciBTVEFSVFVQIGlzOg0KICAgIC8vIFNUQVJUVVAgPSAodGltZSB4IEFEQ0NMSykgLyAoMTAwMDAwMCB4IDgpIC0gMQ0KICAgIC8vIERpdmlzaW9uIG11bHRpcGxpZWQgYnkgMTAgZm9yIGhpZ2hlciBwcmVjaXNpb24NCiAgICBzdGFydHVwID0gKHRpbWUgKiBsQWRjY2xrKSAvICg4MDAwMDApOw0KICAgIGlmICgoc3RhcnR1cCAlIDEwKSA+IDApIHsNCiAgICANCiAgICAgICAgc3RhcnR1cCAvPSAxMDsNCiAgICB9DQogICAgZWxzZSB7DQogICAgDQogICAgICAgIHN0YXJ0dXAgLz0gMTA7DQogICAgICAgIGlmIChzdGFydHVwID4gMCkgew0KICAgICAgICANCiAgICAgICAgICAgIHN0YXJ0dXAtLTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICBTQU5JVFlfQ0hFQ0soKHN0YXJ0dXAgJiB+MHg3RikgPT0gMCk7DQogICAgQVQ5MUNfQkFTRV9UU0FEQy0+VFNBRENfTVIgPSAoICBBVDkxQ19CQVNFX1RTQURDLT5UU0FEQ19NUg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgfkFUOTFDX1RTQURDX1NUQVJUVVApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzdGFydHVwIDw8IDE2KTsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBTZXRzIHRoZSBUU0FEQyB0cmFjayBhbmQgaG9sZCB0aW1lLiBUaGlzIGZ1bmN0aW9uIHJlbGllcyBvbiB0aGUgQURDQ0xLDQovLy8gZnJlcXVlbmN5IHRoYXQgaGFzIGJlZW4gc2V0IHdpdGggVFNBRENDX1NldEFkY0ZyZXF1ZW5jeSgpLCB0byBpdCBtdXN0IGJlDQovLy8gY2FsbGVkIGZpcnN0Lg0KLy8vIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSB0cmFjayBhbmQgaG9sZCB0aW1lIGluIHRoZSBUU0FEQ19UU1IgcmVnaXN0ZXIuDQovLy8gXHBhcmFtIHRpbWUgIFRyYWNrIGFuZCBob2xkIHRpbWUgaW4gbmFub3NlY29uZHMuDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0Kdm9pZCBUU0FEQ0NfU2V0VHJhY2tBbmRIb2xkVGltZSh1bnNpZ25lZCBpbnQgdGltZSkNCnsNCiAgICB1bnNpZ25lZCBpbnQgc2h0aW07DQogICAgDQogICAgU0FOSVRZX0NIRUNLKGxBZGNjbGsgIT0gMCk7DQogICAgDQogICAgLy8gRm9ybXVsYSBmb3IgU0hUSU06DQogICAgLy8gU0hUSU0gPSAodGltZSB4IEFEQ0NMSykgLyAxMDAwMDAwMDAwIC0gMQ0KICAgIC8vIFNpbmNlIDEgYmlsbGlvbiBpcyBjbG9zZSB0byB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgYW4gaW50ZWdlciwgd2UgZmlyc3QNCiAgICAvLyBkaXZpZGUgQURDQ0xLIGJ5IDEwMDAgdG8gYXZvaWQgYW4gb3ZlcmZsb3cNCiAgICBzaHRpbSA9ICh0aW1lICogKGxBZGNjbGsgLyAxMDAwKSkgLyAxMDAwMDA7DQogICAgaWYgKChzaHRpbSAlIDEwKSA+IDApIHsNCiAgICANCiAgICAgICAgc2h0aW0gLz0gMTA7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgIA0KICAgICAgICBzaHRpbSAvPSAxMDsNCiAgICAgICAgaWYgKHNodGltID4gMCkgc2h0aW0tLTsNCiAgICB9DQogICAgDQogICAgU0FOSVRZX0NIRUNLKChzaHRpbSAmIH4weEYpID09IDApOw0KICAgIEFUOTFDX0JBU0VfVFNBREMtPlRTQURDX01SID0gKCAgQVQ5MUNfQkFTRV9UU0FEQy0+VFNBRENfTVINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIH5BVDkxQ19UU0FEQ19TSFRJTSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHNodGltIDw8IDI0KTsNCiAgICBBVDkxQ19CQVNFX1RTQURDLT5UU0FEQ19UU1IgPSBzaHRpbSA8PCAyNDsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBTZXRzIHRoZSBUU0FEQyBkZWJvdW5jZSB0aW1lLiBUaGlzIGZ1bmN0aW9uIHJlbGllcyBvbiB0aGUgQURDQ0xLDQovLy8gZnJlcXVlbmN5IHRoYXQgaGFzIGJlZW4gc2V0IHdpdGggVFNBRENDX1NldEFkY0ZyZXF1ZW5jeSgpLCB0byBpdCBtdXN0IGJlDQovLy8gY2FsbGVkIGZpcnN0Lg0KLy8vIFxwYXJhbSB0aW1lICBEZWJvdW5jZSB0aW1lIGluIG5hbm9zZWNvbmRzIChjYW5ub3QgYmUgMCkuDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0Kdm9pZCBUU0FEQ0NfU2V0RGVib3VuY2VUaW1lKHVuc2lnbmVkIGludCB0aW1lKQ0Kew0KICAgIHVuc2lnbmVkIGludCBkaXZpc29yID0gMTAwMDAwMDAwMDsNCiAgICB1bnNpZ25lZCBpbnQgY2xvY2sgPSBsQWRjY2xrOw0KICAgIHVuc2lnbmVkIGludCBwZW5kYmMgPSAwOw0KICAgIHVuc2lnbmVkIGludCB0YXJnZXRWYWx1ZTsNCiAgICB1bnNpZ25lZCBpbnQgY3VycmVudFZhbHVlOw0KICAgIA0KICAgIFNBTklUWV9DSEVDSyhsQWRjY2xrICE9IDApOw0KICAgIFNBTklUWV9DSEVDSyh0aW1lICE9IDApOw0KICAgIA0KICAgIC8vIERpdmlkZSB0aW1lICYgQURDQ0xLIGZpcnN0IHRvIGF2b2lkIG92ZXJmbG93cw0KICAgIHdoaWxlICgoZGl2aXNvciA+IDEpICYmICgodGltZSAlIDEwKSA9PSAwKSkgew0KICAgIA0KICAgICAgICB0aW1lIC89IDEwOw0KICAgICAgICBkaXZpc29yIC89IDEwOw0KICAgIH0NCiAgICB3aGlsZSAoKGRpdmlzb3IgPiAxKSAmJiAoKGNsb2NrICUgMTApID09IDApKSB7DQogICAgDQogICAgICAgIGNsb2NrIC89IDEwOw0KICAgICAgICBkaXZpc29yIC89IDEwOw0KICAgIH0NCiAgICANCiAgICAvLyBDb21wdXRlIFBFTkRCQyB2YWx1ZQ0KICAgIHRhcmdldFZhbHVlID0gdGltZSAqIGNsb2NrIC8gZGl2aXNvcjsNCiAgICBjdXJyZW50VmFsdWUgPSAxOw0KICAgIHdoaWxlIChjdXJyZW50VmFsdWUgPCB0YXJnZXRWYWx1ZSkgew0KICAgIA0KICAgICAgICBwZW5kYmMrKzsNCiAgICAgICAgY3VycmVudFZhbHVlICo9IDI7DQogICAgfQ0KICAgIA0KICAgIFNBTklUWV9DSEVDSygocGVuZGJjICYgfjB4RikgPT0gMCk7DQogICAgQVQ5MUNfQkFTRV9UU0FEQy0+VFNBRENfTVIgPSAoICBBVDkxQ19CQVNFX1RTQURDLT5UU0FEQ19NUg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgfkFUOTFDX1RTQURDX1BFTkRCQykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHBlbmRiYyA8PCAyOCk7DQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gU2V0cyB0aGUgdHJpZ2dlciBtb2RlIG9mIHRoZSBUU0FEQ0MgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLy8vIC0gQVQ5MUNfVFNBRENfVFJHTU9EX05PX1RSSUdHRVINCi8vLyAtIEFUOTFDX1RTQURDX1RSR01PRF9FWFRFUk5BTF9UUklHR0VSX1JFDQovLy8gLSBBVDkxQ19UU0FEQ19UUkdNT0RfRVhURVJOQUxfVFJJR0dFUl9GRQ0KLy8vIC0gQVQ5MUNfVFNBRENfVFJHTU9EX0VYVEVSTkFMX1RSSUdHRVJfQUUNCi8vLyAtIEFUOTFDX1RTQURDX1RSR01PRF9QRU5ERVRfVFJJR0dFUg0KLy8vIC0gQVQ5MUNfVFNBRENfVFJHTU9EX1BFUklPRElDX1RSSUdHRVINCi8vLyAtIEFUOTFDX1RTQURDX1RSR01PRF9DT05UX1RSSUdHRVINCi8vLyBccGFyYW0gbW9kZSAgVHJpZ2dlciBtb2RlLg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnZvaWQgVFNBRENDX1NldFRyaWdnZXJNb2RlKHVuc2lnbmVkIGludCBtb2RlKQ0Kew0KICAgIFNBTklUWV9DSEVDSygoKG1vZGUgJiB+QVQ5MUNfVFNBRENfVFJHTU9EKSA9PSAwKQ0KICAgICAgICAgICAgICAgICB8ICgobW9kZSAmIEFUOTFDX1RTQURDX1RSR01PRCkgIT0gMHg3KSk7DQogICAgDQogICAgQVQ5MUNfQkFTRV9UU0FEQy0+VFNBRENfVFJHUiA9IChBVDkxQ19CQVNFX1RTQURDLT5UU0FEQ19UUkdSDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIH5BVDkxQ19UU0FEQ19UUkdNT0QpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW9kZTsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBTZXRzIHRoZSB0cmlnZ2VyIHBlcmlvZCB3aGVuIHVzaW5nIHRoZSBUU0FEQ0MgaW4gcGVyaW9kaWMgdHJpZ2dlciBtb2RlLg0KLy8vIEFzIHVzdWFsLCB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIFRTQURDQ19TZXRBZGNGcmVxdWVuY3koKSB0byBiZSBjYWxsZWQNCi8vLyBiZWZvcmUgaXQuDQovLy8gXHBhcmFtIHBlcmlvZCAgVHJpZ2dlciBwZXJpb2QgaW4gbmFub3NlY29uZHMuDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0Kdm9pZCBUU0FEQ0NfU2V0VHJpZ2dlclBlcmlvZCh1bnNpZ25lZCBpbnQgcGVyaW9kKQ0Kew0KICAgIHVuc2lnbmVkIGludCB0cmdwZXI7DQogICAgdW5zaWduZWQgaW50IGRpdmlzb3IgPSAxMDAwMDAwMDA7DQogICAgDQogICAgd2hpbGUgKChwZXJpb2QgPj0gMTApICYmIChkaXZpc29yID49IDEwKSkgew0KICAgIA0KICAgICAgICBwZXJpb2QgLz0gMTA7DQogICAgICAgIGRpdmlzb3IgLz0gMTA7DQogICAgfQ0KICAgIA0KICAgIHRyZ3BlciA9IChwZXJpb2QgKiBsQWRjY2xrKSAvIGRpdmlzb3I7DQogICAgaWYgKCh0cmdwZXIgJSAxMCkgPiAwKSB7DQogICAgDQogICAgICAgIHRyZ3BlciAvPSAxMDsNCiAgICB9DQogICAgZWxzZSB7DQogICAgDQogICAgICAgIHRyZ3BlciAvPSAxMDsNCiAgICAgICAgaWYgKHRyZ3BlciA+IDApIHRyZ3Blci0tOw0KICAgIH0NCiAgICANCiAgICBTQU5JVFlfQ0hFQ0soKHRyZ3BlciAmIH4weEZGRkYpID09IDApOw0KICAgIEFUOTFDX0JBU0VfVFNBREMtPlRTQURDX1RSR1IgPSAoQVQ5MUNfQkFTRV9UU0FEQy0+VFNBRENfVFJHUg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiB+QVQ5MUNfVFNBRENfVFJHUEVSKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICh0cmdwZXIgPDwgMTYpOw0KfQ0KDQojZW5kaWYgLy8jaWZkZWYgQVQ5MUNfQkFTRV9UU0FEQw0K