LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwOCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X2Nhbi5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIFZlcnNpb24gICAgICAgICAgICA6IFYyLjAuMQ0KKiBEYXRlICAgICAgICAgICAgICAgOiAwNi8xMy8yMDA4DQoqIERlc2NyaXB0aW9uICAgICAgICA6IFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIENBTiBmaXJtd2FyZSBmdW5jdGlvbnMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfY2FuLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogQ0FOIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyIGJpdHMgKi8NCiNkZWZpbmUgQ0FOX01DUl9JTlJRICAgICAoKHUzMikweDAwMDAwMDAxKSAvKiBJbml0aWFsaXphdGlvbiByZXF1ZXN0ICovDQojZGVmaW5lIENBTl9NQ1JfU0xFRVAgICAgKCh1MzIpMHgwMDAwMDAwMikgLyogU2xlZXAgbW9kZSByZXF1ZXN0ICovDQojZGVmaW5lIENBTl9NQ1JfVFhGUCAgICAgKCh1MzIpMHgwMDAwMDAwNCkgLyogVHJhbnNtaXQgRklGTyBwcmlvcml0eSAqLw0KI2RlZmluZSBDQU5fTUNSX1JGTE0gICAgICgodTMyKTB4MDAwMDAwMDgpIC8qIFJlY2VpdmUgRklGTyBsb2NrZWQgbW9kZSAqLw0KI2RlZmluZSBDQU5fTUNSX05BUlQgICAgICgodTMyKTB4MDAwMDAwMTApIC8qIE5vIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLw0KI2RlZmluZSBDQU5fTUNSX0FXVU0gICAgICgodTMyKTB4MDAwMDAwMjApIC8qIEF1dG9tYXRpYyB3YWtlIHVwIG1vZGUgKi8NCiNkZWZpbmUgQ0FOX01DUl9BQk9NICAgICAoKHUzMikweDAwMDAwMDQwKSAvKiBBdXRvbWF0aWMgYnVzLW9mZiBtYW5hZ2VtZW50ICovDQojZGVmaW5lIENBTl9NQ1JfVFRDTSAgICAgKCh1MzIpMHgwMDAwMDA4MCkgLyogdGltZSB0cmlnZ2VyZWQgY29tbXVuaWNhdGlvbiAqLw0KDQovKiBDQU4gTWFzdGVyIFN0YXR1cyBSZWdpc3RlciBiaXRzICovDQojZGVmaW5lIENBTl9NU1JfSU5BSyAgICAgKCh1MzIpMHgwMDAwMDAwMSkgICAgLyogSW5pdGlhbGl6YXRpb24gYWNrbm93bGVkZ2UgKi8NCiNkZWZpbmUgQ0FOX01TUl9XS1VJICAgICAoKHUzMikweDAwMDAwMDA4KSAgICAvKiBXYWtlLXVwIGludGVycnVwdCAqLw0KI2RlZmluZSBDQU5fTVNSX1NMQUtJICAgICgodTMyKTB4MDAwMDAwMTApICAgIC8qIFNsZWVwIGFja25vd2xlZGdlIGludGVycnVwdCAqLw0KDQovKiBDQU4gVHJhbnNtaXQgU3RhdHVzIFJlZ2lzdGVyIGJpdHMgKi8NCiNkZWZpbmUgQ0FOX1RTUl9SUUNQMCAgICAoKHUzMikweDAwMDAwMDAxKSAgICAvKiBSZXF1ZXN0IGNvbXBsZXRlZCBtYWlsYm94MCAqLw0KI2RlZmluZSBDQU5fVFNSX1RYT0swICAgICgodTMyKTB4MDAwMDAwMDIpICAgIC8qIFRyYW5zbWlzc2lvbiBPSyBvZiBtYWlsYm94MCAqLw0KI2RlZmluZSBDQU5fVFNSX0FCUlEwICAgICgodTMyKTB4MDAwMDAwODApICAgIC8qIEFib3J0IHJlcXVlc3QgZm9yIG1haWxib3gwICovDQojZGVmaW5lIENBTl9UU1JfUlFDUDEgICAgKCh1MzIpMHgwMDAwMDEwMCkgICAgLyogUmVxdWVzdCBjb21wbGV0ZWQgbWFpbGJveDEgKi8NCiNkZWZpbmUgQ0FOX1RTUl9UWE9LMSAgICAoKHUzMikweDAwMDAwMjAwKSAgICAvKiBUcmFuc21pc3Npb24gT0sgb2YgbWFpbGJveDEgKi8NCiNkZWZpbmUgQ0FOX1RTUl9BQlJRMSAgICAoKHUzMikweDAwMDA4MDAwKSAgICAvKiBBYm9ydCByZXF1ZXN0IGZvciBtYWlsYm94MSAqLw0KI2RlZmluZSBDQU5fVFNSX1JRQ1AyICAgICgodTMyKTB4MDAwMTAwMDApICAgIC8qIFJlcXVlc3QgY29tcGxldGVkIG1haWxib3gyICovDQojZGVmaW5lIENBTl9UU1JfVFhPSzIgICAgKCh1MzIpMHgwMDAyMDAwMCkgICAgLyogVHJhbnNtaXNzaW9uIE9LIG9mIG1haWxib3gyICovDQojZGVmaW5lIENBTl9UU1JfQUJSUTIgICAgKCh1MzIpMHgwMDgwMDAwMCkgICAgLyogQWJvcnQgcmVxdWVzdCBmb3IgbWFpbGJveDIgKi8NCiNkZWZpbmUgQ0FOX1RTUl9UTUUwICAgICAoKHUzMikweDA0MDAwMDAwKSAgICAvKiBUcmFuc21pdCBtYWlsYm94IDAgZW1wdHkgKi8NCiNkZWZpbmUgQ0FOX1RTUl9UTUUxICAgICAoKHUzMikweDA4MDAwMDAwKSAgICAvKiBUcmFuc21pdCBtYWlsYm94IDEgZW1wdHkgKi8NCiNkZWZpbmUgQ0FOX1RTUl9UTUUyICAgICAoKHUzMikweDEwMDAwMDAwKSAgICAvKiBUcmFuc21pdCBtYWlsYm94IDIgZW1wdHkgKi8NCg0KLyogQ0FOIFJlY2VpdmUgRklGTyAwIFJlZ2lzdGVyIGJpdHMgKi8NCiNkZWZpbmUgQ0FOX1JGMFJfRlVMTDAgICAoKHUzMikweDAwMDAwMDA4KSAgICAvKiBGSUZPIDAgZnVsbCAqLw0KI2RlZmluZSBDQU5fUkYwUl9GT1ZSMCAgICgodTMyKTB4MDAwMDAwMTApICAgIC8qIEZJRk8gMCBvdmVycnVuICovDQojZGVmaW5lIENBTl9SRjBSX1JGT00wICAgKCh1MzIpMHgwMDAwMDAyMCkgICAgLyogUmVsZWFzZSBGSUZPIDAgb3V0cHV0IG1haWxib3ggKi8NCg0KLyogQ0FOIFJlY2VpdmUgRklGTyAxIFJlZ2lzdGVyIGJpdHMgKi8NCiNkZWZpbmUgQ0FOX1JGMVJfRlVMTDEgICAoKHUzMikweDAwMDAwMDA4KSAgICAvKiBGSUZPIDEgZnVsbCAqLw0KI2RlZmluZSBDQU5fUkYxUl9GT1ZSMSAgICgodTMyKTB4MDAwMDAwMTApICAgIC8qIEZJRk8gMSBvdmVycnVuICovDQojZGVmaW5lIENBTl9SRjFSX1JGT00xICAgKCh1MzIpMHgwMDAwMDAyMCkgICAgLyogUmVsZWFzZSBGSUZPIDEgb3V0cHV0IG1haWxib3ggKi8NCg0KLyogQ0FOIEVycm9yIFN0YXR1cyBSZWdpc3RlciBiaXRzICovDQojZGVmaW5lIENBTl9FU1JfRVdHRiAgICAgKCh1MzIpMHgwMDAwMDAwMSkgICAgLyogRXJyb3Igd2FybmluZyBmbGFnICovDQojZGVmaW5lIENBTl9FU1JfRVBWRiAgICAgKCh1MzIpMHgwMDAwMDAwMikgICAgLyogRXJyb3IgcGFzc2l2ZSBmbGFnICovDQojZGVmaW5lIENBTl9FU1JfQk9GRiAgICAgKCh1MzIpMHgwMDAwMDAwNCkgICAgLyogQnVzLW9mZiBmbGFnICovDQoNCi8qIENBTiBNYWlsYm94IFRyYW5zbWl0IFJlcXVlc3QgKi8NCiNkZWZpbmUgQ0FOX1RNSUR4Ul9UWFJRICAgICgodTMyKTB4MDAwMDAwMDEpIC8qIFRyYW5zbWl0IG1haWxib3ggcmVxdWVzdCAqLw0KDQovKiBDQU4gRmlsdGVyIE1hc3RlciBSZWdpc3RlciBiaXRzICovDQojZGVmaW5lIENBTl9GTVJfRklOSVQgKCh1MzIpMHgwMDAwMDAwMSkgLyogRmlsdGVyIGluaXQgbW9kZSAqLw0KDQoNCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCnN0YXRpYyBJVFN0YXR1cyBDaGVja0lUU3RhdHVzKHUzMiBDQU5fUmVnLCB1MzIgSXRfQml0KTsNCg0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIENBTiBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0DQoqICAgICAgICAgICAgICAgICAgcmVzZXQgdmFsdWVzLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX0RlSW5pdCh2b2lkKQ0Kew0KICAvKiBFbmFibGUgQ0FOIHJlc2V0IHN0YXRlICovDQogIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfQ0FOLCBFTkFCTEUpOw0KICAvKiBSZWxlYXNlIENBTiBmcm9tIHJlc2V0IHN0YXRlICovDQogIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfQ0FOLCBESVNBQkxFKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDQU5fSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBDQU4gcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIENBTl9Jbml0U3RydWN0Lg0KKiBJbnB1dCAgICAgICAgICA6IENBTl9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgQ0FOX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQogICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBDQU4gcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IENvbnN0YW50IGluZGljYXRlcyBpbml0aWFsaXphdGlvbiBzdWNjZWVkIHdoaWNoIHdpbGwgYmUgDQoqICAgICAgICAgICAgICAgICAgQ0FOSU5JVEZBSUxFRCBvciBDQU5JTklUT0suDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTggQ0FOX0luaXQoQ0FOX0luaXRUeXBlRGVmKiBDQU5fSW5pdFN0cnVjdCkNCnsNCiAgdTggSW5pdFN0YXR1cyA9IDA7DQogIHUxNiBXYWl0QWNrOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKENBTl9Jbml0U3RydWN0LT5DQU5fVFRDTSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShDQU5fSW5pdFN0cnVjdC0+Q0FOX0FCT00pKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BV1VNKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKENBTl9Jbml0U3RydWN0LT5DQU5fTkFSVCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShDQU5fSW5pdFN0cnVjdC0+Q0FOX1JGTE0pKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9UWEZQKSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fTU9ERShDQU5fSW5pdFN0cnVjdC0+Q0FOX01vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9TSlcoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9TSlcpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9CUzEoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzEpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9CUzIoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9QUkVTQ0FMRVIoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9QcmVzY2FsZXIpKTsNCg0KICAvKiBSZXF1ZXN0IGluaXRpYWxpc2F0aW9uICovDQogIENBTi0+TUNSID0gQ0FOX01DUl9JTlJROw0KDQogIC8qIC4uLmFuZCBjaGVjayBhY2tub3dsZWRnZWQgKi8NCiAgaWYgKChDQU4tPk1TUiAmIENBTl9NU1JfSU5BSykgPT0gMCkNCiAgew0KICAgIEluaXRTdGF0dXMgPSBDQU5JTklURkFJTEVEOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFNldCB0aGUgdGltZSB0cmlnZ2VyZWQgY29tbXVuaWNhdGlvbiBtb2RlICovDQogICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fVFRDTSA9PSBFTkFCTEUpDQogICAgew0KICAgICAgQ0FOLT5NQ1IgfD0gQ0FOX01DUl9UVENNOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgQ0FOLT5NQ1IgJj0gfkNBTl9NQ1JfVFRDTTsNCiAgICB9DQoNCiAgICAvKiBTZXQgdGhlIGF1dG9tYXRpYyBidXMtb2ZmIG1hbmFnZW1lbnQgKi8NCiAgICBpZiAoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BQk9NID09IEVOQUJMRSkNCiAgICB7DQogICAgICBDQU4tPk1DUiB8PSBDQU5fTUNSX0FCT007DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBDQU4tPk1DUiAmPSB+Q0FOX01DUl9BQk9NOw0KICAgIH0NCg0KICAgIC8qIFNldCB0aGUgYXV0b21hdGljIHdha2UtdXAgbW9kZSAqLw0KICAgIGlmIChDQU5fSW5pdFN0cnVjdC0+Q0FOX0FXVU0gPT0gRU5BQkxFKQ0KICAgIHsNCiAgICAgIENBTi0+TUNSIHw9IENBTl9NQ1JfQVdVTTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIENBTi0+TUNSICY9IH5DQU5fTUNSX0FXVU07DQogICAgfQ0KDQogICAgLyogU2V0IHRoZSBubyBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8NCiAgICBpZiAoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9OQVJUID09IEVOQUJMRSkNCiAgICB7DQogICAgICBDQU4tPk1DUiB8PSBDQU5fTUNSX05BUlQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBDQU4tPk1DUiAmPSB+Q0FOX01DUl9OQVJUOw0KICAgIH0NCg0KICAgIC8qIFNldCB0aGUgcmVjZWl2ZSBGSUZPIGxvY2tlZCBtb2RlICovDQogICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fUkZMTSA9PSBFTkFCTEUpDQogICAgew0KICAgICAgQ0FOLT5NQ1IgfD0gQ0FOX01DUl9SRkxNOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgQ0FOLT5NQ1IgJj0gfkNBTl9NQ1JfUkZMTTsNCiAgICB9DQoNCiAgICAvKiBTZXQgdGhlIHRyYW5zbWl0IEZJRk8gcHJpb3JpdHkgKi8NCiAgICBpZiAoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9UWEZQID09IEVOQUJMRSkNCiAgICB7DQogICAgICBDQU4tPk1DUiB8PSBDQU5fTUNSX1RYRlA7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBDQU4tPk1DUiAmPSB+Q0FOX01DUl9UWEZQOw0KICAgIH0NCg0KICAgIC8qIFNldCB0aGUgYml0IHRpbWluZyByZWdpc3RlciAqLw0KICAgIENBTi0+QlRSID0gKHUzMikoKHUzMilDQU5fSW5pdFN0cnVjdC0+Q0FOX01vZGUgPDwgMzApIHwgKCh1MzIpQ0FOX0luaXRTdHJ1Y3QtPkNBTl9TSlcgPDwgMjQpIHwNCiAgICAgICAgICAgICAgICgodTMyKUNBTl9Jbml0U3RydWN0LT5DQU5fQlMxIDw8IDE2KSB8ICgodTMyKUNBTl9Jbml0U3RydWN0LT5DQU5fQlMyIDw8IDIwKSB8DQogICAgICAgICAgICAgICAoKHUzMilDQU5fSW5pdFN0cnVjdC0+Q0FOX1ByZXNjYWxlciAtIDEpOw0KDQogICAgSW5pdFN0YXR1cyA9IENBTklOSVRPSzsNCg0KICAgIC8qIFJlcXVlc3QgbGVhdmUgaW5pdGlhbGlzYXRpb24gKi8NCiAgICBDQU4tPk1DUiAmPSB+Q0FOX01DUl9JTlJROw0KDQogICAgLyogV2FpdCB0aGUgYWNrbm93bGVkZ2UgKi8NCiAgICBmb3IoV2FpdEFjayA9IDB4NDAwOyBXYWl0QWNrID4gMHgwOyBXYWl0QWNrLS0pDQogICAgew0KICAgIH0NCiAgICANCiAgICAvKiAuLi5hbmQgY2hlY2sgYWNrbm93bGVkZ2VkICovDQogICAgaWYgKChDQU4tPk1TUiAmIENBTl9NU1JfSU5BSykgPT0gQ0FOX01TUl9JTkFLKQ0KICAgIHsNCiAgICAgIEluaXRTdGF0dXMgPSBDQU5JTklURkFJTEVEOw0KICAgIH0NCiAgfQ0KDQogIC8qIEF0IHRoaXMgc3RlcCwgcmV0dXJuIHRoZSBzdGF0dXMgb2YgaW5pdGlhbGl6YXRpb24gKi8NCiAgcmV0dXJuIEluaXRTdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0ZpbHRlckluaXQNCiogRGVzY3JpcHRpb24gICAgOiBJbml0aWFsaXplcyB0aGUgQ0FOIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDQU5fRmlsdGVySW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiBDQU5fRmlsdGVySW5pdFN0cnVjdDogcG9pbnRlciB0byBhIENBTl9GaWx0ZXJJbml0VHlwZURlZg0KKiAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUuDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIENBTl9GaWx0ZXJJbml0KENBTl9GaWx0ZXJJbml0VHlwZURlZiogQ0FOX0ZpbHRlckluaXRTdHJ1Y3QpDQp7DQogIHUxNiBGaWx0ZXJOdW1iZXJfQml0UG9zID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9OVU1CRVIoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJOdW1iZXIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9GSUxURVJfTU9ERShDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9GSUxURVJfU0NBTEUoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJTY2FsZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9GSUZPKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyRklGT0Fzc2lnbm1lbnQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJBY3RpdmF0aW9uKSk7DQoNCiAgRmlsdGVyTnVtYmVyX0JpdFBvcyA9IA0KICAodTE2KSgodTE2KTB4MDAwMSA8PCAoKHUxNilDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcikpOw0KDQogIC8qIEluaXRpYWxpc2F0aW9uIG1vZGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgQ0FOLT5GTVIgfD0gQ0FOX0ZNUl9GSU5JVDsNCg0KICAvKiBGaWx0ZXIgRGVhY3RpdmF0aW9uICovDQogIENBTi0+RkExUiAmPSB+KHUzMilGaWx0ZXJOdW1iZXJfQml0UG9zOw0KDQogIC8qIEZpbHRlciBTY2FsZSAqLw0KICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJTY2FsZSA9PSBDQU5fRmlsdGVyU2NhbGVfMTZiaXQpDQogIHsNCiAgICAvKiAxNi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgICBDQU4tPkZTMVIgJj0gfih1MzIpRmlsdGVyTnVtYmVyX0JpdFBvczsNCg0KICAgIC8qIEZpcnN0IDE2LWJpdCBpZGVudGlmaWVyIGFuZCBGaXJzdCAxNi1iaXQgbWFzayAqLw0KICAgIC8qIE9yIEZpcnN0IDE2LWJpdCBpZGVudGlmaWVyIGFuZCBTZWNvbmQgMTYtYml0IGlkZW50aWZpZXIgKi8NCiAgICBDQU4tPnNGaWx0ZXJSZWdpc3RlcltDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcl0uRlIxID0gDQogICAgKCh1MzIpKCh1MzIpMHgwMDAwRkZGRiAmIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTWFza0lkTG93KSA8PCAxNikgfA0KICAgICAgICAoKHUzMikweDAwMDBGRkZGICYgQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJJZExvdyk7DQoNCiAgICAvKiBTZWNvbmQgMTYtYml0IGlkZW50aWZpZXIgYW5kIFNlY29uZCAxNi1iaXQgbWFzayAqLw0KICAgIC8qIE9yIFRoaXJkIDE2LWJpdCBpZGVudGlmaWVyIGFuZCBGb3VydGggMTYtYml0IGlkZW50aWZpZXIgKi8NCiAgICBDQU4tPnNGaWx0ZXJSZWdpc3RlcltDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcl0uRlIyID0gDQogICAgKCh1MzIpKCh1MzIpMHgwMDAwRkZGRiAmIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTWFza0lkSGlnaCkgPDwgMTYpIHwNCiAgICAgICAgKCh1MzIpMHgwMDAwRkZGRiAmIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVySWRIaWdoKTsNCiAgfQ0KICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJTY2FsZSA9PSBDQU5fRmlsdGVyU2NhbGVfMzJiaXQpDQogIHsNCiAgICAvKiAzMi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgICBDQU4tPkZTMVIgfD0gRmlsdGVyTnVtYmVyX0JpdFBvczsNCg0KICAgIC8qIDMyLWJpdCBpZGVudGlmaWVyIG9yIEZpcnN0IDMyLWJpdCBpZGVudGlmaWVyICovDQogICAgQ0FOLT5zRmlsdGVyUmVnaXN0ZXJbQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJOdW1iZXJdLkZSMSA9IA0KICAgICgodTMyKSgodTMyKTB4MDAwMEZGRkYgJiBDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlcklkSGlnaCkgPDwgMTYpIHwNCiAgICAgICAgKCh1MzIpMHgwMDAwRkZGRiAmIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVySWRMb3cpOw0KDQogICAgLyogMzItYml0IG1hc2sgb3IgU2Vjb25kIDMyLWJpdCBpZGVudGlmaWVyICovDQogICAgQ0FOLT5zRmlsdGVyUmVnaXN0ZXJbQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJOdW1iZXJdLkZSMiA9IA0KICAgICgodTMyKSgodTMyKTB4MDAwMEZGRkYgJiBDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1hc2tJZEhpZ2gpIDw8IDE2KSB8DQogICAgICAgICgodTMyKTB4MDAwMEZGRkYgJiBDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1hc2tJZExvdyk7DQoNCiAgfQ0KDQogIC8qIEZpbHRlciBNb2RlICovDQogIGlmIChDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1vZGUgPT0gQ0FOX0ZpbHRlck1vZGVfSWRNYXNrKQ0KICB7DQogICAgLypJZC9NYXNrIG1vZGUgZm9yIHRoZSBmaWx0ZXIqLw0KICAgIENBTi0+Rk0xUiAmPSB+KHUzMilGaWx0ZXJOdW1iZXJfQml0UG9zOw0KICB9DQogIGVsc2UgLyogQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJNb2RlID09IENBTl9GaWx0ZXJNb2RlX0lkTGlzdCAqLw0KICB7DQogICAgLypJZGVudGlmaWVyIGxpc3QgbW9kZSBmb3IgdGhlIGZpbHRlciovDQogICAgQ0FOLT5GTTFSIHw9ICh1MzIpRmlsdGVyTnVtYmVyX0JpdFBvczsNCiAgfQ0KDQogIC8qIEZpbHRlciBGSUZPIGFzc2lnbm1lbnQgKi8NCiAgaWYgKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyRklGT0Fzc2lnbm1lbnQgPT0gQ0FOX0ZpbHRlckZJRk8wKQ0KICB7DQogICAgLyogRklGTyAwIGFzc2lnbmF0aW9uIGZvciB0aGUgZmlsdGVyICovDQogICAgQ0FOLT5GRkExUiAmPSB+KHUzMilGaWx0ZXJOdW1iZXJfQml0UG9zOw0KICB9DQogIGlmIChDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlckZJRk9Bc3NpZ25tZW50ID09IENBTl9GaWx0ZXJGSUZPMSkNCiAgew0KICAgIC8qIEZJRk8gMSBhc3NpZ25hdGlvbiBmb3IgdGhlIGZpbHRlciAqLw0KICAgIENBTi0+RkZBMVIgfD0gKHUzMilGaWx0ZXJOdW1iZXJfQml0UG9zOw0KICB9DQogIA0KICAvKiBGaWx0ZXIgYWN0aXZhdGlvbiAqLw0KICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJBY3RpdmF0aW9uID09IEVOQUJMRSkNCiAgew0KICAgIENBTi0+RkExUiB8PSBGaWx0ZXJOdW1iZXJfQml0UG9zOw0KICB9DQoNCiAgLyogTGVhdmUgdGhlIGluaXRpYWxpc2F0aW9uIG1vZGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgQ0FOLT5GTVIgJj0gfkNBTl9GTVJfRklOSVQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX1N0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIENBTl9Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IENBTl9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgQ0FOX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaA0KKiAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX1N0cnVjdEluaXQoQ0FOX0luaXRUeXBlRGVmKiBDQU5fSW5pdFN0cnVjdCkNCnsNCiAgLyogUmVzZXQgQ0FOIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovDQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgdGltZSB0cmlnZ2VyZWQgY29tbXVuaWNhdGlvbiBtb2RlICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fVFRDTSA9IERJU0FCTEU7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgYXV0b21hdGljIGJ1cy1vZmYgbWFuYWdlbWVudCAqLw0KICBDQU5fSW5pdFN0cnVjdC0+Q0FOX0FCT00gPSBESVNBQkxFOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIGF1dG9tYXRpYyB3YWtlLXVwIG1vZGUgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BV1VNID0gRElTQUJMRTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBubyBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9OQVJUID0gRElTQUJMRTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIEZJRk8gbG9ja2VkIG1vZGUgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9SRkxNID0gRElTQUJMRTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSB0cmFuc21pdCBGSUZPIHByaW9yaXR5ICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fVFhGUCA9IERJU0FCTEU7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX01vZGUgbWVtYmVyICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fTW9kZSA9IENBTl9Nb2RlX05vcm1hbDsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBDQU5fU0pXIG1lbWJlciAqLw0KICBDQU5fSW5pdFN0cnVjdC0+Q0FOX1NKVyA9IENBTl9TSldfMXRxOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIENBTl9CUzEgbWVtYmVyICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fQlMxID0gQ0FOX0JTMV80dHE7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX0JTMiBtZW1iZXIgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzIgPSBDQU5fQlMyXzN0cTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBDQU5fUHJlc2NhbGVyIG1lbWJlciAqLw0KICBDQU5fSW5pdFN0cnVjdC0+Q0FOX1ByZXNjYWxlciA9IDE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0lUQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIENBTiBpbnRlcnJ1cHRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQ0FOX0lUOiBzcGVjaWZpZXMgdGhlIENBTiBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yDQoqICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogQ0FOX0lUX1RNRSwgQ0FOX0lUX0ZNUDAsIENBTl9JVF9GRjAsDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9GT1YwLCBDQU5fSVRfRk1QMSwgQ0FOX0lUX0ZGMSwNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX0ZPVjEsIENBTl9JVF9FV0csIENBTl9JVF9FUFYsDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9MRUMsIENBTl9JVF9FUlIsIENBTl9JVF9XS1Ugb3INCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0lUX1NMSy4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIENBTiBpbnRlcnJ1cHRzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBDQU5fSVRDb25maWcodTMyIENBTl9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0lUQ29uZmlnKENBTl9JVCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBDQU4gaW50ZXJydXB0ICovDQogICAgQ0FOLT5JRVIgfD0gQ0FOX0lUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIENBTiBpbnRlcnJ1cHQgKi8NCiAgICBDQU4tPklFUiAmPSB+Q0FOX0lUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX1RyYW5zbWl0DQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhdGVzIHRoZSB0cmFuc21pc3Npb24gb2YgYSBtZXNzYWdlLg0KKiBJbnB1dCAgICAgICAgICA6IFR4TWVzc2FnZTogcG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBDQU4gSWQsIENBTg0KKiAgICAgICAgICAgICAgICAgIERMQyBhbmQgQ0FOIGRhdGFzLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUuDQoqIFJldHVybiAgICAgICAgIDogVGhlIG51bWJlciBvZiB0aGUgbWFpbGJveCB0aGF0IGlzIHVzZWQgZm9yIHRyYW5zbWlzc2lvbg0KKiAgICAgICAgICAgICAgICAgIG9yIENBTl9OT19NQiBpZiB0aGVyZSBpcyBubyBlbXB0eSBtYWlsYm94Lg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnU4IENBTl9UcmFuc21pdChDYW5UeE1zZyogVHhNZXNzYWdlKQ0Kew0KICB1OCBUcmFuc21pdE1haWxib3ggPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fU1RESUQoVHhNZXNzYWdlLT5TdGRJZCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0VYVElEKFR4TWVzc2FnZS0+U3RkSWQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9JRFRZUEUoVHhNZXNzYWdlLT5JREUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9SVFIoVHhNZXNzYWdlLT5SVFIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9ETEMoVHhNZXNzYWdlLT5ETEMpKTsNCg0KICAvKiBTZWxlY3Qgb25lIGVtcHR5IHRyYW5zbWl0IG1haWxib3ggKi8NCiAgaWYgKChDQU4tPlRTUiZDQU5fVFNSX1RNRTApID09IENBTl9UU1JfVE1FMCkNCiAgew0KICAgIFRyYW5zbWl0TWFpbGJveCA9IDA7DQogIH0NCiAgZWxzZSBpZiAoKENBTi0+VFNSJkNBTl9UU1JfVE1FMSkgPT0gQ0FOX1RTUl9UTUUxKQ0KICB7DQogICAgVHJhbnNtaXRNYWlsYm94ID0gMTsNCiAgfQ0KICBlbHNlIGlmICgoQ0FOLT5UU1ImQ0FOX1RTUl9UTUUyKSA9PSBDQU5fVFNSX1RNRTIpDQogIHsNCiAgICBUcmFuc21pdE1haWxib3ggPSAyOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFRyYW5zbWl0TWFpbGJveCA9IENBTl9OT19NQjsNCiAgfQ0KDQogIGlmIChUcmFuc21pdE1haWxib3ggIT0gQ0FOX05PX01CKQ0KICB7DQogICAgLyogU2V0IHVwIHRoZSBJZCAqLw0KICAgIENBTi0+c1R4TWFpbEJveFtUcmFuc21pdE1haWxib3hdLlRJUiAmPSBDQU5fVE1JRHhSX1RYUlE7DQogICAgaWYgKFR4TWVzc2FnZS0+SURFID09IENBTl9JRF9TVEQpDQogICAgew0KICAgICAgVHhNZXNzYWdlLT5TdGRJZCAmPSAodTMyKTB4MDAwMDA3RkY7DQogICAgICBUeE1lc3NhZ2UtPlN0ZElkID0gVHhNZXNzYWdlLT5TdGRJZCA8PCAyMTsNCiAgICAgIA0KICAgICAgQ0FOLT5zVHhNYWlsQm94W1RyYW5zbWl0TWFpbGJveF0uVElSIHw9IChUeE1lc3NhZ2UtPlN0ZElkIHwgVHhNZXNzYWdlLT5JREUgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeE1lc3NhZ2UtPlJUUik7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBUeE1lc3NhZ2UtPkV4dElkICY9ICh1MzIpMHgxRkZGRkZGRjsNCiAgICAgIFR4TWVzc2FnZS0+RXh0SWQgPDw9IDM7DQoNCiAgICAgIENBTi0+c1R4TWFpbEJveFtUcmFuc21pdE1haWxib3hdLlRJUiB8PSAoVHhNZXNzYWdlLT5FeHRJZCB8IFR4TWVzc2FnZS0+SURFIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4TWVzc2FnZS0+UlRSKTsNCiAgICB9DQogICAgDQogICAgLyogU2V0IHVwIHRoZSBETEMgKi8NCiAgICBUeE1lc3NhZ2UtPkRMQyAmPSAodTgpMHgwMDAwMDAwRjsNCiAgICBDQU4tPnNUeE1haWxCb3hbVHJhbnNtaXRNYWlsYm94XS5URFRSICY9ICh1MzIpMHhGRkZGRkZGMDsNCiAgICBDQU4tPnNUeE1haWxCb3hbVHJhbnNtaXRNYWlsYm94XS5URFRSIHw9IFR4TWVzc2FnZS0+RExDOw0KDQogICAgLyogU2V0IHVwIHRoZSBkYXRhIGZpZWxkICovDQogICAgQ0FOLT5zVHhNYWlsQm94W1RyYW5zbWl0TWFpbGJveF0uVERMUiA9ICgoKHUzMilUeE1lc3NhZ2UtPkRhdGFbM10gPDwgMjQpIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMilUeE1lc3NhZ2UtPkRhdGFbMl0gPDwgMTYpIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKVR4TWVzc2FnZS0+RGF0YVsxXSA8PCA4KSB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpVHhNZXNzYWdlLT5EYXRhWzBdKSk7DQogICAgQ0FOLT5zVHhNYWlsQm94W1RyYW5zbWl0TWFpbGJveF0uVERIUiA9ICgoKHUzMilUeE1lc3NhZ2UtPkRhdGFbN10gPDwgMjQpIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMilUeE1lc3NhZ2UtPkRhdGFbNl0gPDwgMTYpIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKVR4TWVzc2FnZS0+RGF0YVs1XSA8PCA4KSB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMilUeE1lc3NhZ2UtPkRhdGFbNF0pKTsNCg0KICAgIC8qIFJlcXVlc3QgdHJhbnNtaXNzaW9uICovDQogICAgQ0FOLT5zVHhNYWlsQm94W1RyYW5zbWl0TWFpbGJveF0uVElSIHw9IENBTl9UTUlEeFJfVFhSUTsNCiAgfQ0KDQogIHJldHVybiBUcmFuc21pdE1haWxib3g7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX1RyYW5zbWl0U3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHRoZSB0cmFuc21pc3Npb24gb2YgYSBtZXNzYWdlLg0KKiBJbnB1dCAgICAgICAgICA6IFRyYW5zbWl0TWFpbGJveDogdGhlIG51bWJlciBvZiB0aGUgbWFpbGJveCB0aGF0IGlzIHVzZWQgZm9yDQoqICAgICAgICAgICAgICAgICAgdHJhbnNtaXNzaW9uLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUuDQoqIFJldHVybiAgICAgICAgIDogQ0FOVFhPSyBpZiB0aGUgQ0FOIGRyaXZlciB0cmFuc21pdHMgdGhlIG1lc3NhZ2UsIENBTlRYRkFJTEVEDQoqICAgICAgICAgICAgICAgICAgaW4gYW4gb3RoZXIgY2FzZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1OCBDQU5fVHJhbnNtaXRTdGF0dXModTggVHJhbnNtaXRNYWlsYm94KQ0Kew0KICAvKiBSUUNQLCBUWE9LIGFuZCBUTUUgYml0cyAqLw0KICB1OCBTdGF0ZSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9UUkFOU01JVE1BSUxCT1goVHJhbnNtaXRNYWlsYm94KSk7DQoNCiAgc3dpdGNoIChUcmFuc21pdE1haWxib3gpDQogIHsNCiAgICBjYXNlICgwKTogU3RhdGUgfD0gKHU4KSgoQ0FOLT5UU1IgJiBDQU5fVFNSX1JRQ1AwKSA8PCAyKTsNCiAgICAgIFN0YXRlIHw9ICh1OCkoKENBTi0+VFNSICYgQ0FOX1RTUl9UWE9LMCkgPj4gMCk7DQogICAgICBTdGF0ZSB8PSAodTgpKChDQU4tPlRTUiAmIENBTl9UU1JfVE1FMCkgPj4gMjYpOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSAoMSk6IFN0YXRlIHw9ICh1OCkoKENBTi0+VFNSICYgQ0FOX1RTUl9SUUNQMSkgPj4gNik7DQogICAgICBTdGF0ZSB8PSAodTgpKChDQU4tPlRTUiAmIENBTl9UU1JfVFhPSzEpID4+IDgpOw0KICAgICAgU3RhdGUgfD0gKHU4KSgoQ0FOLT5UU1IgJiBDQU5fVFNSX1RNRTEpID4+IDI3KTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgKDIpOiBTdGF0ZSB8PSAodTgpKChDQU4tPlRTUiAmIENBTl9UU1JfUlFDUDIpID4+IDE0KTsNCiAgICAgIFN0YXRlIHw9ICh1OCkoKENBTi0+VFNSICYgQ0FOX1RTUl9UWE9LMikgPj4gMTYpOw0KICAgICAgU3RhdGUgfD0gKHU4KSgoQ0FOLT5UU1IgJiBDQU5fVFNSX1RNRTIpID4+IDI4KTsNCiAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQ6DQogICAgICBTdGF0ZSA9IENBTlRYRkFJTEVEOw0KICAgICAgYnJlYWs7DQogIH0NCg0KICBzd2l0Y2ggKFN0YXRlKQ0KICB7DQogICAgICAvKiB0cmFuc21pdCBwZW5kaW5nICAqLw0KICAgIGNhc2UgKDB4MCk6IFN0YXRlID0gQ0FOVFhQRU5ESU5HOw0KICAgICAgYnJlYWs7DQogICAgICAvKiB0cmFuc21pdCBmYWlsZWQgICovDQogICAgY2FzZSAoMHg1KTogU3RhdGUgPSBDQU5UWEZBSUxFRDsNCiAgICAgIGJyZWFrOw0KICAgICAgLyogdHJhbnNtaXQgc3VjY2VkZWVkICAqLw0KICAgIGNhc2UgKDB4Nyk6IFN0YXRlID0gQ0FOVFhPSzsNCiAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQ6DQogICAgICBTdGF0ZSA9IENBTlRYRkFJTEVEOw0KICAgICAgYnJlYWs7DQogIH0NCg0KICByZXR1cm4gU3RhdGU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0NhbmNlbFRyYW5zbWl0DQoqIERlc2NyaXB0aW9uICAgIDogQ2FuY2VscyBhIHRyYW5zbWl0IHJlcXVlc3QuDQoqIElucHV0ICAgICAgICAgIDogTWFpbGJveCBudW1iZXIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX0NhbmNlbFRyYW5zbWl0KHU4IE1haWxib3gpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fVFJBTlNNSVRNQUlMQk9YKE1haWxib3gpKTsNCg0KICAvKiBhYm9ydCB0cmFuc21pc3Npb24gKi8NCiAgc3dpdGNoIChNYWlsYm94KQ0KICB7DQogICAgY2FzZSAoMCk6IENBTi0+VFNSIHw9IENBTl9UU1JfQUJSUTA7DQogICAgICBicmVhazsNCiAgICBjYXNlICgxKTogQ0FOLT5UU1IgfD0gQ0FOX1RTUl9BQlJRMTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgKDIpOiBDQU4tPlRTUiB8PSBDQU5fVFNSX0FCUlEyOw0KICAgICAgYnJlYWs7DQogICAgZGVmYXVsdDoNCiAgICAgIGJyZWFrOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0ZJRk9SZWxlYXNlDQoqIERlc2NyaXB0aW9uICAgIDogUmVsZWFzZXMgYSBGSUZPLg0KKiBJbnB1dCAgICAgICAgICA6IEZJRk9OdW1iZXI6IEZJRk8gdG8gcmVsZWFzZSwgQ0FOX0ZJRk8wIG9yIENBTl9GSUZPMS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBDQU5fRklGT1JlbGVhc2UodTggRklGT051bWJlcikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9GSUZPKEZJRk9OdW1iZXIpKTsNCg0KICAvKiBSZWxlYXNlIEZJRk8wICovDQogIGlmIChGSUZPTnVtYmVyID09IENBTl9GSUZPMCkNCiAgew0KICAgIENBTi0+UkYwUiA9IENBTl9SRjBSX1JGT00wOw0KICB9DQogIC8qIFJlbGVhc2UgRklGTzEgKi8NCiAgZWxzZSAvKiBGSUZPTnVtYmVyID09IENBTl9GSUZPMSAqLw0KICB7DQogICAgQ0FOLT5SRjFSID0gQ0FOX1JGMVJfUkZPTTE7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDQU5fTWVzc2FnZVBlbmRpbmcNCiogRGVzY3JpcHRpb24gICAgOiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGVuZGluZyBtZXNzYWdlcy4NCiogSW5wdXQgICAgICAgICAgOiBGSUZPTnVtYmVyOiBSZWNlaXZlIEZJRk8gbnVtYmVyLCBDQU5fRklGTzAgb3IgQ0FOX0ZJRk8xLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUuDQoqIFJldHVybiAgICAgICAgIDogTmJNZXNzYWdlIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgcGVuZGluZyBtZXNzYWdlLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnU4IENBTl9NZXNzYWdlUGVuZGluZyh1OCBGSUZPTnVtYmVyKQ0Kew0KICB1OCBNZXNzYWdlUGVuZGluZz0wOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fRklGTyhGSUZPTnVtYmVyKSk7DQoNCiAgaWYgKEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8wKQ0KICB7DQogICAgTWVzc2FnZVBlbmRpbmcgPSAodTgpKENBTi0+UkYwUiYodTMyKTB4MDMpOw0KICB9DQogIGVsc2UgaWYgKEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8xKQ0KICB7DQogICAgTWVzc2FnZVBlbmRpbmcgPSAodTgpKENBTi0+UkYxUiYodTMyKTB4MDMpOw0KICB9DQogIGVsc2UNCiAgew0KICAgIE1lc3NhZ2VQZW5kaW5nID0gMDsNCiAgfQ0KICByZXR1cm4gTWVzc2FnZVBlbmRpbmc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX1JlY2VpdmUNCiogRGVzY3JpcHRpb24gICAgOiBSZWNlaXZlcyBhIG1lc3NhZ2UuDQoqIElucHV0ICAgICAgICAgIDogRklGT051bWJlcjogUmVjZWl2ZSBGSUZPIG51bWJlciwgQ0FOX0ZJRk8wIG9yIENBTl9GSUZPMS4NCiogT3V0cHV0ICAgICAgICAgOiBSeE1lc3NhZ2U6IHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgQ0FOIElkLA0KKiAgICAgICAgICAgICAgICAgIENBTiBETEMsIENBTiBkYXRhcyBhbmQgRk1JIG51bWJlci4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX1JlY2VpdmUodTggRklGT051bWJlciwgQ2FuUnhNc2cqIFJ4TWVzc2FnZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9GSUZPKEZJRk9OdW1iZXIpKTsNCg0KICAvKiBHZXQgdGhlIElkICovDQogIFJ4TWVzc2FnZS0+SURFID0gKHU4KTB4MDQgJiBDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVI7DQogIGlmIChSeE1lc3NhZ2UtPklERSA9PSBDQU5fSURfU1REKQ0KICB7DQogICAgUnhNZXNzYWdlLT5TdGRJZCA9ICh1MzIpMHgwMDAwMDdGRiAmIChDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVIgPj4gMjEpOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFJ4TWVzc2FnZS0+RXh0SWQgPSAodTMyKTB4MUZGRkZGRkYgJiAoQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUklSID4+IDMpOw0KICB9DQogIA0KICBSeE1lc3NhZ2UtPlJUUiA9ICh1OCkweDAyICYgQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUklSOw0KDQogIC8qIEdldCB0aGUgRExDICovDQogIFJ4TWVzc2FnZS0+RExDID0gKHU4KTB4MEYgJiBDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRFRSOw0KDQogIC8qIEdldCB0aGUgRk1JICovDQogIFJ4TWVzc2FnZS0+Rk1JID0gKHU4KTB4RkYgJiAoQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRUUiA+PiA4KTsNCg0KICAvKiBHZXQgdGhlIGRhdGEgZmllbGQgKi8NCiAgUnhNZXNzYWdlLT5EYXRhWzBdID0gKHU4KTB4RkYgJiBDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSOw0KICBSeE1lc3NhZ2UtPkRhdGFbMV0gPSAodTgpMHhGRiAmIChDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSID4+IDgpOw0KICBSeE1lc3NhZ2UtPkRhdGFbMl0gPSAodTgpMHhGRiAmIChDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSID4+IDE2KTsNCiAgUnhNZXNzYWdlLT5EYXRhWzNdID0gKHU4KTB4RkYgJiAoQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRMUiA+PiAyNCk7DQoNCiAgUnhNZXNzYWdlLT5EYXRhWzRdID0gKHU4KTB4RkYgJiBDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSOw0KICBSeE1lc3NhZ2UtPkRhdGFbNV0gPSAodTgpMHhGRiAmIChDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSID4+IDgpOw0KICBSeE1lc3NhZ2UtPkRhdGFbNl0gPSAodTgpMHhGRiAmIChDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSID4+IDE2KTsNCiAgUnhNZXNzYWdlLT5EYXRhWzddID0gKHU4KTB4RkYgJiAoQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRIUiA+PiAyNCk7DQoNCiAgLyogUmVsZWFzZSB0aGUgRklGTyAqLw0KICBDQU5fRklGT1JlbGVhc2UoRklGT051bWJlcik7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX1NsZWVwDQoqIERlc2NyaXB0aW9uICAgIDogRW50ZXJzIHRoZSBsb3cgcG93ZXIgbW9kZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUuDQoqIFJldHVybiAgICAgICAgIDogQ0FOU0xFRVBPSyBpZiBzbGVlcCBlbnRlcmVkLCBDQU5TTEVFUEZBSUxFRCBpbiBhbiBvdGhlciBjYXNlLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnU4IENBTl9TbGVlcCh2b2lkKQ0Kew0KICB1OCBTbGVlcFN0YXR1cyA9IDA7DQoNCiAgLyogU2xlZXAgbW9kZSBlbnRlcmluZyByZXF1ZXN0ICovDQogIENBTi0+TUNSIHw9IENBTl9NQ1JfU0xFRVA7DQogIFNsZWVwU3RhdHVzID0gQ0FOU0xFRVBPSzsNCg0KICAvKiBTbGVlcCBtb2RlIHN0YXR1cyAqLw0KICBpZiAoKENBTi0+TUNSJkNBTl9NQ1JfU0xFRVApID09IDApDQogIHsNCiAgICAvKiBTbGVlcCBtb2RlIG5vdCBlbnRlcmVkICovDQogICAgU2xlZXBTdGF0dXMgPSBDQU5TTEVFUEZBSUxFRDsNCiAgfQ0KDQogIC8qIEF0IHRoaXMgc3RlcCwgc2xlZXAgbW9kZSBzdGF0dXMgKi8NCiAgcmV0dXJuIFNsZWVwU3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IENBTl9XYWtlVXANCiogRGVzY3JpcHRpb24gICAgOiBXYWtlcyB0aGUgQ0FOIHVwLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBDQU5XQUtFVVBPSyBpZiBzbGVlcCBtb2RlIGxlZnQsIENBTldBS0VVUEZBSUxFRCBpbiBhbiBvdGhlcg0KKiAgICAgICAgICAgICAgICAgIGNhc2UuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTggQ0FOX1dha2VVcCh2b2lkKQ0Kew0KICB1OCBXYWtlVXBTdGF0dXMgPSAwOw0KDQogIC8qIFdha2UgdXAgcmVxdWVzdCAqLw0KICBDQU4tPk1DUiAmPSB+Q0FOX01DUl9TTEVFUDsNCiAgV2FrZVVwU3RhdHVzID0gQ0FOV0FLRVVQRkFJTEVEOw0KDQogIC8qIFNsZWVwIG1vZGUgc3RhdHVzICovDQogIGlmICgoQ0FOLT5NQ1ImQ0FOX01DUl9TTEVFUCkgPT0gMCkNCiAgew0KICAgIC8qIFNsZWVwIG1vZGUgZXhpdGVkICovDQogICAgV2FrZVVwU3RhdHVzID0gQ0FOV0FLRVVQT0s7DQogIH0NCg0KICAvKiBBdCB0aGlzIHN0ZXAsIHNsZWVwIG1vZGUgc3RhdHVzICovDQogIHJldHVybiBXYWtlVXBTdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0dldEZsYWdTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIENBTiBmbGFnIGlzIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogQ0FOX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IENBTl9GTEFHX0VXRywgQ0FOX0ZMQUdfRVBWIG9yDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fRkxBR19CT0YuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIENBTl9GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgQ0FOX0dldEZsYWdTdGF0dXModTMyIENBTl9GTEFHKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fRkxBRyhDQU5fRkxBRykpOw0KDQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBDQU4gZmxhZyAqLw0KICBpZiAoKENBTi0+RVNSICYgQ0FOX0ZMQUcpICE9ICh1MzIpUkVTRVQpDQogIHsNCiAgICAvKiBDQU5fRkxBRyBpcyBzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogQ0FOX0ZMQUcgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIENBTl9GTEFHIHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDQU5fQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBDQU4ncyBwZW5kaW5nIGZsYWdzLg0KKiBJbnB1dCAgICAgICAgICA6IENBTl9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX0NsZWFyRmxhZyh1MzIgQ0FOX0ZMQUcpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fRkxBRyhDQU5fRkxBRykpOw0KDQogIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBDQU4gZmxhZ3MgKi8NCiAgQ0FOLT5FU1IgJj0gfkNBTl9GTEFHOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IENBTl9HZXRJVFN0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ0FOIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3IgDQoqICAgICAgICAgICAgICAgICAgbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IENBTl9JVDogc3BlY2lmaWVzIHRoZSBDQU4gaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IENBTl9JVF9SUUNQMCwgQ0FOX0lUX1JRQ1AxLCBDQU5fSVRfUlFDUDIsDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fSVRfRkYwLCBDQU5fSVRfRk9WMCwgQ0FOX0lUX0ZGMSwNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9GT1YxLCBDQU5fSVRfRVdHLCBDQU5fSVRfRVBWLCANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9JVF9CT0YsIENBTl9JVF9XS1Ugb3IgQ0FOX0lUX1NMSy4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgQ0FOX0lUIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIENBTl9HZXRJVFN0YXR1cyh1MzIgQ0FOX0lUKQ0Kew0KICBJVFN0YXR1cyBwZW5kaW5nYml0c3RhdHVzID0gUkVTRVQ7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9JVFN0YXR1cyhDQU5fSVQpKTsNCg0KICBzd2l0Y2ggKENBTl9JVCkNCiAgew0KICAgIGNhc2UgQ0FOX0lUX1JRQ1AwOg0KICAgICAgcGVuZGluZ2JpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOLT5UU1IsIENBTl9UU1JfUlFDUDApOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfUlFDUDE6DQogICAgICBwZW5kaW5nYml0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU4tPlRTUiwgQ0FOX1RTUl9SUUNQMSk7DQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9SUUNQMjoNCiAgICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTi0+VFNSLCBDQU5fVFNSX1JRQ1AyKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX0ZGMDoNCiAgICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTi0+UkYwUiwgQ0FOX1JGMFJfRlVMTDApOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfRk9WMDoNCiAgICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTi0+UkYwUiwgQ0FOX1JGMFJfRk9WUjApOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfRkYxOg0KICAgICAgcGVuZGluZ2JpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOLT5SRjFSLCBDQU5fUkYxUl9GVUxMMSk7DQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9GT1YxOg0KICAgICAgcGVuZGluZ2JpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOLT5SRjFSLCBDQU5fUkYxUl9GT1ZSMSk7DQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9FV0c6DQogICAgICBwZW5kaW5nYml0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU4tPkVTUiwgQ0FOX0VTUl9FV0dGKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX0VQVjoNCiAgICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTi0+RVNSLCBDQU5fRVNSX0VQVkYpOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfQk9GOg0KICAgICAgcGVuZGluZ2JpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOLT5FU1IsIENBTl9FU1JfQk9GRik7DQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9TTEs6DQogICAgICBwZW5kaW5nYml0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU4tPk1TUiwgQ0FOX01TUl9TTEFLSSk7DQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9XS1U6DQogICAgICBwZW5kaW5nYml0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU4tPk1TUiwgQ0FOX01TUl9XS1VJKTsNCiAgICAgIGJyZWFrOw0KDQogICAgZGVmYXVsdCA6DQogICAgICBwZW5kaW5nYml0c3RhdHVzID0gUkVTRVQ7DQogICAgICBicmVhazsNCiAgfQ0KDQogIC8qIFJldHVybiB0aGUgQ0FOX0lUIHN0YXR1cyAqLw0KICByZXR1cm4gIHBlbmRpbmdiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0NsZWFySVRQZW5kaW5nQml0DQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBDQU6ScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IENBTl9JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX0NsZWFySVRQZW5kaW5nQml0KHUzMiBDQU5fSVQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fSVRTdGF0dXMoQ0FOX0lUKSk7DQoNCiAgc3dpdGNoIChDQU5fSVQpDQogIHsNCiAgICBjYXNlIENBTl9JVF9SUUNQMDoNCiAgICAgIENBTi0+VFNSID0gQ0FOX1RTUl9SUUNQMDsgLyogcmNfdzEqLw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfUlFDUDE6DQogICAgICBDQU4tPlRTUiA9IENBTl9UU1JfUlFDUDE7IC8qIHJjX3cxKi8NCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX1JRQ1AyOg0KICAgICAgQ0FOLT5UU1IgPSBDQU5fVFNSX1JRQ1AyOyAvKiByY193MSovDQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9GRjA6DQogICAgICBDQU4tPlJGMFIgPSBDQU5fUkYwUl9GVUxMMDsgLyogcmNfdzEqLw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfRk9WMDoNCiAgICAgIENBTi0+UkYwUiA9IENBTl9SRjBSX0ZPVlIwOyAvKiByY193MSovDQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9GRjE6DQogICAgICBDQU4tPlJGMVIgPSBDQU5fUkYxUl9GVUxMMTsgLyogcmNfdzEqLw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfRk9WMToNCiAgICAgIENBTi0+UkYxUiA9IENBTl9SRjFSX0ZPVlIxOyAvKiByY193MSovDQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9FV0c6DQogICAgICBDQU4tPkVTUiAmPSB+IENBTl9FU1JfRVdHRjsgLyogcncgKi8NCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX0VQVjoNCiAgICAgIENBTi0+RVNSICY9IH4gQ0FOX0VTUl9FUFZGOyAvKiBydyAqLw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfQk9GOg0KICAgICAgQ0FOLT5FU1IgJj0gfiBDQU5fRVNSX0JPRkY7IC8qIHJ3ICovDQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9XS1U6DQogICAgICBDQU4tPk1TUiA9IENBTl9NU1JfV0tVSTsgIC8qIHJjX3cxKi8NCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX1NMSzoNCiAgICAgIENBTi0+TVNSID0gQ0FOX01TUl9TTEFLSTsgIC8qIHJjX3cxKi8NCiAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQgOg0KICAgICAgYnJlYWs7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDaGVja0lUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIENBTiBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiBDQU5fUmVnOiBzcGVjaWZpZXMgdGhlIENBTiBpbnRlcnJ1cHQgcmVnaXN0ZXIgdG8gY2hlY2suDQoqICAgICAgICAgICAgICAgICAgSXRfQml0OiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgYml0IHRvIGNoZWNrLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUuDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiB0aGUgQ0FOIEludGVycnVwdCAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgSVRTdGF0dXMgQ2hlY2tJVFN0YXR1cyh1MzIgQ0FOX1JlZywgdTMyIEl0X0JpdCkNCnsNCiAgSVRTdGF0dXMgcGVuZGluZ2JpdHN0YXR1cyA9IFJFU0VUOw0KDQogIGlmICgoQ0FOX1JlZyAmIEl0X0JpdCkgIT0gKHUzMilSRVNFVCkNCiAgew0KICAgIC8qIENBTl9JVCBpcyBzZXQgKi8NCiAgICBwZW5kaW5nYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIENBTl9JVCBpcyByZXNldCAqLw0KICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KDQogIHJldHVybiBwZW5kaW5nYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDggU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K