LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9mc21jLmMNCiAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KICAqIEB2ZXJzaW9uIFYzLjQuMA0KICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCiAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBGU01DIGZpcm13YXJlIGZ1bmN0aW9ucy4NCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICogQGNvcHkNCiAgKg0KICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQogICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCiAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQogICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KICAqDQogICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQogICovIA0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMyZjEweF9mc21jLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIEZTTUMgDQogICogQGJyaWVmIEZTTUMgZHJpdmVyIG1vZHVsZXMNCiAgKiBAew0KICAqLyANCg0KLyoqIEBkZWZncm91cCBGU01DX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KICAqIEB7DQogICovIA0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBGU01DX1ByaXZhdGVfRGVmaW5lcw0KICAqIEB7DQogICovDQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGU01DIHJlZ2lzdGVycyBiaXQgbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qIEZTTUMgQkNSeCBNYXNrICovDQojZGVmaW5lIEJDUl9NQktFTl9TZXQgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkNCiNkZWZpbmUgQkNSX01CS0VOX1Jlc2V0ICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMEZGRkZFKQ0KI2RlZmluZSBCQ1JfRkFDQ0VOX1NldCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQoNCi8qIEZTTUMgUENSeCBNYXNrICovDQojZGVmaW5lIFBDUl9QQktFTl9TZXQgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkNCiNkZWZpbmUgUENSX1BCS0VOX1Jlc2V0ICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMEZGRkZCKQ0KI2RlZmluZSBQQ1JfRUNDRU5fU2V0ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQojZGVmaW5lIFBDUl9FQ0NFTl9SZXNldCAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDBGRkZCRikNCiNkZWZpbmUgUENSX01lbW9yeVR5cGVfTkFORCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4KQ0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBGU01DX1ByaXZhdGVfTWFjcm9zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBGU01DX1ByaXZhdGVfVmFyaWFibGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBGU01DX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBGU01DX1ByaXZhdGVfRnVuY3Rpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBGU01DIE5PUi9TUkFNIEJhbmtzIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IA0KICAqICAgcmVzZXQgdmFsdWVzLg0KICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEZTTUNfQmFuazFfTk9SU1JBTTE6IEZTTUMgQmFuazEgTk9SL1NSQU0xICANCiAgKiAgICAgQGFyZyBGU01DX0JhbmsxX05PUlNSQU0yOiBGU01DIEJhbmsxIE5PUi9TUkFNMiANCiAgKiAgICAgQGFyZyBGU01DX0JhbmsxX05PUlNSQU0zOiBGU01DIEJhbmsxIE5PUi9TUkFNMyANCiAgKiAgICAgQGFyZyBGU01DX0JhbmsxX05PUlNSQU00OiBGU01DIEJhbmsxIE5PUi9TUkFNNCANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgRlNNQ19OT1JTUkFNRGVJbml0KHVpbnQzMl90IEZTTUNfQmFuaykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19OT1JTUkFNX0JBTksoRlNNQ19CYW5rKSk7DQogIA0KICAvKiBGU01DX0JhbmsxX05PUlNSQU0xICovDQogIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsxX05PUlNSQU0xKQ0KICB7DQogICAgRlNNQ19CYW5rMS0+QlRDUltGU01DX0JhbmtdID0gMHgwMDAwMzBEQjsgICAgDQogIH0NCiAgLyogRlNNQ19CYW5rMV9OT1JTUkFNMiwgIEZTTUNfQmFuazFfTk9SU1JBTTMgb3IgRlNNQ19CYW5rMV9OT1JTUkFNNCAqLw0KICBlbHNlDQogIHsgICANCiAgICBGU01DX0JhbmsxLT5CVENSW0ZTTUNfQmFua10gPSAweDAwMDAzMEQyOyANCiAgfQ0KICBGU01DX0JhbmsxLT5CVENSW0ZTTUNfQmFuayArIDFdID0gMHgwRkZGRkZGRjsNCiAgRlNNQ19CYW5rMUUtPkJXVFJbRlNNQ19CYW5rXSA9IDB4MEZGRkZGRkY7ICANCn0NCg0KLyoqDQogICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBGU01DIE5BTkQgQmFua3MgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLg0KICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KICAqICAgICBAYXJnIEZTTUNfQmFuazNfTkFORDogRlNNQyBCYW5rMyBOQU5EIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGU01DX05BTkREZUluaXQodWludDMyX3QgRlNNQ19CYW5rKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovDQogIGFzc2VydF9wYXJhbShJU19GU01DX05BTkRfQkFOSyhGU01DX0JhbmspKTsNCiAgDQogIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogIHsNCiAgICAvKiBTZXQgdGhlIEZTTUNfQmFuazIgcmVnaXN0ZXJzIHRvIHRoZWlyIHJlc2V0IHZhbHVlcyAqLw0KICAgIEZTTUNfQmFuazItPlBDUjIgPSAweDAwMDAwMDE4Ow0KICAgIEZTTUNfQmFuazItPlNSMiA9IDB4MDAwMDAwNDA7DQogICAgRlNNQ19CYW5rMi0+UE1FTTIgPSAweEZDRkNGQ0ZDOw0KICAgIEZTTUNfQmFuazItPlBBVFQyID0gMHhGQ0ZDRkNGQzsgIA0KICB9DQogIC8qIEZTTUNfQmFuazNfTkFORCAqLyAgDQogIGVsc2UNCiAgew0KICAgIC8qIFNldCB0aGUgRlNNQ19CYW5rMyByZWdpc3RlcnMgdG8gdGhlaXIgcmVzZXQgdmFsdWVzICovDQogICAgRlNNQ19CYW5rMy0+UENSMyA9IDB4MDAwMDAwMTg7DQogICAgRlNNQ19CYW5rMy0+U1IzID0gMHgwMDAwMDA0MDsNCiAgICBGU01DX0JhbmszLT5QTUVNMyA9IDB4RkNGQ0ZDRkM7DQogICAgRlNNQ19CYW5rMy0+UEFUVDMgPSAweEZDRkNGQ0ZDOyANCiAgfSAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgRlNNQyBQQ0NBUkQgQmFuayByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQogICogQHBhcmFtICBOb25lICAgICAgICAgICAgICAgICAgICAgICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgRlNNQ19QQ0NBUkREZUluaXQodm9pZCkNCnsNCiAgLyogU2V0IHRoZSBGU01DX0Jhbms0IHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMgKi8NCiAgRlNNQ19CYW5rNC0+UENSNCA9IDB4MDAwMDAwMTg7IA0KICBGU01DX0Jhbms0LT5TUjQgPSAweDAwMDAwMDAwOwkNCiAgRlNNQ19CYW5rNC0+UE1FTTQgPSAweEZDRkNGQ0ZDOw0KICBGU01DX0Jhbms0LT5QQVRUNCA9IDB4RkNGQ0ZDRkM7DQogIEZTTUNfQmFuazQtPlBJTzQgPSAweEZDRkNGQ0ZDOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGU01DIE5PUi9TUkFNIEJhbmtzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQogICogICBwYXJhbWV0ZXJzIGluIHRoZSBGU01DX05PUlNSQU1Jbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBGU01DX05PUlNSQU1Jbml0VHlwZURlZg0KICAqICAgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIA0KICAqICAgdGhlIEZTTUMgTk9SL1NSQU0gc3BlY2lmaWVkIEJhbmtzLiAgICAgICAgICAgICAgICAgICAgICAgDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEZTTUNfTk9SU1JBTUluaXQoRlNNQ19OT1JTUkFNSW5pdFR5cGVEZWYqIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QpDQp7IA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19OT1JTUkFNX0JBTksoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19CYW5rKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX01VWChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0RhdGFBZGRyZXNzTXV4KSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX01FTU9SWShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX01lbW9yeVR5cGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTUVNT1JZX1dJRFRIKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5RGF0YVdpZHRoKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0JVUlNUTU9ERShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0J1cnN0QWNjZXNzTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19BU1lOV0FJVChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0FzeW5jaHJvbm91c1dhaXQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV0FJVF9QT0xBUklUWShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dhaXRTaWduYWxQb2xhcml0eSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XUkFQX01PREUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XcmFwTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX1NJR05BTF9BQ1RJVkUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XYWl0U2lnbmFsQWN0aXZlKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX1dSSVRFX09QRVJBVElPTihGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlT3BlcmF0aW9uKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX1dBSVRFX1NJR05BTChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dhaXRTaWduYWwpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfRVhURU5ERURfTU9ERShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0V4dGVuZGVkTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XUklURV9CVVJTVChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlQnVyc3QpKTsgIA0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19BRERSRVNTX1NFVFVQX1RJTUUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc1NldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19BRERSRVNTX0hPTERfVElNRShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzSG9sZFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfREFUQVNFVFVQX1RJTUUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YVNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19UVVJOQVJPVU5EX1RJTUUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQnVzVHVybkFyb3VuZER1cmF0aW9uKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0NMS19ESVYoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24pKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfREFUQV9MQVRFTkNZKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFMYXRlbmN5KSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0FDQ0VTU19NT0RFKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FjY2Vzc01vZGUpKTsgDQogIA0KICAvKiBCYW5rMSBOT1IvU1JBTSBjb250cm9sIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gKi8gDQogIEZTTUNfQmFuazEtPkJUQ1JbRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19CYW5rXSA9IA0KICAgICAgICAgICAgKHVpbnQzMl90KUZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfRGF0YUFkZHJlc3NNdXggfA0KICAgICAgICAgICAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlUeXBlIHwNCiAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5RGF0YVdpZHRoIHwNCiAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQnVyc3RBY2Nlc3NNb2RlIHwNCiAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQXN5bmNocm9ub3VzV2FpdCB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dhaXRTaWduYWxQb2xhcml0eSB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyYXBNb2RlIHwNCiAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbEFjdGl2ZSB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlT3BlcmF0aW9uIHwNCiAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbCB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0V4dGVuZGVkTW9kZSB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlQnVyc3Q7DQoNCiAgaWYoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlUeXBlID09IEZTTUNfTWVtb3J5VHlwZV9OT1IpDQogIHsNCiAgICBGU01DX0JhbmsxLT5CVENSW0ZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQmFua10gfD0gKHVpbnQzMl90KUJDUl9GQUNDRU5fU2V0Ow0KICB9DQogIA0KICAvKiBCYW5rMSBOT1IvU1JBTSB0aW1pbmcgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiAqLw0KICBGU01DX0JhbmsxLT5CVENSW0ZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQmFuaysxXSA9IA0KICAgICAgICAgICAgKHVpbnQzMl90KUZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NTZXR1cFRpbWUgfA0KICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NIb2xkVGltZSA8PCA0KSB8DQogICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YVNldHVwVGltZSA8PCA4KSB8DQogICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQnVzVHVybkFyb3VuZER1cmF0aW9uIDw8IDE2KSB8DQogICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24gPDwgMjApIHwNCiAgICAgICAgICAgIChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhTGF0ZW5jeSA8PCAyNCkgfA0KICAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FjY2Vzc01vZGU7DQogICAgICAgICAgICANCiAgICANCiAgLyogQmFuazEgTk9SL1NSQU0gdGltaW5nIHJlZ2lzdGVyIGZvciB3cml0ZSBjb25maWd1cmF0aW9uLCBpZiBleHRlbmRlZCBtb2RlIGlzIHVzZWQgKi8NCiAgaWYoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19FeHRlbmRlZE1vZGUgPT0gRlNNQ19FeHRlbmRlZE1vZGVfRW5hYmxlKQ0KICB7DQogICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQUREUkVTU19TRVRVUF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc1NldHVwVGltZSkpOw0KICAgIGFzc2VydF9wYXJhbShJU19GU01DX0FERFJFU1NfSE9MRF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc0hvbGRUaW1lKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfREFUQVNFVFVQX1RJTUUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhU2V0dXBUaW1lKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQ0xLX0RJVihGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0NMS0RpdmlzaW9uKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfREFUQV9MQVRFTkNZKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YUxhdGVuY3kpKTsNCiAgICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19BQ0NFU1NfTU9ERShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0FjY2Vzc01vZGUpKTsNCiAgICBGU01DX0JhbmsxRS0+QldUUltGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0JhbmtdID0gDQogICAgICAgICAgICAgICh1aW50MzJfdClGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NTZXR1cFRpbWUgfA0KICAgICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzSG9sZFRpbWUgPDwgNCApfA0KICAgICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhU2V0dXBUaW1lIDw8IDgpIHwNCiAgICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24gPDwgMjApIHwNCiAgICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YUxhdGVuY3kgPDwgMjQpIHwNCiAgICAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWNjZXNzTW9kZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBGU01DX0JhbmsxRS0+QldUUltGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0JhbmtdID0gMHgwRkZGRkZGRjsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGU01DIE5BTkQgQmFua3MgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgDQogICogICBwYXJhbWV0ZXJzIGluIHRoZSBGU01DX05BTkRJbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgRlNNQ19OQU5ESW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBGU01DX05BTkRJbml0VHlwZURlZiANCiAgKiAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRlNNQyBOQU5EIHNwZWNpZmllZCBCYW5rcy4gICAgICAgICAgICAgICAgICAgICAgIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGU01DX05BTkRJbml0KEZTTUNfTkFOREluaXRUeXBlRGVmKiBGU01DX05BTkRJbml0U3RydWN0KQ0Kew0KICB1aW50MzJfdCB0bXBwY3IgPSAweDAwMDAwMDAwLCB0bXBwbWVtID0gMHgwMDAwMDAwMCwgdG1wcGF0dCA9IDB4MDAwMDAwMDA7IA0KICAgIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oIElTX0ZTTUNfTkFORF9CQU5LKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQmFuaykpOw0KICBhc3NlcnRfcGFyYW0oIElTX0ZTTUNfV0FJVF9GRUFUVVJFKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfV2FpdGZlYXR1cmUpKTsNCiAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX01FTU9SWV9XSURUSChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX01lbW9yeURhdGFXaWR0aCkpOw0KICBhc3NlcnRfcGFyYW0oIElTX0ZTTUNfRUNDX1NUQVRFKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfRUNDKSk7DQogIGFzc2VydF9wYXJhbSggSVNfRlNNQ19FQ0NQQUdFX1NJWkUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19FQ0NQYWdlU2l6ZSkpOw0KICBhc3NlcnRfcGFyYW0oIElTX0ZTTUNfVENMUl9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfVENMUlNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oIElTX0ZTTUNfVEFSX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19UQVJTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfU0VUVVBfVElNRShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0hPTERfVElNRShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSElaX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfU0VUVVBfVElNRShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0hPTERfVElNRShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSElaX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUpKTsNCiAgDQogIC8qIFNldCB0aGUgdG1wcGNyIHZhbHVlIGFjY29yZGluZyB0byBGU01DX05BTkRJbml0U3RydWN0IHBhcmFtZXRlcnMgKi8NCiAgdG1wcGNyID0gKHVpbnQzMl90KUZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfV2FpdGZlYXR1cmUgfA0KICAgICAgICAgICAgUENSX01lbW9yeVR5cGVfTkFORCB8DQogICAgICAgICAgICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX01lbW9yeURhdGFXaWR0aCB8DQogICAgICAgICAgICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0VDQyB8DQogICAgICAgICAgICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0VDQ1BhZ2VTaXplIHwNCiAgICAgICAgICAgIChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX1RDTFJTZXR1cFRpbWUgPDwgOSApfA0KICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfVEFSU2V0dXBUaW1lIDw8IDEzKTsNCiAgICAgICAgICAgIA0KICAvKiBTZXQgdG1wcG1lbSB2YWx1ZSBhY2NvcmRpbmcgdG8gRlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdHVyZSBwYXJhbWV0ZXJzICovDQogIHRtcHBtZW0gPSAodWludDMyX3QpRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUgfA0KICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSA8PCA4KSB8DQogICAgICAgICAgICAoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lIDw8IDE2KXwNCiAgICAgICAgICAgIChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSA8PCAyNCk7IA0KICAgICAgICAgICAgDQogIC8qIFNldCB0bXBwYXR0IHZhbHVlIGFjY29yZGluZyB0byBGU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0dXJlIHBhcmFtZXRlcnMgKi8NCiAgdG1wcGF0dCA9ICh1aW50MzJfdClGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSB8DQogICAgICAgICAgICAoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lIDw8IDgpIHwNCiAgICAgICAgICAgIChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPDwgMTYpfA0KICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lIDw8IDI0KTsNCiAgDQogIGlmKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogIHsNCiAgICAvKiBGU01DX0JhbmsyX05BTkQgcmVnaXN0ZXJzIGNvbmZpZ3VyYXRpb24gKi8NCiAgICBGU01DX0JhbmsyLT5QQ1IyID0gdG1wcGNyOw0KICAgIEZTTUNfQmFuazItPlBNRU0yID0gdG1wcG1lbTsNCiAgICBGU01DX0JhbmsyLT5QQVRUMiA9IHRtcHBhdHQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRlNNQ19CYW5rM19OQU5EIHJlZ2lzdGVycyBjb25maWd1cmF0aW9uICovDQogICAgRlNNQ19CYW5rMy0+UENSMyA9IHRtcHBjcjsNCiAgICBGU01DX0JhbmszLT5QTUVNMyA9IHRtcHBtZW07DQogICAgRlNNQ19CYW5rMy0+UEFUVDMgPSB0bXBwYXR0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEZTTUMgUENDQVJEIEJhbmsgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgDQogICogICBwYXJhbWV0ZXJzIGluIHRoZSBGU01DX1BDQ0FSREluaXRTdHJ1Y3QuDQogICogQHBhcmFtICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgRlNNQ19QQ0NBUkRJbml0VHlwZURlZg0KICAqICAgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBGU01DIFBDQ0FSRCBCYW5rLiAgICAgICAgICAgICAgICAgICAgICAgDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEZTTUNfUENDQVJESW5pdChGU01DX1BDQ0FSREluaXRUeXBlRGVmKiBGU01DX1BDQ0FSREluaXRTdHJ1Y3QpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GU01DX1dBSVRfRkVBVFVSRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfV2FpdGZlYXR1cmUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfVENMUl9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19UQ0xSU2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX1RBUl9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19UQVJTZXR1cFRpbWUpKTsNCiANCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfU0VUVVBfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX1dBSVRfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19IT0xEX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSElaX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSkpOw0KICANCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfU0VUVVBfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX1dBSVRfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19IT0xEX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSElaX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19TRVRVUF9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19IT0xEX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSG9sZFNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19ISVpfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUpKTsNCiAgDQogIC8qIFNldCB0aGUgUENSNCByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgdG8gRlNNQ19QQ0NBUkRJbml0U3RydWN0IHBhcmFtZXRlcnMgKi8NCiAgRlNNQ19CYW5rNC0+UENSNCA9ICh1aW50MzJfdClGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfV2FpdGZlYXR1cmUgfA0KICAgICAgICAgICAgICAgICAgICAgRlNNQ19NZW1vcnlEYXRhV2lkdGhfMTZiIHwgIA0KICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19UQ0xSU2V0dXBUaW1lIDw8IDkpIHwNCiAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfVEFSU2V0dXBUaW1lIDw8IDEzKTsNCiAgICAgICAgICAgIA0KICAvKiBTZXQgUE1FTTQgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIHRvIEZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3R1cmUgcGFyYW1ldGVycyAqLw0KICBGU01DX0Jhbms0LT5QTUVNNCA9ICh1aW50MzJfdClGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lIHwNCiAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPDwgOCkgfA0KICAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSG9sZFNldHVwVGltZSA8PCAxNil8DQogICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUgPDwgMjQpOyANCiAgICAgICAgICAgIA0KICAvKiBTZXQgUEFUVDQgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIHRvIEZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3R1cmUgcGFyYW1ldGVycyAqLw0KICBGU01DX0Jhbms0LT5QQVRUNCA9ICh1aW50MzJfdClGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lIHwNCiAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPDwgOCkgfA0KICAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSG9sZFNldHVwVGltZSA8PCAxNil8DQogICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUgPDwgMjQpOwkNCiAgICAgICAgICAgIA0KICAvKiBTZXQgUElPNCByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgdG8gRlNNQ19JT1NwYWNlVGltaW5nU3RydWN0dXJlIHBhcmFtZXRlcnMgKi8NCiAgRlNNQ19CYW5rNC0+UElPNCA9ICh1aW50MzJfdClGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUgfA0KICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPDwgOCkgfA0KICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPDwgMTYpfA0KICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSA8PCAyNCk7ICAgICAgICAgICAgIA0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggRlNNQ19OT1JTUkFNSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiAgKiBAcGFyYW0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBGU01DX05PUlNSQU1Jbml0VHlwZURlZiANCiAgKiAgIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGU01DX05PUlNSQU1TdHJ1Y3RJbml0KEZTTUNfTk9SU1JBTUluaXRUeXBlRGVmKiBGU01DX05PUlNSQU1Jbml0U3RydWN0KQ0KeyAgDQogIC8qIFJlc2V0IE5PUi9TUkFNIEluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovDQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQmFuayA9IEZTTUNfQmFuazFfTk9SU1JBTTE7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfRGF0YUFkZHJlc3NNdXggPSBGU01DX0RhdGFBZGRyZXNzTXV4X0VuYWJsZTsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlUeXBlID0gRlNNQ19NZW1vcnlUeXBlX1NSQU07DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5RGF0YVdpZHRoID0gRlNNQ19NZW1vcnlEYXRhV2lkdGhfOGI7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQnVyc3RBY2Nlc3NNb2RlID0gRlNNQ19CdXJzdEFjY2Vzc01vZGVfRGlzYWJsZTsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Bc3luY2hyb25vdXNXYWl0ID0gRlNNQ19Bc3luY2hyb25vdXNXYWl0X0Rpc2FibGU7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbFBvbGFyaXR5ID0gRlNNQ19XYWl0U2lnbmFsUG9sYXJpdHlfTG93Ow0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyYXBNb2RlID0gRlNNQ19XcmFwTW9kZV9EaXNhYmxlOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dhaXRTaWduYWxBY3RpdmUgPSBGU01DX1dhaXRTaWduYWxBY3RpdmVfQmVmb3JlV2FpdFN0YXRlOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlT3BlcmF0aW9uID0gRlNNQ19Xcml0ZU9wZXJhdGlvbl9FbmFibGU7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbCA9IEZTTUNfV2FpdFNpZ25hbF9FbmFibGU7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfRXh0ZW5kZWRNb2RlID0gRlNNQ19FeHRlbmRlZE1vZGVfRGlzYWJsZTsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZUJ1cnN0ID0gRlNNQ19Xcml0ZUJ1cnN0X0Rpc2FibGU7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NTZXR1cFRpbWUgPSAweEY7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NIb2xkVGltZSA9IDB4RjsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YVNldHVwVGltZSA9IDB4RkY7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0J1c1R1cm5Bcm91bmREdXJhdGlvbiA9IDB4RjsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24gPSAweEY7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFMYXRlbmN5ID0gMHhGOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BY2Nlc3NNb2RlID0gRlNNQ19BY2Nlc3NNb2RlX0E7IA0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NTZXR1cFRpbWUgPSAweEY7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc0hvbGRUaW1lID0gMHhGOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFTZXR1cFRpbWUgPSAweEZGOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0J1c1R1cm5Bcm91bmREdXJhdGlvbiA9IDB4RjsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19DTEtEaXZpc2lvbiA9IDB4RjsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhTGF0ZW5jeSA9IDB4RjsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BY2Nlc3NNb2RlID0gRlNNQ19BY2Nlc3NNb2RlX0E7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBGU01DX05BTkRJbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KICAqIEBwYXJhbSAgRlNNQ19OQU5ESW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEZTTUNfTkFOREluaXRUeXBlRGVmIA0KICAqICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEZTTUNfTkFORFN0cnVjdEluaXQoRlNNQ19OQU5ESW5pdFR5cGVEZWYqIEZTTUNfTkFOREluaXRTdHJ1Y3QpDQp7IA0KICAvKiBSZXNldCBOQU5EIEluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovDQogIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQmFuayA9IEZTTUNfQmFuazJfTkFORDsNCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19XYWl0ZmVhdHVyZSA9IEZTTUNfV2FpdGZlYXR1cmVfRGlzYWJsZTsNCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlEYXRhV2lkdGggPSBGU01DX01lbW9yeURhdGFXaWR0aF84YjsNCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19FQ0MgPSBGU01DX0VDQ19EaXNhYmxlOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0VDQ1BhZ2VTaXplID0gRlNNQ19FQ0NQYWdlU2l6ZV8yNTZCeXRlczsNCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19UQ0xSU2V0dXBUaW1lID0gMHgwOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX1RBUlNldHVwVGltZSA9IDB4MDsNCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUgPSAweEZDOwkgIA0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggRlNNQ19QQ0NBUkRJbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KICAqIEBwYXJhbSAgRlNNQ19QQ0NBUkRJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgRlNNQ19QQ0NBUkRJbml0VHlwZURlZiANCiAgKiAgIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGU01DX1BDQ0FSRFN0cnVjdEluaXQoRlNNQ19QQ0NBUkRJbml0VHlwZURlZiogRlNNQ19QQ0NBUkRJbml0U3RydWN0KQ0Kew0KICAvKiBSZXNldCBQQ0NBUkQgSW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgKi8NCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1dhaXRmZWF0dXJlID0gRlNNQ19XYWl0ZmVhdHVyZV9EaXNhYmxlOw0KICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfVENMUlNldHVwVGltZSA9IDB4MDsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1RBUlNldHVwVGltZSA9IDB4MDsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lID0gMHhGQzsJDQogIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lID0gMHhGQzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgTk9SL1NSQU0gTWVtb3J5IEJhbmsuDQogICogQHBhcmFtICBGU01DX0Jhbms6IHNwZWNpZmllcyB0aGUgRlNNQyBCYW5rIHRvIGJlIHVzZWQNCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRlNNQ19CYW5rMV9OT1JTUkFNMTogRlNNQyBCYW5rMSBOT1IvU1JBTTEgIA0KICAqICAgICBAYXJnIEZTTUNfQmFuazFfTk9SU1JBTTI6IEZTTUMgQmFuazEgTk9SL1NSQU0yIA0KICAqICAgICBAYXJnIEZTTUNfQmFuazFfTk9SU1JBTTM6IEZTTUMgQmFuazEgTk9SL1NSQU0zIA0KICAqICAgICBAYXJnIEZTTUNfQmFuazFfTk9SU1JBTTQ6IEZTTUMgQmFuazEgTk9SL1NSQU00IA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRlNNQ19CYW5rLiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGU01DX05PUlNSQU1DbWQodWludDMyX3QgRlNNQ19CYW5rLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGFzc2VydF9wYXJhbShJU19GU01DX05PUlNSQU1fQkFOSyhGU01DX0JhbmspKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBOT1IvU1JBTSBCYW5rIGJ5IHNldHRpbmcgdGhlIFBCS0VOIGJpdCBpbiB0aGUgQkNSeCByZWdpc3RlciAqLw0KICAgIEZTTUNfQmFuazEtPkJUQ1JbRlNNQ19CYW5rXSB8PSBCQ1JfTUJLRU5fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIE5PUi9TUkFNIEJhbmsgYnkgY2xlYXJpbmcgdGhlIFBCS0VOIGJpdCBpbiB0aGUgQkNSeCByZWdpc3RlciAqLw0KICAgIEZTTUNfQmFuazEtPkJUQ1JbRlNNQ19CYW5rXSAmPSBCQ1JfTUJLRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgTkFORCBNZW1vcnkgQmFuay4NCiAgKiBAcGFyYW0gIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBGU01DX0JhbmsyX05BTkQ6IEZTTUMgQmFuazIgTkFORCANCiAgKiAgICAgQGFyZyBGU01DX0JhbmszX05BTkQ6IEZTTUMgQmFuazMgTkFORA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRlNNQ19CYW5rLiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGU01DX05BTkRDbWQodWludDMyX3QgRlNNQ19CYW5rLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGFzc2VydF9wYXJhbShJU19GU01DX05BTkRfQkFOSyhGU01DX0JhbmspKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBOQU5EIEJhbmsgYnkgc2V0dGluZyB0aGUgUEJLRU4gYml0IGluIHRoZSBQQ1J4IHJlZ2lzdGVyICovDQogICAgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazJfTkFORCkNCiAgICB7DQogICAgICBGU01DX0JhbmsyLT5QQ1IyIHw9IFBDUl9QQktFTl9TZXQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBGU01DX0JhbmszLT5QQ1IzIHw9IFBDUl9QQktFTl9TZXQ7DQogICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIE5BTkQgQmFuayBieSBjbGVhcmluZyB0aGUgUEJLRU4gYml0IGluIHRoZSBQQ1J4IHJlZ2lzdGVyICovDQogICAgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazJfTkFORCkNCiAgICB7DQogICAgICBGU01DX0JhbmsyLT5QQ1IyICY9IFBDUl9QQktFTl9SZXNldDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIEZTTUNfQmFuazMtPlBDUjMgJj0gUENSX1BCS0VOX1Jlc2V0Ow0KICAgIH0NCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFBDQ0FSRCBNZW1vcnkgQmFuay4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFBDQ0FSRCBNZW1vcnkgQmFuay4gIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgRlNNQ19QQ0NBUkRDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFBDQ0FSRCBCYW5rIGJ5IHNldHRpbmcgdGhlIFBCS0VOIGJpdCBpbiB0aGUgUENSNCByZWdpc3RlciAqLw0KICAgIEZTTUNfQmFuazQtPlBDUjQgfD0gUENSX1BCS0VOX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBQQ0NBUkQgQmFuayBieSBjbGVhcmluZyB0aGUgUEJLRU4gYml0IGluIHRoZSBQQ1I0IHJlZ2lzdGVyICovDQogICAgRlNNQ19CYW5rNC0+UENSNCAmPSBQQ1JfUEJLRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBGU01DIE5BTkQgRUNDIGZlYXR1cmUuDQogICogQHBhcmFtICBGU01DX0Jhbms6IHNwZWNpZmllcyB0aGUgRlNNQyBCYW5rIHRvIGJlIHVzZWQNCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRlNNQ19CYW5rMl9OQU5EOiBGU01DIEJhbmsyIE5BTkQgDQogICogICAgIEBhcmcgRlNNQ19CYW5rM19OQU5EOiBGU01DIEJhbmszIE5BTkQNCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEZTTUMgTkFORCBFQ0MgZmVhdHVyZS4gIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgRlNNQ19OQU5ERUNDQ21kKHVpbnQzMl90IEZTTUNfQmFuaywgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19OQU5EX0JBTksoRlNNQ19CYW5rKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgTkFORCBCYW5rIEVDQyBmdW5jdGlvbiBieSBzZXR0aW5nIHRoZSBFQ0NFTiBiaXQgaW4gdGhlIFBDUnggcmVnaXN0ZXIgKi8NCiAgICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KICAgIHsNCiAgICAgIEZTTUNfQmFuazItPlBDUjIgfD0gUENSX0VDQ0VOX1NldDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIEZTTUNfQmFuazMtPlBDUjMgfD0gUENSX0VDQ0VOX1NldDsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgTkFORCBCYW5rIEVDQyBmdW5jdGlvbiBieSBjbGVhcmluZyB0aGUgRUNDRU4gYml0IGluIHRoZSBQQ1J4IHJlZ2lzdGVyICovDQogICAgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazJfTkFORCkNCiAgICB7DQogICAgICBGU01DX0JhbmsyLT5QQ1IyICY9IFBDUl9FQ0NFTl9SZXNldDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIEZTTUNfQmFuazMtPlBDUjMgJj0gUENSX0VDQ0VOX1Jlc2V0Ow0KICAgIH0NCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGVycm9yIGNvcnJlY3Rpb24gY29kZSByZWdpc3RlciB2YWx1ZS4NCiAgKiBAcGFyYW0gIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBGU01DX0JhbmsyX05BTkQ6IEZTTUMgQmFuazIgTkFORCANCiAgKiAgICAgQGFyZyBGU01DX0JhbmszX05BTkQ6IEZTTUMgQmFuazMgTkFORA0KICAqIEByZXR2YWwgVGhlIEVycm9yIENvcnJlY3Rpb24gQ29kZSAoRUNDKSB2YWx1ZS4NCiAgKi8NCnVpbnQzMl90IEZTTUNfR2V0RUNDKHVpbnQzMl90IEZTTUNfQmFuaykNCnsNCiAgdWludDMyX3QgZWNjdmFsID0gMHgwMDAwMDAwMDsNCiAgDQogIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogIHsNCiAgICAvKiBHZXQgdGhlIEVDQ1IyIHJlZ2lzdGVyIHZhbHVlICovDQogICAgZWNjdmFsID0gRlNNQ19CYW5rMi0+RUNDUjI7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogR2V0IHRoZSBFQ0NSMyByZWdpc3RlciB2YWx1ZSAqLw0KICAgIGVjY3ZhbCA9IEZTTUNfQmFuazMtPkVDQ1IzOw0KICB9DQogIC8qIFJldHVybiB0aGUgZXJyb3IgY29ycmVjdGlvbiBjb2RlIHZhbHVlICovDQogIHJldHVybihlY2N2YWwpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBGU01DIGludGVycnVwdHMuDQogICogQHBhcmFtICBGU01DX0Jhbms6IHNwZWNpZmllcyB0aGUgRlNNQyBCYW5rIHRvIGJlIHVzZWQNCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRlNNQ19CYW5rMl9OQU5EOiBGU01DIEJhbmsyIE5BTkQgDQogICogICAgIEBhcmcgRlNNQ19CYW5rM19OQU5EOiBGU01DIEJhbmszIE5BTkQNCiAgKiAgICAgQGFyZyBGU01DX0Jhbms0X1BDQ0FSRDogRlNNQyBCYW5rNCBQQ0NBUkQNCiAgKiBAcGFyYW0gIEZTTUNfSVQ6IHNwZWNpZmllcyB0aGUgRlNNQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBGU01DX0lUX1Jpc2luZ0VkZ2U6IFJpc2luZyBlZGdlIGRldGVjdGlvbiBpbnRlcnJ1cHQuIA0KICAqICAgICBAYXJnIEZTTUNfSVRfTGV2ZWw6IExldmVsIGVkZ2UgZGV0ZWN0aW9uIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBGU01DX0lUX0ZhbGxpbmdFZGdlOiBGYWxsaW5nIGVkZ2UgZGV0ZWN0aW9uIGludGVycnVwdC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBGU01DIGludGVycnVwdHMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGU01DX0lUQ29uZmlnKHVpbnQzMl90IEZTTUNfQmFuaywgdWludDMyX3QgRlNNQ19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19JVF9CQU5LKEZTTUNfQmFuaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19JVChGU01DX0lUKSk7CQ0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEZTTUNfQmFuazIgaW50ZXJydXB0cyAqLw0KICAgIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogICAgew0KICAgICAgRlNNQ19CYW5rMi0+U1IyIHw9IEZTTUNfSVQ7DQogICAgfQ0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgRlNNQ19CYW5rMyBpbnRlcnJ1cHRzICovDQogICAgZWxzZSBpZiAoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCiAgICB7DQogICAgICBGU01DX0JhbmszLT5TUjMgfD0gRlNNQ19JVDsNCiAgICB9DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBGU01DX0Jhbms0IGludGVycnVwdHMgKi8NCiAgICBlbHNlDQogICAgew0KICAgICAgRlNNQ19CYW5rNC0+U1I0IHw9IEZTTUNfSVQ7ICAgIA0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBGU01DX0JhbmsyIGludGVycnVwdHMgKi8NCiAgICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KICAgIHsNCiAgICAgIA0KICAgICAgRlNNQ19CYW5rMi0+U1IyICY9ICh1aW50MzJfdCl+RlNNQ19JVDsNCiAgICB9DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRlNNQ19CYW5rMyBpbnRlcnJ1cHRzICovDQogICAgZWxzZSBpZiAoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCiAgICB7DQogICAgICBGU01DX0JhbmszLT5TUjMgJj0gKHVpbnQzMl90KX5GU01DX0lUOw0KICAgIH0NCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBGU01DX0Jhbms0IGludGVycnVwdHMgKi8NCiAgICBlbHNlDQogICAgew0KICAgICAgRlNNQ19CYW5rNC0+U1I0ICY9ICh1aW50MzJfdCl+RlNNQ19JVDsgICAgDQogICAgfQ0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGU01DIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiAgKiBAcGFyYW0gIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBGU01DX0JhbmsyX05BTkQ6IEZTTUMgQmFuazIgTkFORCANCiAgKiAgICAgQGFyZyBGU01DX0JhbmszX05BTkQ6IEZTTUMgQmFuazMgTkFORA0KICAqICAgICBAYXJnIEZTTUNfQmFuazRfUENDQVJEOiBGU01DIEJhbms0IFBDQ0FSRA0KICAqIEBwYXJhbSAgRlNNQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEZTTUNfRkxBR19SaXNpbmdFZGdlOiBSaXNpbmcgZWdkZSBkZXRlY3Rpb24gRmxhZy4NCiAgKiAgICAgQGFyZyBGU01DX0ZMQUdfTGV2ZWw6IExldmVsIGRldGVjdGlvbiBGbGFnLg0KICAqICAgICBAYXJnIEZTTUNfRkxBR19GYWxsaW5nRWRnZTogRmFsbGluZyBlZ2RlIGRldGVjdGlvbiBGbGFnLg0KICAqICAgICBAYXJnIEZTTUNfRkxBR19GRU1QVDogRmlmbyBlbXB0eSBGbGFnLiANCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgRlNNQ19GTEFHIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBGU01DX0dldEZsYWdTdGF0dXModWludDMyX3QgRlNNQ19CYW5rLCB1aW50MzJfdCBGU01DX0ZMQUcpDQp7DQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIHVpbnQzMl90IHRtcHNyID0gMHgwMDAwMDAwMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GU01DX0dFVEZMQUdfQkFOSyhGU01DX0JhbmspKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfR0VUX0ZMQUcoRlNNQ19GTEFHKSk7DQogIA0KICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KICB7DQogICAgdG1wc3IgPSBGU01DX0JhbmsyLT5TUjI7DQogIH0gIA0KICBlbHNlIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmszX05BTkQpDQogIHsNCiAgICB0bXBzciA9IEZTTUNfQmFuazMtPlNSMzsNCiAgfQ0KICAvKiBGU01DX0Jhbms0X1BDQ0FSRCovDQogIGVsc2UNCiAgew0KICAgIHRtcHNyID0gRlNNQ19CYW5rNC0+U1I0Ow0KICB9IA0KICANCiAgLyogR2V0IHRoZSBmbGFnIHN0YXR1cyAqLw0KICBpZiAoKHRtcHNyICYgRlNNQ19GTEFHKSAhPSAodWludDE2X3QpUkVTRVQgKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgZmxhZyBzdGF0dXMgKi8NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIEZTTUOScyBwZW5kaW5nIGZsYWdzLg0KICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KICAqICAgICBAYXJnIEZTTUNfQmFuazNfTkFORDogRlNNQyBCYW5rMyBOQU5EDQogICogICAgIEBhcmcgRlNNQ19CYW5rNF9QQ0NBUkQ6IEZTTUMgQmFuazQgUENDQVJEDQogICogQHBhcmFtICBGU01DX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRlNNQ19GTEFHX1Jpc2luZ0VkZ2U6IFJpc2luZyBlZ2RlIGRldGVjdGlvbiBGbGFnLg0KICAqICAgICBAYXJnIEZTTUNfRkxBR19MZXZlbDogTGV2ZWwgZGV0ZWN0aW9uIEZsYWcuDQogICogICAgIEBhcmcgRlNNQ19GTEFHX0ZhbGxpbmdFZGdlOiBGYWxsaW5nIGVnZGUgZGV0ZWN0aW9uIEZsYWcuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEZTTUNfQ2xlYXJGbGFnKHVpbnQzMl90IEZTTUNfQmFuaywgdWludDMyX3QgRlNNQ19GTEFHKQ0Kew0KIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GU01DX0dFVEZMQUdfQkFOSyhGU01DX0JhbmspKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQ0xFQVJfRkxBRyhGU01DX0ZMQUcpKSA7DQogICAgDQogIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogIHsNCiAgICBGU01DX0JhbmsyLT5TUjIgJj0gfkZTTUNfRkxBRzsgDQogIH0gIA0KICBlbHNlIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmszX05BTkQpDQogIHsNCiAgICBGU01DX0JhbmszLT5TUjMgJj0gfkZTTUNfRkxBRzsNCiAgfQ0KICAvKiBGU01DX0Jhbms0X1BDQ0FSRCovDQogIGVsc2UNCiAgew0KICAgIEZTTUNfQmFuazQtPlNSNCAmPSB+RlNNQ19GTEFHOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGU01DIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KICAqICAgICBAYXJnIEZTTUNfQmFuazNfTkFORDogRlNNQyBCYW5rMyBOQU5EDQogICogICAgIEBhcmcgRlNNQ19CYW5rNF9QQ0NBUkQ6IEZTTUMgQmFuazQgUENDQVJEDQogICogQHBhcmFtICBGU01DX0lUOiBzcGVjaWZpZXMgdGhlIEZTTUMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRlNNQ19JVF9SaXNpbmdFZGdlOiBSaXNpbmcgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0LiANCiAgKiAgICAgQGFyZyBGU01DX0lUX0xldmVsOiBMZXZlbCBlZGdlIGRldGVjdGlvbiBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRlNNQ19JVF9GYWxsaW5nRWRnZTogRmFsbGluZyBlZGdlIGRldGVjdGlvbiBpbnRlcnJ1cHQuIA0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBGU01DX0lUIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KSVRTdGF0dXMgRlNNQ19HZXRJVFN0YXR1cyh1aW50MzJfdCBGU01DX0JhbmssIHVpbnQzMl90IEZTTUNfSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB1aW50MzJfdCB0bXBzciA9IDB4MCwgaXRzdGF0dXMgPSAweDAsIGl0ZW5hYmxlID0gMHgwOyANCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GU01DX0lUX0JBTksoRlNNQ19CYW5rKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0dFVF9JVChGU01DX0lUKSk7DQogIA0KICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KICB7DQogICAgdG1wc3IgPSBGU01DX0JhbmsyLT5TUjI7DQogIH0gIA0KICBlbHNlIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmszX05BTkQpDQogIHsNCiAgICB0bXBzciA9IEZTTUNfQmFuazMtPlNSMzsNCiAgfQ0KICAvKiBGU01DX0Jhbms0X1BDQ0FSRCovDQogIGVsc2UNCiAgew0KICAgIHRtcHNyID0gRlNNQ19CYW5rNC0+U1I0Ow0KICB9IA0KICANCiAgaXRzdGF0dXMgPSB0bXBzciAmIEZTTUNfSVQ7DQogIA0KICBpdGVuYWJsZSA9IHRtcHNyICYgKEZTTUNfSVQgPj4gMyk7DQogIGlmICgoaXRzdGF0dXMgIT0gKHVpbnQzMl90KVJFU0VUKSAgJiYgKGl0ZW5hYmxlICE9ICh1aW50MzJfdClSRVNFVCkpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGJpdHN0YXR1czsgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBGU01DknMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiAgKiBAcGFyYW0gIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBGU01DX0JhbmsyX05BTkQ6IEZTTUMgQmFuazIgTkFORCANCiAgKiAgICAgQGFyZyBGU01DX0JhbmszX05BTkQ6IEZTTUMgQmFuazMgTkFORA0KICAqICAgICBAYXJnIEZTTUNfQmFuazRfUENDQVJEOiBGU01DIEJhbms0IFBDQ0FSRA0KICAqIEBwYXJhbSAgRlNNQ19JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEZTTUNfSVRfUmlzaW5nRWRnZTogUmlzaW5nIGVkZ2UgZGV0ZWN0aW9uIGludGVycnVwdC4gDQogICogICAgIEBhcmcgRlNNQ19JVF9MZXZlbDogTGV2ZWwgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIEZTTUNfSVRfRmFsbGluZ0VkZ2U6IEZhbGxpbmcgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBGU01DX0NsZWFySVRQZW5kaW5nQml0KHVpbnQzMl90IEZTTUNfQmFuaywgdWludDMyX3QgRlNNQ19JVCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSVRfQkFOSyhGU01DX0JhbmspKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSVQoRlNNQ19JVCkpOw0KICAgIA0KICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KICB7DQogICAgRlNNQ19CYW5rMi0+U1IyICY9IH4oRlNNQ19JVCA+PiAzKTsgDQogIH0gIA0KICBlbHNlIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmszX05BTkQpDQogIHsNCiAgICBGU01DX0JhbmszLT5TUjMgJj0gfihGU01DX0lUID4+IDMpOw0KICB9DQogIC8qIEZTTUNfQmFuazRfUENDQVJEKi8NCiAgZWxzZQ0KICB7DQogICAgRlNNQ19CYW5rNC0+U1I0ICY9IH4oRlNNQ19JVCA+PiAzKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLyANCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==