LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMybDF4eF90aW0uYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjEuMC4wUkMxDQogICogQGRhdGUgICAgMDcvMDIvMjAxMA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFRJTSBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmwxeHhfdGltLmgiDQojaW5jbHVkZSAic3RtMzJsMXh4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJMMXh4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFRJTSANCiAgKiBAYnJpZWYgVElNIGRyaXZlciBtb2R1bGVzDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUSU0gcmVnaXN0ZXJzIGJpdCBtYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KI2RlZmluZSBTTUNSX0VUUl9NQVNLICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwRkYpIA0KI2RlZmluZSBDQ01SX09GRlNFVCAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMTgpDQojZGVmaW5lIENDRVJfQ0NFX1NFVCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMSkgIA0KICANCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfTWFjcm9zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9WYXJpYWJsZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KICAqIEB7DQogICovDQoNCnN0YXRpYyB2b2lkIFRJMV9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9JQ0ZpbHRlcik7DQpzdGF0aWMgdm9pZCBUSTJfQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgVElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpOw0Kc3RhdGljIHZvaWQgVEkzX0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUG9sYXJpdHksIHVpbnQxNl90IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgVElNX0lDRmlsdGVyKTsNCnN0YXRpYyB2b2lkIFRJNF9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9JQ0ZpbHRlcik7DQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX01hY3Jvcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfVmFyaWFibGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX0Z1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgVElNeCBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIgdG8gMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKiAgIA0KICAqLw0Kdm9pZCBUSU1fRGVJbml0KFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOyANCiAgIA0KICBpZiAoVElNeCA9PSBUSU0yKQ0KICB7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU0yLCBFTkFCTEUpOw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMiwgRElTQUJMRSk7DQogIH0NCiAgZWxzZSBpZiAoVElNeCA9PSBUSU0zKQ0KICB7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU0zLCBFTkFCTEUpOw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMywgRElTQUJMRSk7DQogIH0NCiAgZWxzZSBpZiAoVElNeCA9PSBUSU00KQ0KICB7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU00LCBFTkFCTEUpOw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNCwgRElTQUJMRSk7DQogIH0gDQoNCiAgZWxzZSBpZiAoVElNeCA9PSBUSU02KQ0KICB7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU02LCBFTkFCTEUpOw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNiwgRElTQUJMRSk7DQogIH0gDQogIGVsc2UgaWYgKFRJTXggPT0gVElNNykNCiAgew0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNywgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTcsIERJU0FCTEUpOw0KICB9IA0KDQogIGVsc2UgaWYgKFRJTXggPT0gVElNOSkNCiAgew0KICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNOSwgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTksIERJU0FCTEUpOw0KICB9IA0KICBlbHNlIGlmIChUSU14ID09IFRJTTEwKQ0KICB7DQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU0xMCwgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTEwLCBESVNBQkxFKTsNCiAgfSANCiAgZWxzZQ0KICB7DQogICAgaWYgKFRJTXggPT0gVElNMTEpDQogICAgew0KICAgICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU0xMSwgRU5BQkxFKTsNCiAgICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMTEsIERJU0FCTEUpOyANCiAgICB9ICANCiAgfQ0KICAgICANCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNeCBUaW1lIEJhc2UgVW5pdCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byANCiAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgVElNX1RpbWVCYXNlSW5pdFN0cnVjdC4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIgdG8gMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fVGltZUJhc2VJbml0VHlwZURlZg0KICAqICAgICAgICAgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yDQogICogICAgICAgICB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fVGltZUJhc2VJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fVGltZUJhc2VJbml0VHlwZURlZiogVElNX1RpbWVCYXNlSW5pdFN0cnVjdCkNCnsNCiAgdWludDE2X3QgdG1wY3IxID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoVElNX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNX0NvdW50ZXJNb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fQ0tEX0RJVihUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ2xvY2tEaXZpc2lvbikpOw0KDQogIHRtcGNyMSA9IFRJTXgtPkNSMTsgIA0KDQogIGlmKCgoVElNeCkgPT0gVElNMikgfHwgKChUSU14KSA9PSBUSU0zKSB8fCAoKFRJTXgpID09IFRJTTQpKQ0KICB7CQkJCQkJCQkJCQkNCiAgICAvKiBTZWxlY3QgdGhlIENvdW50ZXIgTW9kZSAqLw0KICAgIHRtcGNyMSAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KShUSU1fQ1IxX0RJUiB8IFRJTV9DUjFfQ01TKSkpOw0KICAgIHRtcGNyMSB8PSAodWludDMyX3QpVElNX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNX0NvdW50ZXJNb2RlOw0KICB9DQogDQogIGlmKCgoVElNeCkgIT0gVElNNikgJiYgKChUSU14KSAhPSBUSU03KSkNCiAgew0KICAgIC8qIFNldCB0aGUgY2xvY2sgZGl2aXNpb24gKi8NCiAgICB0bXBjcjEgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ1IxX0NLRCkpOw0KICAgIHRtcGNyMSB8PSAodWludDMyX3QpVElNX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNX0Nsb2NrRGl2aXNpb247DQogIH0NCg0KICBUSU14LT5DUjEgPSB0bXBjcjE7DQoNCiAgLyogU2V0IHRoZSBBdXRvcmVsb2FkIHZhbHVlICovDQogIFRJTXgtPkFSUiA9IFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QZXJpb2QgOw0KIA0KICAvKiBTZXQgdGhlIFByZXNjYWxlciB2YWx1ZSAqLw0KICBUSU14LT5QU0MgPSBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fUHJlc2NhbGVyOw0KICAgIA0KICAvKiBHZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQgdG8gcmVsb2FkIHRoZSBQcmVzY2FsZXIgdmFsdWUgaW1tZWRpYXRseSAqLw0KICBUSU14LT5FR1IgPSBUSU1fUFNDUmVsb2FkTW9kZV9JbW1lZGlhdGU7ICAgICAgICAgIA0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU14IENoYW5uZWwxIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQogICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fT0NJbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCwgOSwgMTAgb3IgMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fT0NJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNIA0KICAqICAgICAgICAgcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DMUluaXQoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9PQ0luaXRUeXBlRGVmKiBUSU1fT0NJbml0U3RydWN0KQ0Kew0KICB1aW50MTZfdCB0bXBjY21yeCA9IDAsIHRtcGNjZXIgPSAwOw0KICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsgDQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfTU9ERShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT1VUUFVUX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5KSk7ICAgDQogIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovDQogIFRJTXgtPkNDRVIgJj0gKHVpbnQxNl90KSh+KHVpbnQxNl90KVRJTV9DQ0VSX0NDMUUpOw0KICANCiAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIA0KICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NtcnggPSBUSU14LT5DQ01SMTsNCiAgICANCiAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgQml0cyAqLw0KICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMV9PQzFNKSk7DQogIHRtcGNjbXJ4ICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDTVIxX0NDMVMpKTsNCiAgDQogIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLw0KICB0bXBjY21yeCB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlOw0KICANCiAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLw0KICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MxUCkpOw0KICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovDQogIHRtcGNjZXIgfD0gVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHk7DQogIA0KICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLw0KICB0bXBjY2VyIHw9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZTsNCiAgDQogIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNDUjEgPSBUSU1fT0NJbml0U3RydWN0LT5USU1fUHVsc2U7DQogIA0KICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovDQogIFRJTXgtPkNDTVIxID0gdG1wY2Ntcng7DQogIA0KICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTXggQ2hhbm5lbDIgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ0luaXRTdHJ1Y3QuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0IG9yIDkgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fT0NJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNIA0KICAqICAgICAgICAgcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DMkluaXQoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9PQ0luaXRUeXBlRGVmKiBUSU1fT0NJbml0U3RydWN0KQ0Kew0KICB1aW50MTZfdCB0bXBjY21yeCA9IDAsIHRtcGNjZXIgPSAwOw0KICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OV9QRVJJUEgoVElNeCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19NT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVRfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkpKTsgICANCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMkUpKTsNCiAgDQogIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovICANCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIA0KICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NtcnggPSBUSU14LT5DQ01SMTsNCiAgICANCiAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgQml0cyAqLw0KICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMV9PQzJNKSk7DQogIA0KICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8NCiAgdG1wY2NtcnggfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlIDw8IDgpOw0KICANCiAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLw0KICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MyUCkpOw0KICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovDQogIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NQb2xhcml0eSA8PCA0KTsNCiAgDQogIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovDQogIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT3V0cHV0U3RhdGUgPDwgNCk7DQogIA0KICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLw0KICBUSU14LT5DQ1IyID0gVElNX09DSW5pdFN0cnVjdC0+VElNX1B1bHNlOw0KICAgIA0KICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovDQogIFRJTXgtPkNDTVIxID0gdG1wY2Ntcng7DQogIA0KICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTXggQ2hhbm5lbDMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ0luaXRTdHJ1Y3QuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNX09DSW5pdFR5cGVEZWYgc3RydWN0dXJlDQogICogICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRJTSANCiAgKiAgICAgICAgIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9PQzNJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fT0NJbml0VHlwZURlZiogVElNX09DSW5pdFN0cnVjdCkNCnsNCiAgdWludDE2X3QgdG1wY2NtcnggPSAwLCB0bXBjY2VyID0gMDsNCiAgIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNF9QRVJJUEgoVElNeCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19NT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVRfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkpKTsgICANCg0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLw0KICBUSU14LT5DQ0VSICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MzRSkpOw0KICANCiAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIA0KICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsNCiAgICANCiAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgQml0cyAqLw0KICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzNNKSk7DQogIA0KICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8NCiAgdG1wY2NtcnggfD0gVElNX09DSW5pdFN0cnVjdC0+VElNX09DTW9kZTsNCiAgDQogIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8NCiAgdG1wY2NlciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDM1ApKTsNCiAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLw0KICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkgPDwgOCk7DQogIA0KICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLw0KICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlIDw8IDgpOw0KICANCiAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgVElNeC0+Q0NSMyA9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9QdWxzZTsNCiAgDQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8NCiAgVElNeC0+Q0NNUjIgPSB0bXBjY21yeDsNCiAgDQogIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLw0KICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNeCBDaGFubmVsNCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX09DSW5pdFN0cnVjdC4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9PQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KICAqICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUSU0gDQogICogICAgICAgICBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0M0SW5pdChUSU1fVHlwZURlZiogVElNeCwgVElNX09DSW5pdFR5cGVEZWYqIFRJTV9PQ0luaXRTdHJ1Y3QpDQp7DQogIHVpbnQxNl90IHRtcGNjbXJ4ID0gMCwgdG1wY2NlciA9IDA7DQogICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzRfUEVSSVBIKFRJTXgpKTsgDQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfTU9ERShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT1VUUFVUX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5KSk7ICAgDQoNCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0M0RSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDNEUpKTsNCiAgDQogIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICANCiAgLyogR2V0IHRoZSBUSU14IENDTVIyIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjI7DQogICAgDQogIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlIEJpdHMgKi8NCiAgdG1wY2NtcnggJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0M0TSkpOw0KICANCiAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovDQogIHRtcGNjbXJ4IHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DTW9kZSA8PCA4KTsNCiAgDQogIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8NCiAgdG1wY2NlciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDNFApKTsNCiAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLw0KICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkgPDwgMTIpOw0KICANCiAgLyogU2V0IHRoZSBPdXRwdXQgU3RhdGUgKi8NCiAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZSA8PCAxMik7DQogIA0KICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLw0KICBUSU14LT5DQ1I0ID0gVElNX09DSW5pdFN0cnVjdC0+VElNX1B1bHNlOw0KICANCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLyAgDQogIFRJTXgtPkNDTVIyID0gdG1wY2Ntcng7DQogIA0KICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQogICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSUNJbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCwgOSwgMTAgb3IgMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fSUNJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNIA0KICAqICAgICAgICAgcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0lDSW5pdChUSU1fVHlwZURlZiogVElNeCwgVElNX0lDSW5pdFR5cGVEZWYqIFRJTV9JQ0luaXRTdHJ1Y3QpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24pKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcikpOw0KICANCiAgaWYgKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzEpDQogIHsNCiAgICAvKiBUSTEgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJMV9Db25maWcoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHksDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICBUSU1fU2V0SUMxUHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogIH0NCiAgZWxzZSBpZiAoVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMikNCiAgew0KICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovDQogICAgVEkyX0NvbmZpZyhUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSwNCiAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcik7DQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTV9TZXRJQzJQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCiAgfQ0KICBlbHNlIGlmIChUSU1fSUNJbml0U3RydWN0LT5USU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8zKQ0KICB7DQogICAgLyogVEkzIENvbmZpZ3VyYXRpb24gKi8NCiAgICBUSTNfQ29uZmlnKFRJTXgsICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSwNCiAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcik7DQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTV9TZXRJQzNQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBUSTQgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJNF9Db25maWcoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHksDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICBUSU1fU2V0SUM0UHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0gcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0lDSW5pdFN0cnVjdCB0byBtZWFzdXJlIGFuIGV4dGVybmFsIFBXTSBzaWduYWwuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0IG9yIDkgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fSUNJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNIA0KICAqICAgICAgICAgcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1BXTUlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9JQ0luaXRUeXBlRGVmKiBUSU1fSUNJbml0U3RydWN0KQ0Kew0KICB1aW50MTZfdCBpY29wcG9zaXRlcG9sYXJpdHkgPSBUSU1fSUNQb2xhcml0eV9SaXNpbmc7DQogIHVpbnQxNl90IGljb3Bwb3NpdGVzZWxlY3Rpb24gPSBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEk7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OV9QRVJJUEgoVElNeCkpOw0KICAvKiBTZWxlY3QgdGhlIE9wcG9zaXRlIElucHV0IFBvbGFyaXR5ICovDQogIGlmIChUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSA9PSBUSU1fSUNQb2xhcml0eV9SaXNpbmcpDQogIHsNCiAgICBpY29wcG9zaXRlcG9sYXJpdHkgPSBUSU1fSUNQb2xhcml0eV9GYWxsaW5nOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGljb3Bwb3NpdGVwb2xhcml0eSA9IFRJTV9JQ1BvbGFyaXR5X1Jpc2luZzsNCiAgfQ0KICAvKiBTZWxlY3QgdGhlIE9wcG9zaXRlIElucHV0ICovDQogIGlmIChUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24gPT0gVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJKQ0KICB7DQogICAgaWNvcHBvc2l0ZXNlbGVjdGlvbiA9IFRJTV9JQ1NlbGVjdGlvbl9JbmRpcmVjdFRJOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGljb3Bwb3NpdGVzZWxlY3Rpb24gPSBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEk7DQogIH0NCiAgaWYgKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzEpDQogIHsNCiAgICAvKiBUSTEgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJMV9Db25maWcoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHksIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcik7DQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTV9TZXRJQzFQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCiAgICAvKiBUSTIgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJMl9Db25maWcoVElNeCwgaWNvcHBvc2l0ZXBvbGFyaXR5LCBpY29wcG9zaXRlc2VsZWN0aW9uLCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICBUSU1fU2V0SUMyUHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogIH0NCiAgZWxzZQ0KICB7IA0KICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovDQogICAgVEkyX0NvbmZpZyhUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyKTsNCiAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgVElNX1NldElDMlByZXNjYWxlcihUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIpOw0KICAgIC8qIFRJMSBDb25maWd1cmF0aW9uICovDQogICAgVEkxX0NvbmZpZyhUSU14LCBpY29wcG9zaXRlcG9sYXJpdHksIGljb3Bwb3NpdGVzZWxlY3Rpb24sIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcik7DQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTV9TZXRJQzFQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggVElNX1RpbWVCYXNlSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiAgKiBAcGFyYW0gIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgVElNX1RpbWVCYXNlSW5pdFR5cGVEZWYNCiAgKiAgICAgICAgIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fVGltZUJhc2VTdHJ1Y3RJbml0KFRJTV9UaW1lQmFzZUluaXRUeXBlRGVmKiBUSU1fVGltZUJhc2VJbml0U3RydWN0KQ0Kew0KICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLw0KICBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fUGVyaW9kID0gMHhGRkZGOw0KICBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fUHJlc2NhbGVyID0gMHgwMDAwOw0KICBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ2xvY2tEaXZpc2lvbiA9IFRJTV9DS0RfRElWMTsNCiAgVElNX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNX0NvdW50ZXJNb2RlID0gVElNX0NvdW50ZXJNb2RlX1VwOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggVElNX09DSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgVElNX09DSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwNCiAgKiAgICAgICAgIGJlIGluaXRpYWxpemVkLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0NTdHJ1Y3RJbml0KFRJTV9PQ0luaXRUeXBlRGVmKiBUSU1fT0NJbml0U3RydWN0KQ0Kew0KICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLw0KICBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlID0gVElNX09DTW9kZV9UaW1pbmc7DQogIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZSA9IFRJTV9PdXRwdXRTdGF0ZV9EaXNhYmxlOw0KICBUSU1fT0NJbml0U3RydWN0LT5USU1fUHVsc2UgPSAweDAwMDA7DQogIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5ID0gVElNX09DUG9sYXJpdHlfSGlnaDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBGaWxscyBlYWNoIFRJTV9JQ0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtICBUSU1fSUNJbml0U3RydWN0IDogcG9pbnRlciB0byBhIFRJTV9JQ0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsDQogICogICAgICAgICBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0lDU3RydWN0SW5pdChUSU1fSUNJbml0VHlwZURlZiogVElNX0lDSW5pdFN0cnVjdCkNCnsNCiAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8NCiAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPSBUSU1fQ2hhbm5lbF8xOw0KICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSA9IFRJTV9JQ1BvbGFyaXR5X1Jpc2luZzsNCiAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDU2VsZWN0aW9uID0gVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOw0KICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIgPSBUSU1fSUNQU0NfRElWMTsNCiAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyID0gMHgwMDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyIHRvIDExIHRvIHNlbGVjdCB0aGUgVElNeCBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsLg0KICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0NtZChUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBUSU0gQ291bnRlciAqLw0KICAgIFRJTXgtPkNSMSB8PSBUSU1fQ1IxX0NFTjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ291bnRlciAqLw0KICAgIFRJTXgtPkNSMSAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DUjFfQ0VOKSk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdHMuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyIHRvIDExIHRvIHNlbGVjdCB0aGUgVElNeCBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0lUOiBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lUX1VwZGF0ZTogVElNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfVHJpZ2dlcjogVElNIFRyaWdnZXIgSW50ZXJydXB0IHNvdXJjZQ0KICAqIEBub3RlIA0KICAqICAgLSBUSU02IGFuZCBUSU03IGNhbiBvbmx5IGdlbmVyYXRlIGFuIHVwZGF0ZSBpbnRlcnJ1cHQuICANCiAgKiAgIC0gVElNX0lUX0NDMiwgVElNX0lUX0NDMywgVElNX0lUX0NDNCBhbmQgVElNX0lUX1RyaWdnZXIgY2FuIG5vdCBiZSB1c2VkIHdpdGggVElNMTAgYW5kIFRJTTExDQogICogICAtIFRJTV9JVF9DQzMsIFRJTV9JVF9DQzQgY2FuIG5vdCBiZSB1c2VkIHdpdGggVElNOS4gICANCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTSBpbnRlcnJ1cHRzLg0KICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0lUQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lUKFRJTV9JVCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIEludGVycnVwdCBzb3VyY2VzICovDQogICAgVElNeC0+RElFUiB8PSBUSU1fSVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgSW50ZXJydXB0IHNvdXJjZXMgKi8NCiAgICBUSU14LT5ESUVSICY9ICh1aW50MTZfdCl+VElNX0lUOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBldmVudCB0byBiZSBnZW5lcmF0ZSBieSBzb2Z0d2FyZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIgdG8gMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9FdmVudFNvdXJjZTogc3BlY2lmaWVzIHRoZSBldmVudCBzb3VyY2UuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CSAgIA0KICAqICAgICBAYXJnIFRJTV9FdmVudFNvdXJjZV9VcGRhdGU6IFRpbWVyIHVwZGF0ZSBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ0MxOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMSBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ0MyOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMiBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ0MzOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMyBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ0M0OiBUaW1lciBDYXB0dXJlIENvbXBhcmUgNCBFdmVudCBzb3VyY2UgDQogICogICAgIEBhcmcgVElNX0V2ZW50U291cmNlX1RyaWdnZXI6IFRpbWVyIFRyaWdnZXIgRXZlbnQgc291cmNlDQogICogQG5vdGUgDQogICogICAtIFRJTTYgYW5kIFRJTTcgY2FuIG9ubHkgZ2VuZXJhdGUgYW4gdXBkYXRlIGV2ZW50LiANCiAgKiAgIC0gVElNOSBjYW4gb25seSBnZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQsIENhcHR1cmUgQ29tcGFyZSAxIGV2ZW50LCANCiAgKiAgICAgQ2FwdHVyZSBDb21wYXJlIDIgZXZlbnQgYW5kIFRJTV9FdmVudFNvdXJjZV9UcmlnZ2VyLiAgDQogICogICAtIFRJTTEwIGFuZCBUSU0xMSBjYW4gb25seSBnZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQgYW5kIENhcHR1cmUgQ29tcGFyZSAxIGV2ZW50LiAgICAgICAgICAgIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fR2VuZXJhdGVFdmVudChUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0V2ZW50U291cmNlKQ0KeyANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FVkVOVF9TT1VSQ0UoVElNX0V2ZW50U291cmNlKSk7IA0KICAvKiBTZXQgdGhlIGV2ZW50IHNvdXJjZXMgKi8NCiAgVElNeC0+RUdSID0gVElNX0V2ZW50U291cmNlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXiScyBETUEgaW50ZXJmYWNlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRE1BQmFzZTogRE1BIEJhc2UgYWRkcmVzcy4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0RNQUJhc2VfQ1IsIFRJTV9ETUFCYXNlX0NSMiwgVElNX0RNQUJhc2VfU01DUiwNCiAgKiAgICAgICAgICBUSU1fRE1BQmFzZV9ESUVSLCBUSU1fRE1BQmFzZV9TUiwgVElNX0RNQUJhc2VfRUdSLA0KICAqICAgICAgICAgIFRJTV9ETUFCYXNlX0NDTVIxLCBUSU1fRE1BQmFzZV9DQ01SMiwgVElNX0RNQUJhc2VfQ0NFUiwNCiAgKiAgICAgICAgICBUSU1fRE1BQmFzZV9DTlQsIFRJTV9ETUFCYXNlX1BTQywgVElNX0RNQUJhc2VfQVJSLA0KICAqICAgICAgICAgIFRJTV9ETUFCYXNlX0NDUjEsIFRJTV9ETUFCYXNlX0NDUjIsIFRJTV9ETUFCYXNlX0NDUjMsIA0KICAqICAgICAgICAgIFRJTV9ETUFCYXNlX0NDUjQsIFRJTV9ETUFCYXNlX0RDUi4NCiAgKiBAcGFyYW0gIFRJTV9ETUFCdXJzdExlbmd0aDogRE1BIEJ1cnN0IGxlbmd0aC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgYmV0d2VlbjoNCiAgKiAgIFRJTV9ETUFCdXJzdExlbmd0aF8xQnl0ZSBhbmQgVElNX0RNQUJ1cnN0TGVuZ3RoXzE4Qnl0ZXMuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9ETUFDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9ETUFCYXNlLCB1aW50MTZfdCBUSU1fRE1BQnVyc3RMZW5ndGgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0JBU0UoVElNX0RNQUJhc2UpKTsgDQogIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0xFTkdUSChUSU1fRE1BQnVyc3RMZW5ndGgpKTsNCiAgLyogU2V0IHRoZSBETUEgQmFzZSBhbmQgdGhlIERNQSBCdXJzdCBMZW5ndGggKi8NCiAgVElNeC0+RENSID0gVElNX0RNQUJhc2UgfCBUSU1fRE1BQnVyc3RMZW5ndGg7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNeJJzIERNQSBSZXF1ZXN0cy4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQsIDYgb3IgNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLiANCiAgKiBAcGFyYW0gIFRJTV9ETUFTb3VyY2U6IHNwZWNpZmllcyB0aGUgRE1BIFJlcXVlc3Qgc291cmNlcy4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0RNQV9VcGRhdGU6IFRJTSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgRE1BIHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgRE1BIHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgRE1BIHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfVHJpZ2dlcjogVElNIFRyaWdnZXIgRE1BIHNvdXJjZQ0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRE1BIFJlcXVlc3Qgc291cmNlcy4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9ETUFDbWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9ETUFTb3VyY2UsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0NjdfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKFRJTV9ETUFTb3VyY2UpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBETUEgc291cmNlcyAqLw0KICAgIFRJTXgtPkRJRVIgfD0gVElNX0RNQVNvdXJjZTsgDQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgRE1BIHNvdXJjZXMgKi8NCiAgICBUSU14LT5ESUVSICY9ICh1aW50MTZfdCl+VElNX0RNQVNvdXJjZTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggaW50ZXJybmFsIENsb2NrDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0IG9yIDkgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0ludGVybmFsQ2xvY2tDb25maWcoVElNX1R5cGVEZWYqIFRJTXgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OV9QRVJJUEgoVElNeCkpOw0KICAvKiBEaXNhYmxlIHNsYXZlIG1vZGUgdG8gY2xvY2sgdGhlIHByZXNjYWxlciBkaXJlY3RseSB3aXRoIHRoZSBpbnRlcm5hbCBjbG9jayAqLw0KICBUSU14LT5TTUNSICY9ICAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9TTUNSX1NNUykpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggSW50ZXJuYWwgVHJpZ2dlciBhcyBFeHRlcm5hbCBDbG9jaw0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCBvciA5IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fSVRSU291cmNlOiBUcmlnZ2VyIHNvdXJjZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogQHBhcmFtICBUSU1fVFNfSVRSMDogSW50ZXJuYWwgVHJpZ2dlciAwDQogICogQHBhcmFtICBUSU1fVFNfSVRSMTogSW50ZXJuYWwgVHJpZ2dlciAxDQogICogQHBhcmFtICBUSU1fVFNfSVRSMjogSW50ZXJuYWwgVHJpZ2dlciAyDQogICogQHBhcmFtICBUSU1fVFNfSVRSMzogSW50ZXJuYWwgVHJpZ2dlciAzDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9JVFJ4RXh0ZXJuYWxDbG9ja0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lucHV0VHJpZ2dlclNvdXJjZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzQ5X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fSU5URVJOQUxfVFJJR0dFUl9TRUxFQ1RJT04oVElNX0lucHV0VHJpZ2dlclNvdXJjZSkpOw0KICAvKiBTZWxlY3QgdGhlIEludGVybmFsIFRyaWdnZXIgKi8NCiAgVElNX1NlbGVjdElucHV0VHJpZ2dlcihUSU14LCBUSU1fSW5wdXRUcmlnZ2VyU291cmNlKTsNCiAgLyogU2VsZWN0IHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMSAqLw0KICBUSU14LT5TTUNSIHw9IFRJTV9TbGF2ZU1vZGVfRXh0ZXJuYWwxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggVHJpZ2dlciBhcyBFeHRlcm5hbCBDbG9jaw0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCBvciA5IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fVEl4RXh0ZXJuYWxDTEtTb3VyY2U6IFRyaWdnZXIgc291cmNlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fVEl4RXh0ZXJuYWxDTEsxU291cmNlX1RJMUVEOiBUSTEgRWRnZSBEZXRlY3Rvcg0KICAqICAgICBAYXJnIFRJTV9USXhFeHRlcm5hbENMSzFTb3VyY2VfVEkxOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxDQogICogICAgIEBhcmcgVElNX1RJeEV4dGVybmFsQ0xLMVNvdXJjZV9USTI6IEZpbHRlcmVkIFRpbWVyIElucHV0IDINCiAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIFRJeCBQb2xhcml0eS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfUmlzaW5nDQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfRmFsbGluZw0KICAqIEBwYXJhbSAgSUNGaWx0ZXIgOiBzcGVjaWZpZXMgdGhlIGZpbHRlciB2YWx1ZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MCBhbmQgMHhGLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fVEl4RXh0ZXJuYWxDbG9ja0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX1RJeEV4dGVybmFsQ0xLU291cmNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgSUNGaWx0ZXIpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OV9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKFRJTV9JQ1BvbGFyaXR5KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKElDRmlsdGVyKSk7DQogIA0KICAvKiBDb25maWd1cmUgdGhlIFRpbWVyIElucHV0IENsb2NrIFNvdXJjZSAqLw0KICBpZiAoVElNX1RJeEV4dGVybmFsQ0xLU291cmNlID09IFRJTV9USXhFeHRlcm5hbENMSzFTb3VyY2VfVEkyKQ0KICB7DQogICAgVEkyX0NvbmZpZyhUSU14LCBUSU1fSUNQb2xhcml0eSwgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJLCBJQ0ZpbHRlcik7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgVEkxX0NvbmZpZyhUSU14LCBUSU1fSUNQb2xhcml0eSwgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJLCBJQ0ZpbHRlcik7DQogIH0NCiAgLyogU2VsZWN0IHRoZSBUcmlnZ2VyIHNvdXJjZSAqLw0KICBUSU1fU2VsZWN0SW5wdXRUcmlnZ2VyKFRJTXgsIFRJTV9USXhFeHRlcm5hbENMS1NvdXJjZSk7DQogIC8qIFNlbGVjdCB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTEgKi8NCiAgVElNeC0+U01DUiB8PSBUSU1fU2xhdmVNb2RlX0V4dGVybmFsMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBFeHRlcm5hbCBjbG9jayBNb2RlMQ0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCBvciA5IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRXh0VFJHUHJlc2NhbGVyOiBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQcmVzY2FsZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfT0ZGOiBFVFJQIFByZXNjYWxlciBPRkYuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVYyOiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDIuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY0OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDQuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY4OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDguDQogICogQHBhcmFtICBUSU1fRXh0VFJHUG9sYXJpdHk6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUG9sYXJpdHlfSW52ZXJ0ZWQ6IGFjdGl2ZSBsb3cgb3IgZmFsbGluZyBlZGdlIGFjdGl2ZS4NCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUG9sYXJpdHlfTm9uSW52ZXJ0ZWQ6IGFjdGl2ZSBoaWdoIG9yIHJpc2luZyBlZGdlIGFjdGl2ZS4NCiAgKiBAcGFyYW0gIEV4dFRSR0ZpbHRlcjogRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9FVFJDbG9ja01vZGUxQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLCB1aW50MTZfdCBUSU1fRXh0VFJHUG9sYXJpdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IEV4dFRSR0ZpbHRlcikNCnsNCiAgdWludDE2X3QgdG1wc21jciA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNDlfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUFJFU0NBTEVSKFRJTV9FeHRUUkdQcmVzY2FsZXIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUE9MQVJJVFkoVElNX0V4dFRSR1BvbGFyaXR5KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRVhUX0ZJTFRFUihFeHRUUkdGaWx0ZXIpKTsNCiAgDQogIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLw0KICBUSU1fRVRSQ29uZmlnKFRJTXgsIFRJTV9FeHRUUkdQcmVzY2FsZXIsIFRJTV9FeHRUUkdQb2xhcml0eSwgRXh0VFJHRmlsdGVyKTsNCiAgDQogIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcHNtY3IgPSBUSU14LT5TTUNSOw0KICAvKiBSZXNldCB0aGUgU01TIEJpdHMgKi8NCiAgdG1wc21jciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9TTUNSX1NNUykpOw0KICAvKiBTZWxlY3QgdGhlIEV4dGVybmFsIGNsb2NrIG1vZGUxICovDQogIHRtcHNtY3IgfD0gVElNX1NsYXZlTW9kZV9FeHRlcm5hbDE7DQogIC8qIFNlbGVjdCB0aGUgVHJpZ2dlciBzZWxlY3Rpb24gOiBFVFJGICovDQogIHRtcHNtY3IgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fU01DUl9UUykpOw0KICB0bXBzbWNyIHw9IFRJTV9UU19FVFJGOw0KICAvKiBXcml0ZSB0byBUSU14IFNNQ1IgKi8NCiAgVElNeC0+U01DUiA9IHRtcHNtY3I7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgRXh0ZXJuYWwgY2xvY2sgTW9kZTINCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQsIDksIDEwIG9yIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRXh0VFJHUHJlc2NhbGVyOiBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQcmVzY2FsZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfT0ZGOiBFVFJQIFByZXNjYWxlciBPRkYuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVYyOiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDIuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY0OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDQuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY4OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDguDQogICogQHBhcmFtICBUSU1fRXh0VFJHUG9sYXJpdHk6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUG9sYXJpdHlfSW52ZXJ0ZWQ6IGFjdGl2ZSBsb3cgb3IgZmFsbGluZyBlZGdlIGFjdGl2ZS4NCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUG9sYXJpdHlfTm9uSW52ZXJ0ZWQ6IGFjdGl2ZSBoaWdoIG9yIHJpc2luZyBlZGdlIGFjdGl2ZS4NCiAgKiBAcGFyYW0gIEV4dFRSR0ZpbHRlcjogRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9FVFJDbG9ja01vZGUyQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgVElNX0V4dFRSR1BvbGFyaXR5LCB1aW50MTZfdCBFeHRUUkdGaWx0ZXIpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUFJFU0NBTEVSKFRJTV9FeHRUUkdQcmVzY2FsZXIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUE9MQVJJVFkoVElNX0V4dFRSR1BvbGFyaXR5KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRVhUX0ZJTFRFUihFeHRUUkdGaWx0ZXIpKTsNCiAgDQogIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLw0KICBUSU1fRVRSQ29uZmlnKFRJTXgsIFRJTV9FeHRUUkdQcmVzY2FsZXIsIFRJTV9FeHRUUkdQb2xhcml0eSwgRXh0VFJHRmlsdGVyKTsNCiAgLyogRW5hYmxlIHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMiAqLw0KICBUSU14LT5TTUNSIHw9IFRJTV9TTUNSX0VDRTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IEV4dGVybmFsIFRyaWdnZXIgKEVUUikuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0LCA5LCAxMCBvciAxMSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0V4dFRSR1ByZXNjYWxlcjogVGhlIGV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUFNDX09GRjogRVRSUCBQcmVzY2FsZXIgT0ZGLg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfRElWMjogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSAyLg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfRElWNDogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA0Lg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfRElWODogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA4Lg0KICAqIEBwYXJhbSAgVElNX0V4dFRSR1BvbGFyaXR5OiBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0V4dFRSR1BvbGFyaXR5X0ludmVydGVkOiBhY3RpdmUgbG93IG9yIGZhbGxpbmcgZWRnZSBhY3RpdmUuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BvbGFyaXR5X05vbkludmVydGVkOiBhY3RpdmUgaGlnaCBvciByaXNpbmcgZWRnZSBhY3RpdmUuDQogICogQHBhcmFtICBFeHRUUkdGaWx0ZXI6IEV4dGVybmFsIFRyaWdnZXIgRmlsdGVyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fRVRSQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLCB1aW50MTZfdCBUSU1fRXh0VFJHUG9sYXJpdHksDQogICAgICAgICAgICAgICAgICAgdWludDE2X3QgRXh0VFJHRmlsdGVyKQ0Kew0KICB1aW50MTZfdCB0bXBzbWNyID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUFJFU0NBTEVSKFRJTV9FeHRUUkdQcmVzY2FsZXIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUE9MQVJJVFkoVElNX0V4dFRSR1BvbGFyaXR5KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRVhUX0ZJTFRFUihFeHRUUkdGaWx0ZXIpKTsNCiAgDQogIHRtcHNtY3IgPSBUSU14LT5TTUNSOw0KICAvKiBSZXNldCB0aGUgRVRSIEJpdHMgKi8NCiAgdG1wc21jciAmPSBTTUNSX0VUUl9NQVNLOw0KICAvKiBTZXQgdGhlIFByZXNjYWxlciwgdGhlIEZpbHRlciB2YWx1ZSBhbmQgdGhlIFBvbGFyaXR5ICovDQogIHRtcHNtY3IgfD0gKHVpbnQxNl90KShUSU1fRXh0VFJHUHJlc2NhbGVyIHwgKHVpbnQxNl90KShUSU1fRXh0VFJHUG9sYXJpdHkgfCAodWludDE2X3QpKEV4dFRSR0ZpbHRlciA8PCAodWludDE2X3QpOCkpKTsNCiAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovDQogIFRJTXgtPlNNQ1IgPSB0bXBzbWNyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggUHJlc2NhbGVyLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiB0byAxMSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgUHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIFByZXNjYWxlciBSZWdpc3RlciB2YWx1ZQ0KICAqIEBwYXJhbSAgVElNX1BTQ1JlbG9hZE1vZGU6IHNwZWNpZmllcyB0aGUgVElNIFByZXNjYWxlciBSZWxvYWQgbW9kZQ0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fUFNDUmVsb2FkTW9kZV9VcGRhdGU6IFRoZSBQcmVzY2FsZXIgaXMgbG9hZGVkIGF0IHRoZSB1cGRhdGUgZXZlbnQuDQogICogICAgIEBhcmcgVElNX1BTQ1JlbG9hZE1vZGVfSW1tZWRpYXRlOiBUaGUgUHJlc2NhbGVyIGlzIGxvYWRlZCBpbW1lZGlhdGx5Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fUHJlc2NhbGVyQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBQcmVzY2FsZXIsIHVpbnQxNl90IFRJTV9QU0NSZWxvYWRNb2RlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX1BSRVNDQUxFUl9SRUxPQUQoVElNX1BTQ1JlbG9hZE1vZGUpKTsNCiAgDQogIC8qIFNldCB0aGUgUHJlc2NhbGVyIHZhbHVlICovDQogIFRJTXgtPlBTQyA9IFByZXNjYWxlcjsNCiAgLyogU2V0IG9yIHJlc2V0IHRoZSBVRyBCaXQgKi8NCiAgVElNeC0+RUdSID0gVElNX1BTQ1JlbG9hZE1vZGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU3BlY2lmaWVzIHRoZSBUSU14IENvdW50ZXIgTW9kZSB0byBiZSB1c2VkLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fQ291bnRlck1vZGU6IHNwZWNpZmllcyB0aGUgQ291bnRlciBNb2RlIHRvIGJlIHVzZWQNCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0NvdW50ZXJNb2RlX1VwOiBUSU0gVXAgQ291bnRpbmcgTW9kZQ0KICAqICAgICBAYXJnIFRJTV9Db3VudGVyTW9kZV9Eb3duOiBUSU0gRG93biBDb3VudGluZyBNb2RlDQogICogICAgIEBhcmcgVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQxOiBUSU0gQ2VudGVyIEFsaWduZWQgTW9kZTENCiAgKiAgICAgQGFyZyBUSU1fQ291bnRlck1vZGVfQ2VudGVyQWxpZ25lZDI6IFRJTSBDZW50ZXIgQWxpZ25lZCBNb2RlMg0KICAqICAgICBAYXJnIFRJTV9Db3VudGVyTW9kZV9DZW50ZXJBbGlnbmVkMzogVElNIENlbnRlciBBbGlnbmVkIE1vZGUzDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9Db3VudGVyTW9kZUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NvdW50ZXJNb2RlKQ0Kew0KICB1aW50MTZfdCB0bXBjcjEgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzRfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoVElNX0NvdW50ZXJNb2RlKSk7DQogIA0KICB0bXBjcjEgPSBUSU14LT5DUjE7DQogIC8qIFJlc2V0IHRoZSBDTVMgYW5kIERJUiBCaXRzICovDQogIHRtcGNyMSAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KShUSU1fQ1IxX0RJUiB8IFRJTV9DUjFfQ01TKSkpOw0KICAvKiBTZXQgdGhlIENvdW50ZXIgTW9kZSAqLw0KICB0bXBjcjEgfD0gVElNX0NvdW50ZXJNb2RlOw0KICAvKiBXcml0ZSB0byBUSU14IENSMSByZWdpc3RlciAqLw0KICBUSU14LT5DUjEgPSB0bXBjcjE7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2VsZWN0cyB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UNCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQgb3IgOSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0lucHV0VHJpZ2dlclNvdXJjZTogVGhlIElucHV0IFRyaWdnZXIgc291cmNlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgVHJpZ2dlciAwDQogICogICAgIEBhcmcgVElNX1RTX0lUUjE6IEludGVybmFsIFRyaWdnZXIgMQ0KICAqICAgICBAYXJnIFRJTV9UU19JVFIyOiBJbnRlcm5hbCBUcmlnZ2VyIDINCiAgKiAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgVHJpZ2dlciAzDQogICogICAgIEBhcmcgVElNX1RTX1RJMUZfRUQ6IFRJMSBFZGdlIERldGVjdG9yDQogICogICAgIEBhcmcgVElNX1RTX1RJMUZQMTogRmlsdGVyZWQgVGltZXIgSW5wdXQgMQ0KICAqICAgICBAYXJnIFRJTV9UU19USTJGUDI6IEZpbHRlcmVkIFRpbWVyIElucHV0IDINCiAgKiAgICAgQGFyZyBUSU1fVFNfRVRSRjogRXh0ZXJuYWwgVHJpZ2dlciBpbnB1dA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2VsZWN0SW5wdXRUcmlnZ2VyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSW5wdXRUcmlnZ2VyU291cmNlKQ0Kew0KICB1aW50MTZfdCB0bXBzbWNyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNDkxMDExX1BFUklQSChUSU14KSk7IA0KICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJfU0VMRUNUSU9OKFRJTV9JbnB1dFRyaWdnZXJTb3VyY2UpKTsNCg0KICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBzbWNyID0gVElNeC0+U01DUjsNCiAgLyogUmVzZXQgdGhlIFRTIEJpdHMgKi8NCiAgdG1wc21jciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9TTUNSX1RTKSk7DQogIC8qIFNldCB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UgKi8NCiAgdG1wc21jciB8PSBUSU1fSW5wdXRUcmlnZ2VyU291cmNlOw0KICAvKiBXcml0ZSB0byBUSU14IFNNQ1IgKi8NCiAgVElNeC0+U01DUiA9IHRtcHNtY3I7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBFbmNvZGVyIEludGVyZmFjZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9FbmNvZGVyTW9kZTogc3BlY2lmaWVzIHRoZSBUSU14IEVuY29kZXIgTW9kZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0VuY29kZXJNb2RlX1RJMTogQ291bnRlciBjb3VudHMgb24gVEkxRlAxIGVkZ2UgZGVwZW5kaW5nIG9uIFRJMkZQMiBsZXZlbC4NCiAgKiAgICAgQGFyZyBUSU1fRW5jb2Rlck1vZGVfVEkyOiBDb3VudGVyIGNvdW50cyBvbiBUSTJGUDIgZWRnZSBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsLg0KICAqICAgICBAYXJnIFRJTV9FbmNvZGVyTW9kZV9USTEyOiBDb3VudGVyIGNvdW50cyBvbiBib3RoIFRJMUZQMSBhbmQgVEkyRlAyIGVkZ2VzIGRlcGVuZGluZw0KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgbGV2ZWwgb2YgdGhlIG90aGVyIGlucHV0Lg0KICAqIEBwYXJhbSAgVElNX0lDMVBvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIElDMSBQb2xhcml0eQ0KICAqICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmc6IElDIEZhbGxpbmcgZWRnZS4NCiAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9SaXNpbmc6IElDIFJpc2luZyBlZGdlLg0KICAqIEBwYXJhbSAgVElNX0lDMlBvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIElDMiBQb2xhcml0eQ0KICAqICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmc6IElDIEZhbGxpbmcgZWRnZS4NCiAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9SaXNpbmc6IElDIFJpc2luZyBlZGdlLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fRW5jb2RlckludGVyZmFjZUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0VuY29kZXJNb2RlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUMxUG9sYXJpdHksIHVpbnQxNl90IFRJTV9JQzJQb2xhcml0eSkNCnsNCiAgdWludDE2X3QgdG1wc21jciA9IDA7DQogIHVpbnQxNl90IHRtcGNjbXIxID0gMDsNCiAgdWludDE2X3QgdG1wY2NlciA9IDA7DQogICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUl9NT0RFKFRJTV9FbmNvZGVyTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKFRJTV9JQzFQb2xhcml0eSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKFRJTV9JQzJQb2xhcml0eSkpOw0KICANCiAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wc21jciA9IFRJTXgtPlNNQ1I7DQogIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCiAgLyogU2V0IHRoZSBlbmNvZGVyIE1vZGUgKi8NCiAgdG1wc21jciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9TTUNSX1NNUykpOw0KICB0bXBzbWNyIHw9IFRJTV9FbmNvZGVyTW9kZTsNCiAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgMSBhbmQgdGhlIENhcHR1cmUgQ29tcGFyZSAyIGFzIGlucHV0ICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MxUykpICYgKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MyUykpKTsNCiAgdG1wY2NtcjEgfD0gVElNX0NDTVIxX0NDMVNfMCB8IFRJTV9DQ01SMV9DQzJTXzA7DQogIC8qIFNldCB0aGUgVEkxIGFuZCB0aGUgVEkyIFBvbGFyaXRpZXMgKi8NCiAgdG1wY2NlciAmPSAodWludDE2X3QpKCgodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MxUCkpICYgKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzJQKSkpOw0KICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9JQzFQb2xhcml0eSB8ICh1aW50MTZfdCkoVElNX0lDMlBvbGFyaXR5IDw8ICh1aW50MTZfdCk0KSk7DQogIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLw0KICBUSU14LT5TTUNSID0gdG1wc21jcjsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRm9yY2VzIHRoZSBUSU14IG91dHB1dCAxIHdhdmVmb3JtIHRvIGFjdGl2ZSBvciBpbmFjdGl2ZSBsZXZlbC4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQsIDksIDEwIG9yIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRm9yY2VkQWN0aW9uOiBzcGVjaWZpZXMgdGhlIGZvcmNlZCBBY3Rpb24gdG8gYmUgc2V0IHRvIHRoZSBvdXRwdXQgd2F2ZWZvcm0uDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9Gb3JjZWRBY3Rpb25fQWN0aXZlOiBGb3JjZSBhY3RpdmUgbGV2ZWwgb24gT0MxUkVGDQogICogICAgIEBhcmcgVElNX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZTogRm9yY2UgaW5hY3RpdmUgbGV2ZWwgb24gT0MxUkVGLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fRm9yY2VkT0MxQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRm9yY2VkQWN0aW9uKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMSA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9GT1JDRURfQUNUSU9OKFRJTV9Gb3JjZWRBY3Rpb24pKTsNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCiAgLyogUmVzZXQgdGhlIE9DMU0gQml0cyAqLw0KICB0bXBjY21yMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIxX09DMU0pOw0KICAvKiBDb25maWd1cmUgVGhlIEZvcmNlZCBvdXRwdXQgTW9kZSAqLw0KICB0bXBjY21yMSB8PSBUSU1fRm9yY2VkQWN0aW9uOw0KICAvKiBXcml0ZSB0byBUSU14IENDTVIxIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQp9DQogDQovKioNCiAgKiBAYnJpZWYgIEZvcmNlcyB0aGUgVElNeCBvdXRwdXQgMiB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0IG9yIDkgdG8gc2VsZWN0IHRoZSBUSU0gDQogICogICBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0ZvcmNlZEFjdGlvbjogc3BlY2lmaWVzIHRoZSBmb3JjZWQgQWN0aW9uIHRvIGJlIHNldCB0byB0aGUgb3V0cHV0IHdhdmVmb3JtLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZTogRm9yY2UgYWN0aXZlIGxldmVsIG9uIE9DMlJFRg0KICAqICAgICBAYXJnIFRJTV9Gb3JjZWRBY3Rpb25fSW5BY3RpdmU6IEZvcmNlIGluYWN0aXZlIGxldmVsIG9uIE9DMlJFRi4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0ZvcmNlZE9DMkNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZvcmNlZEFjdGlvbikNCnsNCiAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzQ5X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRk9SQ0VEX0FDVElPTihUSU1fRm9yY2VkQWN0aW9uKSk7DQogIA0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICAvKiBSZXNldCB0aGUgT0MyTSBCaXRzICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MyTSk7DQogIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQogIHRtcGNjbXIxIHw9ICh1aW50MTZfdCkoVElNX0ZvcmNlZEFjdGlvbiA8PCA4KTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZvcmNlcyB0aGUgVElNeCBvdXRwdXQgMyB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8gdGhlIG91dHB1dCB3YXZlZm9ybS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0ZvcmNlZEFjdGlvbl9BY3RpdmU6IEZvcmNlIGFjdGl2ZSBsZXZlbCBvbiBPQzNSRUYNCiAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0luQWN0aXZlOiBGb3JjZSBpbmFjdGl2ZSBsZXZlbCBvbiBPQzNSRUYuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9Gb3JjZWRPQzNDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9Gb3JjZWRBY3Rpb24pDQp7DQogIHVpbnQxNl90IHRtcGNjbXIyID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRk9SQ0VEX0FDVElPTihUSU1fRm9yY2VkQWN0aW9uKSk7DQogIA0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KICAvKiBSZXNldCB0aGUgT0MxTSBCaXRzICovDQogIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0MzTSk7DQogIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQogIHRtcGNjbXIyIHw9IFRJTV9Gb3JjZWRBY3Rpb247DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgcmVnaXN0ZXIgKi8NCiAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBGb3JjZXMgdGhlIFRJTXggb3V0cHV0IDQgd2F2ZWZvcm0gdG8gYWN0aXZlIG9yIGluYWN0aXZlIGxldmVsLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRm9yY2VkQWN0aW9uOiBzcGVjaWZpZXMgdGhlIGZvcmNlZCBBY3Rpb24gdG8gYmUgc2V0IHRvIHRoZSBvdXRwdXQgd2F2ZWZvcm0uDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9Gb3JjZWRBY3Rpb25fQWN0aXZlOiBGb3JjZSBhY3RpdmUgbGV2ZWwgb24gT0M0UkVGDQogICogICAgIEBhcmcgVElNX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZTogRm9yY2UgaW5hY3RpdmUgbGV2ZWwgb24gT0M0UkVGLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fRm9yY2VkT0M0Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRm9yY2VkQWN0aW9uKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMiA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRk9SQ0VEX0FDVElPTihUSU1fRm9yY2VkQWN0aW9uKSk7DQogIA0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KICAvKiBSZXNldCB0aGUgT0MyTSBCaXRzICovDQogIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0M0TSk7DQogIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQogIHRtcGNjbXIyIHw9ICh1aW50MTZfdCkoVElNX0ZvcmNlZEFjdGlvbiA8PCA4KTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXIgb24gQVJSLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDIgdG8gMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fQVJSUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBTZXQgdGhlIEFSUiBQcmVsb2FkIEJpdCAqLw0KICAgIFRJTXgtPkNSMSB8PSBUSU1fQ1IxX0FSUEU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgdGhlIEFSUiBQcmVsb2FkIEJpdCAqLw0KICAgIFRJTXgtPkNSMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMV9BUlBFKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIFRJTXggcGVyaXBoZXJhbCBDYXB0dXJlIENvbXBhcmUgRE1BIHNvdXJjZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgQ2FwdHVyZSBDb21wYXJlIERNQSBzb3VyY2UNCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9TZWxlY3RDQ0RNQShUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBTZXQgdGhlIENDRFMgQml0ICovDQogICAgVElNeC0+Q1IyIHw9IFRJTV9DUjJfQ0NEUzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSZXNldCB0aGUgQ0NEUyBCaXQgKi8NCiAgICBUSU14LT5DUjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DUjJfQ0NEUyk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3RlciBvbiBDQ1IxLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCwgOSwgMTAgb3IgMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ1ByZWxvYWQ6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXINCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DUHJlbG9hZF9FbmFibGUNCiAgKiAgICAgQGFyZyBUSU1fT0NQcmVsb2FkX0Rpc2FibGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DMVByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1ByZWxvYWQpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIxID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzQ5MTAxMV9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DUFJFTE9BRF9TVEFURShUSU1fT0NQcmVsb2FkKSk7DQogIA0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICAvKiBSZXNldCB0aGUgT0MxUEUgQml0ICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MxUEUpOw0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgUHJlbG9hZCBmZWF0dXJlICovDQogIHRtcGNjbXIxIHw9IFRJTV9PQ1ByZWxvYWQ7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgcmVnaXN0ZXIgKi8NCiAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3RlciBvbiBDQ1IyLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCBvciA5IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NQcmVsb2FkOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9PQ1ByZWxvYWRfRW5hYmxlDQogICogICAgIEBhcmcgVElNX09DUHJlbG9hZF9EaXNhYmxlDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9PQzJQcmVsb2FkQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NQcmVsb2FkKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMSA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OV9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DUFJFTE9BRF9TVEFURShUSU1fT0NQcmVsb2FkKSk7DQogIA0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICAvKiBSZXNldCB0aGUgT0MyUEUgQml0ICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MyUEUpOw0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgUHJlbG9hZCBmZWF0dXJlICovDQogIHRtcGNjbXIxIHw9ICh1aW50MTZfdCkoVElNX09DUHJlbG9hZCA8PCA4KTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyIG9uIENDUjMuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ1ByZWxvYWQ6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXINCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DUHJlbG9hZF9FbmFibGUNCiAgKiAgICAgQGFyZyBUSU1fT0NQcmVsb2FkX0Rpc2FibGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DM1ByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1ByZWxvYWQpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIyID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NQUkVMT0FEX1NUQVRFKFRJTV9PQ1ByZWxvYWQpKTsNCiAgDQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIC8qIFJlc2V0IHRoZSBPQzNQRSBCaXQgKi8NCiAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzNQRSk7DQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBQcmVsb2FkIGZlYXR1cmUgKi8NCiAgdG1wY2NtcjIgfD0gVElNX09DUHJlbG9hZDsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyIG9uIENDUjQuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ1ByZWxvYWQ6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXINCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DUHJlbG9hZF9FbmFibGUNCiAgKiAgICAgQGFyZyBUSU1fT0NQcmVsb2FkX0Rpc2FibGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DNFByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1ByZWxvYWQpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIyID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NQUkVMT0FEX1NUQVRFKFRJTV9PQ1ByZWxvYWQpKTsNCiAgDQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIC8qIFJlc2V0IHRoZSBPQzRQRSBCaXQgKi8NCiAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzRQRSk7DQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBQcmVsb2FkIGZlYXR1cmUgKi8NCiAgdG1wY2NtcjIgfD0gKHVpbnQxNl90KShUSU1fT0NQcmVsb2FkIDw8IDgpOw0KICAvKiBXcml0ZSB0byBUSU14IENDTVIyIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBPdXRwdXQgQ29tcGFyZSAxIEZhc3QgZmVhdHVyZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQsIDksIDEwIG9yIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NGYXN0OiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgRW5hYmxlIEJpdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DRmFzdF9FbmFibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0Zhc3RfRGlzYWJsZTogVElNIG91dHB1dCBjb21wYXJlIGZhc3QgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MxRmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCkNCnsNCiAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzQ5MTAxMV9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DRkFTVF9TVEFURShUSU1fT0NGYXN0KSk7DQogIA0KICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCiAgLyogUmVzZXQgdGhlIE9DMUZFIEJpdCAqLw0KICB0bXBjY21yMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIxX09DMUZFKTsNCiAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgQml0ICovDQogIHRtcGNjbXIxIHw9IFRJTV9PQ0Zhc3Q7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8NCiAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IE91dHB1dCBDb21wYXJlIDIgRmFzdCBmZWF0dXJlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCBvciA5IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NGYXN0OiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgRW5hYmxlIEJpdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DRmFzdF9FbmFibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0Zhc3RfRGlzYWJsZTogVElNIG91dHB1dCBjb21wYXJlIGZhc3QgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MyRmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCkNCnsNCiAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzQ5X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NGQVNUX1NUQVRFKFRJTV9PQ0Zhc3QpKTsNCiAgDQogIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICAvKiBSZXNldCB0aGUgT0MyRkUgQml0ICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MyRkUpOw0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgRmFzdCBCaXQgKi8NCiAgdG1wY2NtcjEgfD0gKHVpbnQxNl90KShUSU1fT0NGYXN0IDw8IDgpOw0KICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovDQogIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBPdXRwdXQgQ29tcGFyZSAzIEZhc3QgZmVhdHVyZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DRmFzdDogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEVuYWJsZSBCaXQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9PQ0Zhc3RfRW5hYmxlOiBUSU0gb3V0cHV0IGNvbXBhcmUgZmFzdCBlbmFibGUNCiAgKiAgICAgQGFyZyBUSU1fT0NGYXN0X0Rpc2FibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGRpc2FibGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DM0Zhc3RDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0Zhc3QpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIyID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NGQVNUX1NUQVRFKFRJTV9PQ0Zhc3QpKTsNCiAgDQogIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KICAvKiBSZXNldCB0aGUgT0MzRkUgQml0ICovDQogIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0MzRkUpOw0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgRmFzdCBCaXQgKi8NCiAgdG1wY2NtcjIgfD0gVElNX09DRmFzdDsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLw0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggT3V0cHV0IENvbXBhcmUgNCBGYXN0IGZlYXR1cmUuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ0Zhc3Q6IG5ldyBzdGF0ZSBvZiB0aGUgT3V0cHV0IENvbXBhcmUgRmFzdCBFbmFibGUgQml0Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NGYXN0X0VuYWJsZTogVElNIG91dHB1dCBjb21wYXJlIGZhc3QgZW5hYmxlDQogICogICAgIEBhcmcgVElNX09DRmFzdF9EaXNhYmxlOiBUSU0gb3V0cHV0IGNvbXBhcmUgZmFzdCBkaXNhYmxlDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9PQzRGYXN0Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NGYXN0KQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMiA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DRkFTVF9TVEFURShUSU1fT0NGYXN0KSk7DQogIA0KICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCiAgLyogUmVzZXQgdGhlIE9DNEZFIEJpdCAqLw0KICB0bXBjY21yMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX09DNEZFKTsNCiAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgQml0ICovDQogIHRtcGNjbXIyIHw9ICh1aW50MTZfdCkoVElNX09DRmFzdCA8PCA4KTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLw0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyBvciBzYWZlZ3VhcmRzIHRoZSBPQ1JFRjEgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50DQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0LCA5LCAxMCBvciAxMSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DQ2xlYXI6IG5ldyBzdGF0ZSBvZiB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgRW5hYmxlIEJpdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DQ2xlYXJfRW5hYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0NsZWFyX0Rpc2FibGU6IFRJTSBPdXRwdXQgY2xlYXIgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fQ2xlYXJPQzFSZWYoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0NsZWFyKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMSA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNDkxMDExX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NDTEVBUl9TVEFURShUSU1fT0NDbGVhcikpOw0KICANCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCiAgLyogUmVzZXQgdGhlIE9DMUNFIEJpdCAqLw0KICB0bXBjY21yMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIxX09DMUNFKTsNCiAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIENsZWFyIEJpdCAqLw0KICB0bXBjY21yMSB8PSBUSU1fT0NDbGVhcjsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyBvciBzYWZlZ3VhcmRzIHRoZSBPQ1JFRjIgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50DQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0IG9yIDkgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ0NsZWFyOiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIENsZWFyIEVuYWJsZSBCaXQuDQoNCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DQ2xlYXJfRW5hYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0NsZWFyX0Rpc2FibGU6IFRJTSBPdXRwdXQgY2xlYXIgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fQ2xlYXJPQzJSZWYoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0NsZWFyKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMSA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNDlfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0NMRUFSX1NUQVRFKFRJTV9PQ0NsZWFyKSk7DQogIA0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICAvKiBSZXNldCB0aGUgT0MyQ0UgQml0ICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MyQ0UpOw0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgQml0ICovDQogIHRtcGNjbXIxIHw9ICh1aW50MTZfdCkoVElNX09DQ2xlYXIgPDwgOCk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgcmVnaXN0ZXIgKi8NCiAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgb3Igc2FmZWd1YXJkcyB0aGUgT0NSRUYzIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudA0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NDbGVhcjogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBDbGVhciBFbmFibGUgQml0Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NDbGVhcl9FbmFibGU6IFRJTSBPdXRwdXQgY2xlYXIgZW5hYmxlDQogICogICAgIEBhcmcgVElNX09DQ2xlYXJfRGlzYWJsZTogVElNIE91dHB1dCBjbGVhciBkaXNhYmxlDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9DbGVhck9DM1JlZihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DQ2xlYXIpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIyID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NDTEVBUl9TVEFURShUSU1fT0NDbGVhcikpOw0KICANCiAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCiAgLyogUmVzZXQgdGhlIE9DM0NFIEJpdCAqLw0KICB0bXBjY21yMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX09DM0NFKTsNCiAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIENsZWFyIEJpdCAqLw0KICB0bXBjY21yMiB8PSBUSU1fT0NDbGVhcjsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyBvciBzYWZlZ3VhcmRzIHRoZSBPQ1JFRjQgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50DQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ0NsZWFyOiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIENsZWFyIEVuYWJsZSBCaXQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9PQ0NsZWFyX0VuYWJsZTogVElNIE91dHB1dCBjbGVhciBlbmFibGUNCiAgKiAgICAgQGFyZyBUSU1fT0NDbGVhcl9EaXNhYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGRpc2FibGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0NsZWFyT0M0UmVmKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NDbGVhcikNCnsNCiAgdWludDE2X3QgdG1wY2NtcjIgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzRfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0NMRUFSX1NUQVRFKFRJTV9PQ0NsZWFyKSk7DQogIA0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KICAvKiBSZXNldCB0aGUgT0M0Q0UgQml0ICovDQogIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0M0Q0UpOw0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgQml0ICovDQogIHRtcGNjbXIyIHw9ICh1aW50MTZfdCkoVElNX09DQ2xlYXIgPDwgOCk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgcmVnaXN0ZXIgKi8NCiAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IGNoYW5uZWwgMSBwb2xhcml0eS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQsIDksIDEwIG9yIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzEgUG9sYXJpdHkNCiAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NQb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KICAqICAgICBAYXJnIFRJTV9PQ1BvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MxUG9sYXJpdHlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1BvbGFyaXR5KQ0Kew0KICB1aW50MTZfdCB0bXBjY2VyID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShUSU1fT0NQb2xhcml0eSkpOw0KICANCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIC8qIFNldCBvciBSZXNldCB0aGUgQ0MxUCBCaXQgKi8NCiAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MxUCk7DQogIHRtcGNjZXIgfD0gVElNX09DUG9sYXJpdHk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiByZWdpc3RlciAqLw0KICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IGNoYW5uZWwgMiBwb2xhcml0eS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQgb3IgOSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgT0MyIFBvbGFyaXR5DQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DUG9sYXJpdHlfSGlnaDogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGhpZ2gNCiAgKiAgICAgQGFyZyBUSU1fT0NQb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DMlBvbGFyaXR5Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NQb2xhcml0eSkNCnsNCiAgdWludDE2X3QgdG1wY2NlciA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNDlfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShUSU1fT0NQb2xhcml0eSkpOw0KICANCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIC8qIFNldCBvciBSZXNldCB0aGUgQ0MyUCBCaXQgKi8NCiAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MyUCk7DQogIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NQb2xhcml0eSA8PCA0KTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ0VSIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggY2hhbm5lbCAzIHBvbGFyaXR5Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzMgUG9sYXJpdHkNCiAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NQb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KICAqICAgICBAYXJnIFRJTV9PQ1BvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MzUG9sYXJpdHlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1BvbGFyaXR5KQ0Kew0KICB1aW50MTZfdCB0bXBjY2VyID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoVElNX09DUG9sYXJpdHkpKTsNCiAgDQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDM1AgQml0ICovDQogIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDM1ApOw0KICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DUG9sYXJpdHkgPDwgOCk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiByZWdpc3RlciAqLw0KICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IGNoYW5uZWwgNCBwb2xhcml0eS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgT0M0IFBvbGFyaXR5DQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DUG9sYXJpdHlfSGlnaDogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGhpZ2gNCiAgKiAgICAgQGFyZyBUSU1fT0NQb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DNFBvbGFyaXR5Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NQb2xhcml0eSkNCnsNCiAgdWludDE2X3QgdG1wY2NlciA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ1BvbGFyaXR5KSk7DQogIA0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzRQIEJpdCAqLw0KICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzRQKTsNCiAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ1BvbGFyaXR5IDw8IDEyKTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ0VSIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgQ2hhbm5lbCB4Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCwgOSwgMTAgb3IgMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9DaGFubmVsOiBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsDQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0NoYW5uZWxfMTogVElNIENoYW5uZWwgMQ0KICAqICAgICBAYXJnIFRJTV9DaGFubmVsXzI6IFRJTSBDaGFubmVsIDINCiAgKiAgICAgQGFyZyBUSU1fQ2hhbm5lbF8zOiBUSU0gQ2hhbm5lbCAzDQogICogICAgIEBhcmcgVElNX0NoYW5uZWxfNDogVElNIENoYW5uZWwgNA0KICAqIEBwYXJhbSAgVElNX0NDeDogc3BlY2lmaWVzIHRoZSBUSU0gQ2hhbm5lbCBDQ3hFIGJpdCBuZXcgc3RhdGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFRJTV9DQ3hfRW5hYmxlIG9yIFRJTV9DQ3hfRGlzYWJsZS4gDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9DQ3hDbWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9DaGFubmVsLCB1aW50MTZfdCBUSU1fQ0N4KQ0Kew0KICB1aW50MTZfdCB0bXAgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsgDQogIGFzc2VydF9wYXJhbShJU19USU1fQ0NYKFRJTV9DQ3gpKTsNCg0KICB0bXAgPSBDQ0VSX0NDRV9TRVQgPDwgVElNX0NoYW5uZWw7DQoNCiAgLyogUmVzZXQgdGhlIENDeEUgQml0ICovDQogIFRJTXgtPkNDRVIgJj0gKHVpbnQxNl90KX4gdG1wOw0KDQogIC8qIFNldCBvciByZXNldCB0aGUgQ0N4RSBCaXQgKi8gDQogIFRJTXgtPkNDRVIgfD0gICh1aW50MTZfdCkoVElNX0NDeCA8PCBUSU1fQ2hhbm5lbCk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2VsZWN0cyB0aGUgVElNIE91cHV0IENvbXBhcmUgTW9kZS4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIHNlbGVjdGVkIGNoYW5uZWwgYmVmb3JlIGNoYW5naW5nIHRoZSBPdXB1dA0KICAqICAgICAgICAgQ29tcGFyZSBNb2RlLg0KICAqICAgICAgICAgVXNlciBoYXMgdG8gZW5hYmxlIHRoaXMgY2hhbm5lbCB1c2luZyBUSU1fQ0N4Q21kIGFuZCBUSU1fQ0N4TkNtZCBmdW5jdGlvbnMuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0LCA5LCAxMCBvciAxMSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0NoYW5uZWw6IHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwNCiAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fQ2hhbm5lbF8xOiBUSU0gQ2hhbm5lbCAxDQogICogICAgIEBhcmcgVElNX0NoYW5uZWxfMjogVElNIENoYW5uZWwgMg0KICAqICAgICBAYXJnIFRJTV9DaGFubmVsXzM6IFRJTSBDaGFubmVsIDMNCiAgKiAgICAgQGFyZyBUSU1fQ2hhbm5lbF80OiBUSU0gQ2hhbm5lbCA0DQogICogQHBhcmFtICBUSU1fT0NNb2RlOiBzcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBNb2RlLg0KICAqICAgVGhpcyBwYXJhbXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9PQ01vZGVfVGltaW5nDQogICogICAgIEBhcmcgVElNX09DTW9kZV9BY3RpdmUNCiAgKiAgICAgQGFyZyBUSU1fT0NNb2RlX1RvZ2dsZQ0KICAqICAgICBAYXJnIFRJTV9PQ01vZGVfUFdNMQ0KICAqICAgICBAYXJnIFRJTV9PQ01vZGVfUFdNMg0KICAqICAgICBAYXJnIFRJTV9Gb3JjZWRBY3Rpb25fQWN0aXZlDQogICogICAgIEBhcmcgVElNX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2VsZWN0T0N4TShUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NoYW5uZWwsIHVpbnQxNl90IFRJTV9PQ01vZGUpDQp7DQogIHVpbnQzMl90IHRtcCA9IDA7DQogIHVpbnQxNl90IHRtcDEgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsgIA0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTShUSU1fT0NNb2RlKSk7DQogIA0KICB0bXAgPSAodWludDMyX3QpIFRJTXg7DQogIHRtcCArPSBDQ01SX09GRlNFVDsNCg0KICB0bXAxID0gQ0NFUl9DQ0VfU0VUIDw8ICh1aW50MTZfdClUSU1fQ2hhbm5lbDsNCg0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsOiBSZXNldCB0aGUgQ0N4RSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpIH50bXAxOw0KDQogIGlmKChUSU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8xKSB8fChUSU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8zKSkNCiAgew0KICAgIHRtcCArPSAoVElNX0NoYW5uZWw+PjEpOw0KDQogICAgLyogUmVzZXQgdGhlIE9DeE0gYml0cyBpbiB0aGUgQ0NNUnggcmVnaXN0ZXIgKi8NCiAgICAqKF9fSU8gdWludDMyX3QgKikgdG1wICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClUSU1fQ0NNUjFfT0MxTSk7DQogICANCiAgICAvKiBDb25maWd1cmUgdGhlIE9DeE0gYml0cyBpbiB0aGUgQ0NNUnggcmVnaXN0ZXIgKi8NCiAgICAqKF9fSU8gdWludDMyX3QgKikgdG1wIHw9IFRJTV9PQ01vZGU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgdG1wICs9ICh1aW50MTZfdCkoVElNX0NoYW5uZWwgLSAodWludDE2X3QpNCk+PiAodWludDE2X3QpMTsNCg0KICAgIC8qIFJlc2V0IHRoZSBPQ3hNIGJpdHMgaW4gdGhlIENDTVJ4IHJlZ2lzdGVyICovDQogICAgKihfX0lPIHVpbnQzMl90ICopIHRtcCAmPSAodWludDMyX3QpfigodWludDMyX3QpVElNX0NDTVIxX09DMk0pOw0KICAgIA0KICAgIC8qIENvbmZpZ3VyZSB0aGUgT0N4TSBiaXRzIGluIHRoZSBDQ01SeCByZWdpc3RlciAqLw0KICAgICooX19JTyB1aW50MzJfdCAqKSB0bXAgfD0gKHVpbnQxNl90KShUSU1fT0NNb2RlIDw8IDgpOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBEaXNhYmxlcyB0aGUgVElNeCBVcGRhdGUgZXZlbnQuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyIHRvIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUSU14IFVESVMgYml0DQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fVXBkYXRlRGlzYWJsZUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBTZXQgdGhlIFVwZGF0ZSBEaXNhYmxlIEJpdCAqLw0KICAgIFRJTXgtPkNSMSB8PSBUSU1fQ1IxX1VESVM7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgdGhlIFVwZGF0ZSBEaXNhYmxlIEJpdCAqLw0KICAgIFRJTXgtPkNSMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMV9VRElTKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggVXBkYXRlIFJlcXVlc3QgSW50ZXJydXB0IHNvdXJjZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIgdG8gMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9VcGRhdGVTb3VyY2U6IHNwZWNpZmllcyB0aGUgVXBkYXRlIHNvdXJjZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX1VwZGF0ZVNvdXJjZV9SZWd1bGFyOiBTb3VyY2Ugb2YgdXBkYXRlIGlzIHRoZSBjb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIHNldHRpbmcgb2YgVUcgYml0LCBvciBhbiB1cGRhdGUgZ2VuZXJhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyLg0KICAqICAgICBAYXJnIFRJTV9VcGRhdGVTb3VyY2VfR2xvYmFsOiBTb3VyY2Ugb2YgdXBkYXRlIGlzIGNvdW50ZXIgb3ZlcmZsb3cvdW5kZXJmbG93Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fVXBkYXRlUmVxdWVzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX1VwZGF0ZVNvdXJjZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9VUERBVEVfU09VUkNFKFRJTV9VcGRhdGVTb3VyY2UpKTsNCiAgDQogIGlmIChUSU1fVXBkYXRlU291cmNlICE9IFRJTV9VcGRhdGVTb3VyY2VfR2xvYmFsKQ0KICB7DQogICAgLyogU2V0IHRoZSBVUlMgQml0ICovDQogICAgVElNeC0+Q1IxIHw9IFRJTV9DUjFfVVJTOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJlc2V0IHRoZSBVUlMgQml0ICovDQogICAgVElNeC0+Q1IxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ1IxX1VSUyk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14knMgSGFsbCBzZW5zb3IgaW50ZXJmYWNlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUSU14IEhhbGwgc2Vuc29yIGludGVyZmFjZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9TZWxlY3RIYWxsU2Vuc29yKFRJTV9UeXBlRGVmKiBUSU14LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIFNldCB0aGUgVEkxUyBCaXQgKi8NCiAgICBUSU14LT5DUjIgfD0gVElNX0NSMl9USTFTOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJlc2V0IHRoZSBUSTFTIEJpdCAqLw0KICAgIFRJTXgtPkNSMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMl9USTFTKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIFRJTXiScyBPbmUgUHVsc2UgTW9kZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIgdG8gMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PUE1vZGU6IHNwZWNpZmllcyB0aGUgT1BNIE1vZGUgdG8gYmUgdXNlZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09QTW9kZV9TaW5nbGUNCiAgKiAgICAgQGFyZyBUSU1fT1BNb2RlX1JlcGV0aXRpdmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NlbGVjdE9uZVB1bHNlTW9kZShUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09QTW9kZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fTU9ERShUSU1fT1BNb2RlKSk7DQogIA0KICAvKiBSZXNldCB0aGUgT1BNIEJpdCAqLw0KICBUSU14LT5DUjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DUjFfT1BNKTsNCiAgLyogQ29uZmlndXJlIHRoZSBPUE0gTW9kZSAqLw0KICBUSU14LT5DUjEgfD0gVElNX09QTW9kZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZWxlY3RzIHRoZSBUSU14IFRyaWdnZXIgT3V0cHV0IE1vZGUuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0LCA2LCA3IG9yIDkgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9UUkdPU291cmNlOiBzcGVjaWZpZXMgdGhlIFRyaWdnZXIgT3V0cHV0IHNvdXJjZS4NCiAgKiAgIFRoaXMgcGFyYW10ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKg0KICAqICAtIEZvciBhbGwgVElNeA0KICAqICAgICBAYXJnIFRJTV9UUkdPU291cmNlX1Jlc2V0OiAgVGhlIFVHIGJpdCBpbiB0aGUgVElNX0VHUiByZWdpc3RlciBpcyB1c2VkIGFzIHRoZSB0cmlnZ2VyIG91dHB1dCAoVFJHTykuDQogICogICAgIEBhcmcgVElNX1RSR09Tb3VyY2VfRW5hYmxlOiBUaGUgQ291bnRlciBFbmFibGUgQ0VOIGlzIHVzZWQgYXMgdGhlIHRyaWdnZXIgb3V0cHV0IChUUkdPKS4NCiAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9VcGRhdGU6IFRoZSB1cGRhdGUgZXZlbnQgaXMgc2VsZWN0ZWQgYXMgdGhlIHRyaWdnZXIgb3V0cHV0IChUUkdPKS4NCiAgKg0KICAqICAtIEZvciBhbGwgVElNeCBleGNlcHQgVElNNiBhbmQgVElNNw0KICAqICAgICBAYXJnIFRJTV9UUkdPU291cmNlX09DMTogVGhlIHRyaWdnZXIgb3V0cHV0IHNlbmRzIGEgcG9zaXRpdmUgcHVsc2Ugd2hlbiB0aGUgQ0MxSUYgZmxhZw0KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdG8gYmUgc2V0LCBhcyBzb29uIGFzIGEgY2FwdHVyZSBvciBjb21wYXJlIG1hdGNoIG9jY3VycyAoVFJHTykuDQogICogICAgIEBhcmcgVElNX1RSR09Tb3VyY2VfT0MxUmVmOiBPQzFSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdGhlIHRyaWdnZXIgb3V0cHV0IChUUkdPKS4NCg0KICAqICAtIEZvciBhbGwgVElNeCBleGNlcHQgVElNNiwgVElNNywgVElNMTAgYW5kIFRJTTExDQogICogICAgIEBhcmcgVElNX1RSR09Tb3VyY2VfT0MyUmVmOiBPQzJSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdGhlIHRyaWdnZXIgb3V0cHV0IChUUkdPKS4NCg0KICAqICAtIEZvciBUSU0yLCBUSU0zIGFuZCBUSU00DQogICogICAgIEBhcmcgVElNX1RSR09Tb3VyY2VfT0MzUmVmOiBPQzNSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdGhlIHRyaWdnZXIgb3V0cHV0IChUUkdPKS4NCiAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9PQzRSZWY6IE9DNFJFRiBzaWduYWwgaXMgdXNlZCBhcyB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pLg0KICAqDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9TZWxlY3RPdXRwdXRUcmlnZ2VyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fVFJHT1NvdXJjZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzQ2NzlfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUkdPX1NPVVJDRShUSU1fVFJHT1NvdXJjZSkpOw0KDQogIC8qIFJlc2V0IHRoZSBNTVMgQml0cyAqLw0KICBUSU14LT5DUjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DUjJfTU1TKTsNCiAgLyogU2VsZWN0IHRoZSBUUkdPIHNvdXJjZSAqLw0KICBUSU14LT5DUjIgfD0gIFRJTV9UUkdPU291cmNlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIFRJTXggU2xhdmUgTW9kZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQgb3IgOSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX1NsYXZlTW9kZTogc3BlY2lmaWVzIHRoZSBUaW1lciBTbGF2ZSBNb2RlLg0KICAqICAgVGhpcyBwYXJhbXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9TbGF2ZU1vZGVfUmVzZXQ6IFJpc2luZyBlZGdlIG9mIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIHNpZ25hbCAoVFJHSSkgcmUtaW5pdGlhbGl6ZXMNCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY291bnRlciBhbmQgdHJpZ2dlcnMgYW4gdXBkYXRlIG9mIHRoZSByZWdpc3RlcnMuDQogICogICAgIEBhcmcgVElNX1NsYXZlTW9kZV9HYXRlZDogICAgIFRoZSBjb3VudGVyIGNsb2NrIGlzIGVuYWJsZWQgd2hlbiB0aGUgdHJpZ2dlciBzaWduYWwgKFRSR0kpIGlzIGhpZ2guDQogICogICAgIEBhcmcgVElNX1NsYXZlTW9kZV9UcmlnZ2VyOiAgIFRoZSBjb3VudGVyIHN0YXJ0cyBhdCBhIHJpc2luZyBlZGdlIG9mIHRoZSB0cmlnZ2VyIFRSR0kuDQogICogICAgIEBhcmcgVElNX1NsYXZlTW9kZV9FeHRlcm5hbDE6IFJpc2luZyBlZGdlcyBvZiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciAoVFJHSSkgY2xvY2sgdGhlIGNvdW50ZXIuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9TZWxlY3RTbGF2ZU1vZGUoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9TbGF2ZU1vZGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OV9QRVJJUEgoVElNeCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9NT0RFKFRJTV9TbGF2ZU1vZGUpKTsNCiAgDQogIC8qIFJlc2V0IHRoZSBTTVMgQml0cyAqLw0KICBUSU14LT5TTUNSICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fU01DUl9TTVMpOw0KICAvKiBTZWxlY3QgdGhlIFNsYXZlIE1vZGUgKi8NCiAgVElNeC0+U01DUiB8PSBUSU1fU2xhdmVNb2RlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgb3IgUmVzZXRzIHRoZSBUSU14IE1hc3Rlci9TbGF2ZSBNb2RlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCBvciA5IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fTWFzdGVyU2xhdmVNb2RlOiBzcGVjaWZpZXMgdGhlIFRpbWVyIE1hc3RlciBTbGF2ZSBNb2RlLg0KICAqICAgVGhpcyBwYXJhbXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9NYXN0ZXJTbGF2ZU1vZGVfRW5hYmxlOiBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0aGUgY3VycmVudCB0aW1lcg0KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXRzIHNsYXZlcyAodGhyb3VnaCBUUkdPKS4NCiAgKiAgICAgQGFyZyBUSU1fTWFzdGVyU2xhdmVNb2RlX0Rpc2FibGU6IE5vIGFjdGlvbg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2VsZWN0TWFzdGVyU2xhdmVNb2RlKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fTWFzdGVyU2xhdmVNb2RlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNDlfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9NU01fU1RBVEUoVElNX01hc3RlclNsYXZlTW9kZSkpOw0KICANCiAgLyogUmVzZXQgdGhlIE1TTSBCaXQgKi8NCiAgVElNeC0+U01DUiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX1NNQ1JfTVNNKTsNCiAgDQogIC8qIFNldCBvciBSZXNldCB0aGUgTVNNIEJpdCAqLw0KICBUSU14LT5TTUNSIHw9IFRJTV9NYXN0ZXJTbGF2ZU1vZGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyIHRvIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBDb3VudGVyOiBzcGVjaWZpZXMgdGhlIENvdW50ZXIgcmVnaXN0ZXIgbmV3IHZhbHVlLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2V0Q291bnRlcihUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQ291bnRlcikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQogICANCiAgLyogU2V0IHRoZSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNOVCA9IENvdW50ZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBBdXRvcmVsb2FkIFJlZ2lzdGVyIHZhbHVlDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyIHRvIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBBdXRvcmVsb2FkOiBzcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgcmVnaXN0ZXIgbmV3IHZhbHVlLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2V0QXV0b3JlbG9hZChUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQXV0b3JlbG9hZCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgDQogIC8qIFNldCB0aGUgQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZSAqLw0KICBUSU14LT5BUlIgPSBBdXRvcmVsb2FkOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQ2FwdHVyZSBDb21wYXJlMSBSZWdpc3RlciB2YWx1ZQ0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCwgOSwgMTAgb3IgMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIENvbXBhcmUxOiBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZTEgcmVnaXN0ZXIgbmV3IHZhbHVlLg0KICAqIEByZXR2YWwgTm9uZQ0KDQogICovDQp2b2lkIFRJTV9TZXRDb21wYXJlMShUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQ29tcGFyZTEpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsNCiAgDQogIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlMSBSZWdpc3RlciB2YWx1ZSAqLw0KICBUSU14LT5DQ1IxID0gQ29tcGFyZTE7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBDYXB0dXJlIENvbXBhcmUyIFJlZ2lzdGVyIHZhbHVlDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0IG9yIDkgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIENvbXBhcmUyOiBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZTIgcmVnaXN0ZXIgbmV3IHZhbHVlLg0KICAqIEByZXR2YWwgTm9uZQ0KDQogICovDQp2b2lkIFRJTV9TZXRDb21wYXJlMihUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQ29tcGFyZTIpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OV9QRVJJUEgoVElNeCkpOw0KICANCiAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUyIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNDUjIgPSBDb21wYXJlMjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBUSU14IENhcHR1cmUgQ29tcGFyZTMgUmVnaXN0ZXIgdmFsdWUNCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQ29tcGFyZTM6IHNwZWNpZmllcyB0aGUgQ2FwdHVyZSBDb21wYXJlMyByZWdpc3RlciBuZXcgdmFsdWUuDQogICogQHJldHZhbCBOb25lDQoNCiAgKi8NCnZvaWQgVElNX1NldENvbXBhcmUzKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MzJfdCBDb21wYXJlMykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzRfUEVSSVBIKFRJTXgpKTsNCiAgDQogIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlMyBSZWdpc3RlciB2YWx1ZSAqLw0KICBUSU14LT5DQ1IzID0gQ29tcGFyZTM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBDYXB0dXJlIENvbXBhcmU0IFJlZ2lzdGVyIHZhbHVlDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIENvbXBhcmU0OiBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZTQgcmVnaXN0ZXIgbmV3IHZhbHVlLg0KICAqIEByZXR2YWwgTm9uZQ0KDQogICovDQp2b2lkIFRJTV9TZXRDb21wYXJlNChUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQ29tcGFyZTQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIA0KICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZTQgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgVElNeC0+Q0NSNCA9IENvbXBhcmU0Ow0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggSW5wdXQgQ2FwdHVyZSAxIHByZXNjYWxlci4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQsIDksIDEwIG9yIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fSUNQU0M6IHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZTEgcHJlc2NhbGVyIG5ldyB2YWx1ZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYyOiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cw0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cw0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2V0SUMxUHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQU0MpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OTEwMTFfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDUFNDKSk7DQogIA0KICAvKiBSZXNldCB0aGUgSUMxUFNDIEJpdHMgKi8NCiAgVElNeC0+Q0NNUjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMV9JQzFQU0MpOw0KICAvKiBTZXQgdGhlIElDMVBTQyB2YWx1ZSAqLw0KICBUSU14LT5DQ01SMSB8PSBUSU1fSUNQU0M7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBJbnB1dCBDYXB0dXJlIDIgcHJlc2NhbGVyLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMywgNCBvciA5IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fSUNQU0M6IHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZTIgcHJlc2NhbGVyIG5ldyB2YWx1ZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYyOiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cw0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cw0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2V0SUMyUHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQU0MpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0OV9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihUSU1fSUNQU0MpKTsNCiAgDQogIC8qIFJlc2V0IHRoZSBJQzJQU0MgQml0cyAqLw0KICBUSU14LT5DQ01SMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIxX0lDMlBTQyk7DQogIC8qIFNldCB0aGUgSUMyUFNDIHZhbHVlICovDQogIFRJTXgtPkNDTVIxIHw9ICh1aW50MTZfdCkoVElNX0lDUFNDIDw8IDgpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggSW5wdXQgQ2FwdHVyZSAzIHByZXNjYWxlci4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0lDUFNDOiBzcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUzIHByZXNjYWxlciBuZXcgdmFsdWUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXINCiAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMNCiAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWNDogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgNCBldmVudHMNCiAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NldElDM1ByZXNjYWxlcihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUFNDKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihUSU1fSUNQU0MpKTsNCiAgDQogIC8qIFJlc2V0IHRoZSBJQzNQU0MgQml0cyAqLw0KICBUSU14LT5DQ01SMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX0lDM1BTQyk7DQogIC8qIFNldCB0aGUgSUMzUFNDIHZhbHVlICovDQogIFRJTXgtPkNDTVIyIHw9IFRJTV9JQ1BTQzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgNCBwcmVzY2FsZXIuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JQ1BTQzogc3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlNCBwcmVzY2FsZXIgbmV3IHZhbHVlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWMTogbm8gcHJlc2NhbGVyDQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzDQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzDQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjg6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDggZXZlbnRzDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9TZXRJQzRQcmVzY2FsZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BTQykNCnsgIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihUSU1fSUNQU0MpKTsNCiAgDQogIC8qIFJlc2V0IHRoZSBJQzRQU0MgQml0cyAqLw0KICBUSU14LT5DQ01SMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX0lDNFBTQyk7DQogIC8qIFNldCB0aGUgSUM0UFNDIHZhbHVlICovDQogIFRJTXgtPkNDTVIyIHw9ICh1aW50MTZfdCkoVElNX0lDUFNDIDw8IDgpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQ2xvY2sgRGl2aXNpb24gdmFsdWUuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMiwgMywgNCwgOSwgMTAgb3IgMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9DS0Q6IHNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24gdmFsdWUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWU6DQogICogICAgIEBhcmcgVElNX0NLRF9ESVYxOiBURFRTID0gVGNrX3RpbQ0KICAqICAgICBAYXJnIFRJTV9DS0RfRElWMjogVERUUyA9IDIqVGNrX3RpbQ0KICAqICAgICBAYXJnIFRJTV9DS0RfRElWNDogVERUUyA9IDQqVGNrX3RpbQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2V0Q2xvY2tEaXZpc2lvbihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NLRCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzQ5MTAxMV9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0NLRF9ESVYoVElNX0NLRCkpOw0KICANCiAgLyogUmVzZXQgdGhlIENLRCBCaXRzICovDQogIFRJTXgtPkNSMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMV9DS0QpOw0KICAvKiBTZXQgdGhlIENLRCB2YWx1ZSAqLw0KICBUSU14LT5DUjEgfD0gVElNX0NLRDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgMSB2YWx1ZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQsIDksIDEwIG9yIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBDYXB0dXJlIENvbXBhcmUgMSBSZWdpc3RlciB2YWx1ZS4NCg0KICAqLw0KdWludDMyX3QgVElNX0dldENhcHR1cmUxKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNDkxMDExX1BFUklQSChUSU14KSk7DQogIA0KICAvKiBHZXQgdGhlIENhcHR1cmUgMSBSZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gVElNeC0+Q0NSMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgMiB2YWx1ZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQgb3IgOSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ2FwdHVyZSBDb21wYXJlIDIgUmVnaXN0ZXIgdmFsdWUuDQoNCiAgKi8NCnVpbnQzMl90IFRJTV9HZXRDYXB0dXJlMihUSU1fVHlwZURlZiogVElNeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV8yMzQ5X1BFUklQSChUSU14KSk7DQogIA0KICAvKiBHZXQgdGhlIENhcHR1cmUgMiBSZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gVElNeC0+Q0NSMjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgMyB2YWx1ZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ2FwdHVyZSBDb21wYXJlIDMgUmVnaXN0ZXIgdmFsdWUuDQogICovDQp1aW50MzJfdCBUSU1fR2V0Q2FwdHVyZTMoVElNX1R5cGVEZWYqIFRJTXgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7IA0KICANCiAgLyogR2V0IHRoZSBDYXB0dXJlIDMgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTXgtPkNDUjM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgVElNeCBJbnB1dCBDYXB0dXJlIDQgdmFsdWUuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIENhcHR1cmUgQ29tcGFyZSA0IFJlZ2lzdGVyIHZhbHVlLg0KICAqLw0KdWludDMyX3QgVElNX0dldENhcHR1cmU0KFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNXzIzNF9QRVJJUEgoVElNeCkpOw0KICANCiAgLyogR2V0IHRoZSBDYXB0dXJlIDQgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTXgtPkNDUjQ7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgVElNeCBDb3VudGVyIHZhbHVlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiB0byAxMSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ291bnRlciBSZWdpc3RlciB2YWx1ZS4NCiAgKi8NCnVpbnQzMl90IFRJTV9HZXRDb3VudGVyKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICANCiAgLyogR2V0IHRoZSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlICovDQogIHJldHVybiBUSU14LT5DTlQ7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgVElNeCBQcmVzY2FsZXIgdmFsdWUuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyIHRvIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBQcmVzY2FsZXIgUmVnaXN0ZXIgdmFsdWUuDQogICovDQp1aW50MTZfdCBUSU1fR2V0UHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICANCiAgLyogR2V0IHRoZSBQcmVzY2FsZXIgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTXgtPlBTQzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZWxlY3RzIHRoZSBPQ1JlZmVyZW5jZSBDbGVhciBzb3VyY2UuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ1JlZmVyZW5jZUNsZWFyOiBzcGVjaWZpZXMgdGhlIE9DUmVmZXJlbmNlIENsZWFyIHNvdXJjZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DUmVmZXJlbmNlQ2xlYXJfRVRSRjogVGhlIGludGVybmFsIE9DcmVmZXJlbmNlIGNsZWFyIGlucHV0IGlzIGNvbm5lY3RlZCB0byBFVFJGLg0KICAqICAgICBAYXJnIFRJTV9PQ1JlZmVyZW5jZUNsZWFyX09DUkVGQ0xSOiBUaGUgaW50ZXJuYWwgT0NyZWZlcmVuY2UgY2xlYXIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIE9DUkVGX0NMUiBpbnB1dC4gIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2VsZWN0T0NSRUZDbGVhcihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUmVmZXJlbmNlQ2xlYXIpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fMjM0X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShUSU1fT0NSRUZFUkVOQ0VDRUNMRUFSX1NPVVJDRShUSU1fT0NSZWZlcmVuY2VDbGVhcikpOw0KDQogIC8qIFNldCB0aGUgVElNX09DUmVmZXJlbmNlQ2xlYXIgc291cmNlICovDQogIFRJTXgtPlNNQ1IgJj0gICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fU01DUl9PQ0NTKTsNCiAgVElNeC0+U01DUiB8PSAgVElNX09DUmVmZXJlbmNlQ2xlYXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNOSwgVElNMTAgYW5kIFRJTTExIFJlbWFwcGluZyBpbnB1dCBDYXBhYmlsaXRpZXMuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSA5LCAxMCBvciAxMSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX1JlbWFwOiBzcGVjaWZpZXMgdGhlIFRJTSBpbnB1dCByZWFtcHBpbmcgc291cmNlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU05X0dQSU86IFRJTTkgQ2hhbm5lbCAxIGlzIGNvbm5lY3RlZCB0byBkZWRpY2F0ZWQgVGltZXIgcGluKGRlZmF1bHQpDQogICogICAgIEBhcmcgVElNOV9MU0U6IFRJTTkgQ2hhbm5lbCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgY2xvY2suDQogICogICAgIEBhcmcgVElNMTBfR1BJTzogVElNMTAgQ2hhbm5lbCAxIGlzIGNvbm5lY3RlZCB0byBkZWRpY2F0ZWQgVGltZXIgcGluKGRlZmF1bHQpIA0KICAqICAgICBAYXJnIFRJTTEwX0xTSTogVElNMTAgQ2hhbm5lbCAxIGlzIGNvbm5lY3RlZCB0byBMU0kgY2xvY2suDQogICogICAgIEBhcmcgVElNMTBfTFNFOiBUSU0xMCBDaGFubmVsIDEgaXMgY29ubmVjdGVkIHRvIExTRSBjbG9jay4NCiAgKiAgICAgQGFyZyBUSU0xMF9SVEM6IFRJTTEwIENoYW5uZWwgMSBpcyBjb25uZWN0ZWQgdG8gUlRDIE91dHB1dCBldmVudC4gDQogICogICAgIEBhcmcgVElNMTFfR1BJTzogVElNMTEgQ2hhbm5lbCAxIGlzIGNvbm5lY3RlZCB0byBkZWRpY2F0ZWQgVGltZXIgcGluKGRlZmF1bHQpIA0KICAqICAgICBAYXJnIFRJTTExX01TSTogVElNMTEgQ2hhbm5lbCAxIGlzIGNvbm5lY3RlZCB0byBNU0kgY2xvY2suDQogICogICAgIEBhcmcgVElNMTFfSFNFX1JUQzogVElNMTEgQ2hhbm5lbCAxIGlzIGNvbm5lY3RlZCB0byBIU0VfUlRDIGNsb2NrLiAgDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9SZW1hcENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX1JlbWFwKQ0Kew0KIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fOTEwMTFfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9SRU1BUChUSU1fUmVtYXApKTsNCg0KICAvKiBTZXQgdGhlIFRpbWVyIHJlbWFwcGluZyBjb25maWd1cmF0aW9uICovDQogIFRJTXgtPk9SID0gIFRJTV9SZW1hcDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFRJTSBmbGFnIGlzIHNldCBvciBub3QuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyIHRvIDExIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19VcGRhdGU6IFRJTSB1cGRhdGUgRmxhZw0KICAqICAgICBAYXJnIFRJTV9GTEFHX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgRmxhZw0KICAqICAgICBAYXJnIFRJTV9GTEFHX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19UcmlnZ2VyOiBUSU0gVHJpZ2dlciBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ0MxT0Y6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBvdmVyY2FwdHVyZSBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ0MyT0Y6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBvdmVyY2FwdHVyZSBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ0MzT0Y6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBvdmVyY2FwdHVyZSBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ0M0T0Y6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBvdmVyY2FwdHVyZSBGbGFnDQogICogQG5vdGUNCiAgKiAgIC0gVElNNiBhbmQgVElNNyBjYW4gaGF2ZSBvbmx5IG9uZSB1cGRhdGUgZmxhZy4NCiAgKiAgIC0gVElNOSBjYW4gaGF2ZSBvbmx5IHVwZGF0ZSBmbGFnLCBUSU1fRkxBR19DQzEsIFRJTV9GTEFHX0NDMiBhbmQgVElNX0ZMQUdfVHJpZ2dlciwNCiAgKiAgICAgVElNX0ZMQUdfQ0MxT0Ygb3IgVElNX0ZMQUdfQ0MyT0YgZmxhZ3MgIA0KICAqICAgLSBUSU0xMCBhbmQgVElNMTEgY2FuIGhhdmUgb25seSB1cGRhdGUgZmxhZywgVElNX0ZMQUdfQ0MxIG9yIFRJTV9GTEFHX0NDMU9GIGZsYWdzICAgICAgICAgDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFRJTV9GTEFHIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBUSU1fR2V0RmxhZ1N0YXR1cyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZMQUcpDQp7IA0KICBJVFN0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsgDQogICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9HRVRfRkxBRyhUSU1fRkxBRykpOw0KICANCiAgaWYgKChUSU14LT5TUiAmIFRJTV9GTEFHKSAhPSAodWludDE2X3QpUkVTRVQpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIFRJTXgncyBwZW5kaW5nIGZsYWdzLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiB0byAxMSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyBiaXQgdG8gY2xlYXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9GTEFHX1VwZGF0ZTogVElNIHVwZGF0ZSBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgRmxhZw0KICAqICAgICBAYXJnIFRJTV9GTEFHX0NDMjogVElNIENhcHR1cmUgQ29tcGFyZSAyIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgRmxhZw0KICAqICAgICBAYXJnIFRJTV9GTEFHX1RyaWdnZXI6IFRJTSBUcmlnZ2VyIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogVElNIENhcHR1cmUgQ29tcGFyZSAxIG92ZXJjYXB0dXJlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogVElNIENhcHR1cmUgQ29tcGFyZSAyIG92ZXJjYXB0dXJlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogVElNIENhcHR1cmUgQ29tcGFyZSAzIG92ZXJjYXB0dXJlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogVElNIENhcHR1cmUgQ29tcGFyZSA0IG92ZXJjYXB0dXJlIEZsYWcNCiAgKiBAbm90ZQ0KICAqICAgLSBUSU02IGFuZCBUSU03IGNhbiBoYXZlIG9ubHkgb25lIHVwZGF0ZSBmbGFnLiANCiAgKiAgIC0gVElNOSBjYW4gaGF2ZSBvbmx5IHVwZGF0ZSBmbGFnLCBUSU1fRkxBR19DQzEsIFRJTV9GTEFHX0NDMiBhbmQgVElNX0ZMQUdfVHJpZ2dlciBmbGFncw0KICAqICAgICBUSU1fRkxBR19DQzFPRiBvciBUSU1fRkxBR19DQzJPRiBmbGFncyAgDQogICogICAtIFRJTTEwIGFuZCBUSU0xMSBjYW4gaGF2ZSBvbmx5IHVwZGF0ZSBmbGFnLCBUSU1fRkxBR19DQzENCiAgKiAgICAgb3IgVElNX0ZMQUdfQ0MxT0YgZmxhZ3MgICAgICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0NsZWFyRmxhZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZMQUcpDQp7ICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTEVBUl9GTEFHKFRJTV9GTEFHKSk7DQogICANCiAgLyogQ2xlYXIgdGhlIGZsYWdzICovDQogIFRJTXgtPlNSID0gKHVpbnQxNl90KX5USU1fRkxBRzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgVElNIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiB0byAxMSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0lUOiBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSVRfVXBkYXRlOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9UcmlnZ2VyOiBUSU0gVHJpZ2dlciBJbnRlcnJ1cHQgc291cmNlDQogICogQG5vdGUNCiAgKiAgIC0gVElNNiBhbmQgVElNNyBjYW4gZ2VuZXJhdGUgb25seSBhbiB1cGRhdGUgaW50ZXJydXB0Lg0KICAqICAgLSBUSU05IGNhbiBoYXZlIG9ubHkgdXBkYXRlIGludGVycnVwdCwgVElNX0ZMQUdfQ0MxIG9yIFRJTV9GTEFHX0NDMiwNCiAgKiAgICAgaW50ZXJydXB0IGFuZCBUSU1fSVRfVHJpZ2dlciBpbnRlcnJ1cHQuDQogICogICAtIFRJTTEwIGFuZCBUSU0xMSBjYW4gaGF2ZSBvbmx5IHVwZGF0ZSBpbnRlcnJ1cHQgb3IgVElNX0ZMQUdfQ0MxDQogICogICAgIGludGVycnVwdCAgICAgIA0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgVElNX0lUKFNFVCBvciBSRVNFVCkuDQogICovDQpJVFN0YXR1cyBUSU1fR2V0SVRTdGF0dXMoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JVCkNCnsNCiAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7ICANCiAgdWludDE2X3QgaXRzdGF0dXMgPSAweDAsIGl0ZW5hYmxlID0gMHgwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9HRVRfSVQoVElNX0lUKSk7DQogICANCiAgaXRzdGF0dXMgPSBUSU14LT5TUiAmIFRJTV9JVDsNCiAgDQogIGl0ZW5hYmxlID0gVElNeC0+RElFUiAmIFRJTV9JVDsNCiAgaWYgKChpdHN0YXR1cyAhPSAodWludDE2X3QpUkVTRVQpICYmIChpdGVuYWJsZSAhPSAodWludDE2X3QpUkVTRVQpKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBUSU14J3MgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIgdG8gMTEgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JVDogc3BlY2lmaWVzIHRoZSBwZW5kaW5nIGJpdCB0byBjbGVhci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lUX1VwZGF0ZTogVElNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfVHJpZ2dlcjogVElNIFRyaWdnZXIgSW50ZXJydXB0IHNvdXJjZQ0KICAqIEBub3RlDQogICogICAtIFRJTTYgYW5kIFRJTTcgY2FuIGdlbmVyYXRlIG9ubHkgYW4gdXBkYXRlIGludGVycnVwdC4NCiAgKiAgIC0gVElNOSBjYW4gaGF2ZSBvbmx5IHVwZGF0ZSBpbnRlcnJ1cHQsIFRJTV9JVF9DQzEgb3IgVElNX0lUX0NDMiwNCiAgKiAgICAgYW5kIFRJTV9JVF9UcmlnZ2VyIGludGVycnVwdC4gIA0KICAqICAgLSBUSU0xMCBhbmQgVElNMTEgY2FuIGhhdmUgb25seSB1cGRhdGUgaW50ZXJydXB0IG9yIFRJTV9JVF9DQzENCiAgKiAgICAgaW50ZXJydXB0ICAgICAgICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0NsZWFySVRQZW5kaW5nQml0KFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSVQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fSVQoVElNX0lUKSk7DQogICANCiAgLyogQ2xlYXIgdGhlIElUIHBlbmRpbmcgQml0ICovDQogIFRJTXgtPlNSID0gKHVpbnQxNl90KX5USU1fSVQ7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTEgYXMgSW5wdXQuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzLCA0LCA5LCAxMCBvciAxMSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgOiBUaGUgSW5wdXQgUG9sYXJpdHkuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZw0KICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCiAgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbjogc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEk6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzEuDQogICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX0luZGlyZWN0VEk6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzIuDQogICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX1RSQzogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQy4NCiAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlcjogU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBUSTFfQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgVElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIxID0gMCwgdG1wY2NlciA9IDA7DQogIA0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLw0KICBUSU14LT5DQ0VSICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzFFKTsNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MxUykpICYgKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfSUMxRikpKTsNCiAgdG1wY2NtcjEgfD0gKHVpbnQxNl90KShUSU1fSUNTZWxlY3Rpb24gfCAodWludDE2X3QpKFRJTV9JQ0ZpbHRlciA8PCAodWludDE2X3QpNCkpOw0KICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMUUgQml0ICovDQogIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KShUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApKTsNCiAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9JQ1BvbGFyaXR5IHwgKHVpbnQxNl90KVRJTV9DQ0VSX0NDMUUpOw0KICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJMiBhcyBJbnB1dC4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMsIDQgb3IgOSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgOiBUaGUgSW5wdXQgUG9sYXJpdHkuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZw0KICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCiAgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbjogc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEk6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzIuDQogICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX0luZGlyZWN0VEk6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzEuDQogICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX1RSQzogVElNIElucHV0IDIgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQy4NCiAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlcjogU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBUSTJfQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgVElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIxID0gMCwgdG1wY2NlciA9IDAsIHRtcCA9IDA7DQogIA0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLw0KICBUSU14LT5DQ0VSICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzJFKTsNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIHRtcCA9ICh1aW50MTZfdCkoVElNX0lDUG9sYXJpdHkgPDwgNCk7DQogIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MyUykpICYgKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfSUMyRikpKTsNCiAgdG1wY2NtcjEgfD0gKHVpbnQxNl90KShUSU1fSUNGaWx0ZXIgPDwgMTIpOw0KICB0bXBjY21yMSB8PSAodWludDE2X3QpKFRJTV9JQ1NlbGVjdGlvbiA8PCA4KTsNCiAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLw0KICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdCkoVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKSk7DQogIHRtcGNjZXIgfD0gICh1aW50MTZfdCkodG1wIHwgKHVpbnQxNl90KVRJTV9DQ0VSX0NDMkUpOw0KICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxIDsNCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTMgYXMgSW5wdXQuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IDogVGhlIElucHV0IFBvbGFyaXR5Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9SaXNpbmcNCiAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9GYWxsaW5nDQogICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb246IHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMzLg0KICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9JbmRpcmVjdFRJOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUM0Lg0KICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9UUkM6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuDQogICogQHBhcmFtICBUSU1fSUNGaWx0ZXI6IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgVEkzX0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUG9sYXJpdHksIHVpbnQxNl90IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgVElNX0lDRmlsdGVyKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMiA9IDAsIHRtcGNjZXIgPSAwLCB0bXAgPSAwOw0KICANCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAzOiBSZXNldCB0aGUgQ0MzRSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MzRSk7DQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICB0bXAgPSAodWludDE2X3QpKFRJTV9JQ1BvbGFyaXR5IDw8IDgpOw0KICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciAqLw0KICB0bXBjY21yMiAmPSAodWludDE2X3QpKCgodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX0NDM1MpKSAmICgodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX0lDM0YpKSk7DQogIHRtcGNjbXIyIHw9ICh1aW50MTZfdCkoVElNX0lDU2VsZWN0aW9uIHwgKHVpbnQxNl90KShUSU1fSUNGaWx0ZXIgPDwgKHVpbnQxNl90KTQpKTsNCiAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzNFIEJpdCAqLw0KICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdCkoVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKSk7DQogIHRtcGNjZXIgfD0gKHVpbnQxNl90KSh0bXAgfCAodWludDE2X3QpVElNX0NDRVJfQ0MzRSk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgYW5kIENDRVIgcmVnaXN0ZXJzICovDQogIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEk0IGFzIElucHV0Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSA6IFRoZSBJbnB1dCBQb2xhcml0eS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfUmlzaW5nDQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfRmFsbGluZw0KICAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uOiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDNC4NCiAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMy4NCiAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fVFJDOiBUSU0gSW5wdXQgNCBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDLg0KICAqIEBwYXJhbSAgVElNX0lDRmlsdGVyOiBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFRJNF9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9JQ0ZpbHRlcikNCnsNCiAgdWludDE2X3QgdG1wY2NtcjIgPSAwLCB0bXBjY2VyID0gMCwgdG1wID0gMDsNCiAgDQogIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNDogUmVzZXQgdGhlIENDNEUgQml0ICovDQogIFRJTXgtPkNDRVIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDNEUpOw0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCiAgdG1wID0gKHVpbnQxNl90KShUSU1fSUNQb2xhcml0eSA8PCAxMik7DQogIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyICovDQogIHRtcGNjbXIyICY9ICh1aW50MTZfdCkoKHVpbnQxNl90KSh+KHVpbnQxNl90KVRJTV9DQ01SMl9DQzRTKSAmICgodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX0lDNEYpKSk7DQogIHRtcGNjbXIyIHw9ICh1aW50MTZfdCkoVElNX0lDU2VsZWN0aW9uIDw8IDgpOw0KICB0bXBjY21yMiB8PSAodWludDE2X3QpKFRJTV9JQ0ZpbHRlciA8PCAxMik7DQoNCiAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzRFIEJpdCAqLw0KICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdCkoVElNX0NDRVJfQ0M0UCB8IFRJTV9DQ0VSX0NDNE5QKSk7DQogIHRtcGNjZXIgfD0gKHVpbnQxNl90KSh0bXAgfCAodWludDE2X3QpVElNX0NDRVJfQ0M0RSk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgYW5kIENDRVIgcmVnaXN0ZXJzICovDQogIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyIDsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==