LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X2kyYy5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDAzLzEwLzIwMDYgDQoqIERlc2NyaXB0aW9uICAgICAgICA6IFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIEkyQyBzb2Z0d2FyZSBmdW5jdGlvbnMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBIaXN0b3J5Og0KKiAwNy8xNy8yMDA2IDogVjEuMA0KKiAwMy8xMC8yMDA2IDogVjAuMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULCANCiogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcgRlJPTSBUSEUNCiogQ09OVEVOVCBPRiBTVUNIIFNPRlRXQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRSBDT0RJTkcgDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICI3NXhfaTJjLmgiDQojaW5jbHVkZSAiNzV4X21yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIEkyQyBJVCBlbmFibGUgKi8NCiNkZWZpbmUgIEkyQ19JVF9FbmFibGUgICAgIDB4MDENCiNkZWZpbmUgIEkyQ19JVF9EaXNhYmxlICAgIDB4RkUNCg0KLyogSTJDIFBlcmlwaGVyYWwgRW5hYmxlL0Rpc2FibGUgKi8NCiNkZWZpbmUgIEkyQ19QRV9TZXQgICAgICAgIDB4MjANCiNkZWZpbmUgIEkyQ19QRV9SZXNldCAgICAgIDB4REYNCg0KLyogSTJDIFNUQVJUIEVuYWJsZS9EaXNhYmxlICovDQojZGVmaW5lICBJMkNfU3RhcnRfRW5hYmxlICAgICAgMHgwOA0KI2RlZmluZSAgSTJDX1N0YXJ0X0Rpc2FibGUgICAgIDB4RjcNCg0KLyogSTJDIFNUT1AgRW5hYmxlL0Rpc2FibGUgKi8NCiNkZWZpbmUgIEkyQ19TdG9wX0VuYWJsZSAgICAgICAweDAyDQojZGVmaW5lICBJMkNfU3RvcF9EaXNhYmxlICAgICAgMHhGRA0KDQovKiBBZGRyZXNzIGRpcmVjdGlvbiBiaXQgKi8NCiNkZWZpbmUgSTJDX0FERDBfU2V0ICAgICAgMHgwMQ0KI2RlZmluZSBJMkNfQUREMF9SZXNldCAgICAweEZFDQoNCi8qIEkyQyBNYXNrcyAqLw0KI2RlZmluZSAgSTJDX0ZyZXF1ZW5jeV9NYXNrICAgICAweDFGDQojZGVmaW5lICBJMkNfQWRkcmVzc0hpZ2hfTWFzayAgIDB4RjkNCiNkZWZpbmUgIEkyQ19Pd25BZGRyZXNzX01hc2sgICAgMHgwMzAwICANCiNkZWZpbmUgIEkyQ19TdGFuZGFyZE1vZGVfTWFzayAgMHg3ZiANCiNkZWZpbmUgIEkyQ19GYXN0TW9kZV9NYXNrICAgICAgMHg4MCAgDQojZGVmaW5lICBJMkNfRXZlbnRfTWFzayAgICAgICAgIDB4M0ZGRg0KDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogRGVzY3JpcHRpb24gICAgOiBEZWluaXRpYWxpemVzIHRoZSBJMkMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdA0KKiAgICAgICAgICAgICAgICAgIHJlc2V0IHZhbHVlcy4gICAgICAgICAgICAgICAgIA0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUgICAgICAgICAgICAgICANCiogT3V0cHV0ICAgICAgICAgOiBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIFJldHVybiAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0RlSW5pdCh2b2lkKQ0Kew0KICAvKiBSZXNldCB0aGUgSTJDIHJlZ2lzdGVycyB2YWx1ZXMqLw0KICBNUkNDX1BlcmlwaGVyYWxTV1Jlc2V0Q29uZmlnKE1SQ0NfUGVyaXBoZXJhbF9JMkMsRU5BQkxFKTsNCiAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfSTJDLERJU0FCTEUpOyANCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhbGl6ZXMgdGhlIEkyQyBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgSTJDX0luaXRzdHJ1Y3QuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KKiAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQw0KKiAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuICAgICAgICAgICAgICAgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19Jbml0KEkyQ19Jbml0VHlwZURlZiogSTJDX0luaXRTdHJ1Y3QpDQp7DQogIHU4IElURVN0YXRlID0gMDsNCiAgdTE2IFJlc3VsdCA9IDB4MEY7DQogIHUzMiBBUEJDbG9jayA9IDgwMDAwMDA7DQogIE1SQ0NfQ2xvY2tzVHlwZURlZiAgTVJDQ19DbG9ja3NTdGF0dXM7DQoNCiAgLyogR2V0IEFQQkNsb2NrIGZyZXF1ZW5jeSB2YWx1ZSAqLw0KICBNUkNDX0dldENsb2Nrc1N0YXR1cygmTVJDQ19DbG9ja3NTdGF0dXMpOw0KICBBUEJDbG9jayA9IE1SQ0NfQ2xvY2tzU3RhdHVzLlBDTEtfRnJlcXVlbmN5Ow0KICAvKiBTYXZlIElURSBiaXQgc3RhdGUgKi8NCiAgSVRFU3RhdGUgPSBJMkMtPkNSICYgMHhGRTsNCiAgLyogRGlzYWJsZSBJMkMgcGVyaXBoZXJhbCB0byBzZXQgRlJbMjowXSBiaXRzICovDQogIEkyQ19DbWQoRElTQUJMRSk7DQogIC8qIENsZWFyIGZyZXF1ZW5jeSBGUlsyOjBdIGJpdHMgKi8NCiAgSTJDLT5PQVIyICY9IEkyQ19GcmVxdWVuY3lfTWFzazsNCiAgDQogIC8qIFNldCBmcmVxdWVuY3kgYml0cyBkZXBlbmRpbmcgb24gQVBCQ2xvY2sgdmFsdWUgKi8NCiAgaWYgKEFQQkNsb2NrIDwgMTAwMDAwMDApDQogICAgSTJDLT5PQVIyICY9IDB4MUY7DQogIGVsc2UgaWYgKEFQQkNsb2NrIDwgMTY2NzAwMDApDQogICAgSTJDLT5PQVIyIHw9IDB4MjA7DQogIGVsc2UgaWYgKEFQQkNsb2NrIDwgMjY2NzAwMDApDQogICAgSTJDLT5PQVIyIHw9IDB4NDA7DQogIGVsc2UgaWYgKEFQQkNsb2NrIDwgNDAwMDAwMDApDQogICAgSTJDLT5PQVIyIHw9IDB4NjA7DQogIGVsc2UgaWYgKEFQQkNsb2NrIDwgNTMzMzAwMDApDQogICAgSTJDLT5PQVIyIHw9IDB4ODA7DQogIGVsc2UgaWYgKEFQQkNsb2NrIDwgNjYwMDAwMDApDQogICAgSTJDLT5PQVIyIHw9IDB4QTA7DQogIGVsc2UgaWYgKEFQQkNsb2NrIDwgODAwMDAwMDApDQogICAgSTJDLT5PQVIyIHw9IDB4QzA7DQogIGVsc2UgaWYgKEFQQkNsb2NrIDwgMTAwMDAwMDAwKQ0KICAgIEkyQy0+T0FSMiB8PSAweEUwOw0KICBJMkNfQ21kKEVOQUJMRSk7DQogIA0KICAvKiBSZXN0b3JlIHRoZSBJVEUgYml0IHN0YXRlICovDQogIEkyQy0+Q1IgfD0gSVRFU3RhdGU7DQoNCiAgLyogQ29uZmlndXJlIGdlbmVyYWwgY2FsbCAqLw0KICBpZiAoSTJDX0luaXRTdHJ1Y3QtPkkyQ19HZW5lcmFsQ2FsbCA9PSBJMkNfR2VuZXJhbENhbGxfRW5hYmxlKQ0KICB7DQogICAgLyogRW5hYmxlIGdlbmVyYWwgY2FsbCAqLw0KICAgIEkyQy0+Q1IgfD0gSTJDX0dlbmVyYWxDYWxsX0VuYWJsZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIGdlbmVyYWwgY2FsbCAqLw0KICAgIEkyQy0+Q1IgJj0gSTJDX0dlbmVyYWxDYWxsX0Rpc2FibGU7DQogIH0NCiAgDQogIC8qIENvbmZpZ3VyZSBhY2tub3dsZWRnZW1lbnQgKi8NCiAgaWYgKEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrID09IEkyQ19BY2tfRW5hYmxlKQ0KICB7DQogICAgLyogRW5hYmxlIGFja25vd2xlZGdlbWVudCAqLw0KICAgIEkyQy0+Q1IgfD0gSTJDX0Fja19FbmFibGU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSBhY2tub3dsZWRnZW1lbnQgKi8NCiAgICBJMkMtPkNSICY9IEkyQ19BY2tfRGlzYWJsZTsNCiAgfQ0KICANCiAgLyogQ29uZmlndXJlIExTQiBvd24gYWRkcmVzcyAqLw0KICBJMkMtPk9BUjEgPSBJMkNfSW5pdFN0cnVjdC0+STJDX093bkFkZHJlc3M7DQogIC8qIENsZWFyIE1TQiBvd24gYWRkcmVzcyBBRERbOTo4XSBiaXRzICovDQogIEkyQy0+T0FSMiAmPSBJMkNfQWRkcmVzc0hpZ2hfTWFzazsNCiAgLyogU2V0IE1TQiBvd24gYWRkcmVzcyB2YWx1ZSAqLw0KICBJMkMtPk9BUjIgfD0gKEkyQ19Jbml0U3RydWN0LT5JMkNfT3duQWRkcmVzcyAmIEkyQ19Pd25BZGRyZXNzX01hc2spPj43Ow0KDQogIC8qIENvbmZpZ3VyZSBzcGVlZCBpbiBzdGFuZGFyZCBtb2RlICovDQogIGlmIChJMkNfSW5pdFN0cnVjdC0+STJDX0NMS1NwZWVkIDw9IDEwMDAwMCkNCiAgew0KICAgIC8qIFN0YW5kYXJkIG1vZGUgc3BlZWQgY2FsY3VsYXRlICovDQogICAgUmVzdWx0ID0gKChBUEJDbG9jay9JMkNfSW5pdFN0cnVjdC0+STJDX0NMS1NwZWVkKS03KS8yOw0KICAgIC8qIFNldCBzcGVlZCB2YWx1ZSBhbmQgY2xlYXIgRk0vU00gYml0IGZvciBzdGFuZGFyZCBtb2RlIGluIExTQiBjbG9jayBkaXZpZGVyICovDQogICAgSTJDLT5DQ1IgPSBSZXN1bHQgJiBJMkNfU3RhbmRhcmRNb2RlX01hc2s7DQogIH0NCiAgLyogQ29uZmlndXJlIHNwZWVkIGluIGZhc3QgbW9kZSAqLw0KICBlbHNlIGlmIChJMkNfSW5pdFN0cnVjdC0+STJDX0NMS1NwZWVkIDw9IDQwMDAwMCkNCiAgew0KICAgIC8qIEZhc3QgbW9kZSBzcGVlZCBjYWxjdWxhdGUgKi8NCiAgICBSZXN1bHQgPSAoKEFQQkNsb2NrL0kyQ19Jbml0U3RydWN0LT5JMkNfQ0xLU3BlZWQpLTkpLzM7DQogICAgLyogU2V0IHNwZWVkIHZhbHVlIGFuZCBzZXQgRk0vU00gYml0IGZvciBmYXN0IG1vZGUgaW4gTFNCIGNsb2NrIGRpdmlkZXIgKi8NCiAgICBJMkMtPkNDUiA9IFJlc3VsdCB8IEkyQ19GYXN0TW9kZV9NYXNrOw0KICB9DQogIC8qIFNldCBzcGVlZCBpbiBNU0IgY2xvY2sgZGl2aWRlciAqLw0KICBJMkMtPkVDQ1IgPSBSZXN1bHQgPj43Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19TdHJ1Y3RJbml0ICAgICAgICAgICAgICAgICAgIA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggSTJDX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhbiBJMkNfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQogICAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLiAgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfU3RydWN0SW5pdChJMkNfSW5pdFR5cGVEZWYqIEkyQ19Jbml0U3RydWN0KQ0Kew0KICAvKiBJbml0aWFsaXplIHRoZSBJMkNfQ0xLU3BlZWQgbWVtYmVyICovDQogIEkyQ19Jbml0U3RydWN0LT5JMkNfQ0xLU3BlZWQgPSA1MDAwOw0KICANCiAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX093bkFkZHJlc3MgbWVtYmVyICovDQogIEkyQ19Jbml0U3RydWN0LT5JMkNfT3duQWRkcmVzcyA9IDB4MDsNCiAgDQogIC8qIEluaXRpYWxpemUgdGhlIEkyQ19HZW5lcmFsQ2FsbCBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19HZW5lcmFsQ2FsbCA9IEkyQ19HZW5lcmFsQ2FsbF9EaXNhYmxlOw0KICANCiAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX0FjayBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19BY2sgPSBJMkNfQWNrX0Rpc2FibGU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBJMkMgcGVyaXBoZXJhbC4gICAgICANCiogSW5wdXQgICAgICAgICAgOiAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBwZXJpcGhlcmFsLiBUaGlzIHBhcmFtZXRlcg0KKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lICAgICAgICAgICAgICAgICAgICAgIA0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgaWYgKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgSTJDIHBlcmlwaGVyYWwgYnkgc2V0dGluZyB0d2ljZSB0aGUgUEUgYml0IG9uIHRoZSBDUiByZWdpc3RlciAqLw0KICAgIEkyQy0+Q1IgfD0gSTJDX1BFX1NldDsNCiAgICBJMkMtPkNSIHw9IEkyQ19QRV9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgSTJDIHBlcmlwaGVyYWwgKi8NCiAgICBJMkMtPkNSICY9IEkyQ19QRV9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19HZW5lcmF0ZVNUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIERlc2NyaXB0aW9uICAgIDogR2VuZXJhdGVzIEkyQyBjb21tdW5pY2F0aW9uIFNUQVJUIGNvbmRpdGlvbi4gICAgICAgICAgICAgICANCiogSW5wdXQgICAgICAgICAgOiAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBTVEFSVCBjb25kaXRpb24gZ2VuZXJhdGlvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuICAgICAgICAgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfR2VuZXJhdGVTVEFSVChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmIChOZXdTdGF0ZSA9PSBFTkFCTEUpDQogIHsNCiAgICAvKiBHZW5lcmF0ZSBhIFNUQVJUIGNvbmRpdGlvbiAqLw0KICAgIEkyQy0+Q1IgfD0gSTJDX1N0YXJ0X0VuYWJsZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBTVEFSVCBjb25kaXRpb24gZ2VuZXJhdGlvbiAqLw0KICAgIEkyQy0+Q1IgJj0gSTJDX1N0YXJ0X0Rpc2FibGU7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfR2VuZXJhdGVTVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiBEZXNjcmlwdGlvbiAgICA6IEdlbmVyYXRlcyBJMkMgY29tbXVuaWNhdGlvbiBTVE9QIGNvbmRpdGlvbi4gICAgICAgICAgICAgICAgDQoqIElucHV0ICAgICAgICAgIDogLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkMgU1RPUCBjb25kaXRpb24gZ2VuZXJhdGlvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuICAgICAgIA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUgICAgICAgICAgICAgICAgDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19HZW5lcmF0ZVNUT1AoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBpZiAoTmV3U3RhdGUgPT0gRU5BQkxFKQ0KICB7DQogICAgLyogR2VuZXJhdGUgYSBTSU9QIGNvbmRpdGlvbiAqLw0KICAgIEkyQy0+Q1IgfD0gSTJDX1N0b3BfRW5hYmxlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIFNUT1AgY29uZGl0aW9uIGdlbmVyYXRpb24gKi8NCiAgICBJMkMtPkNSICY9IEkyQ19TdG9wX0Rpc2FibGU7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfQWNrbm93bGVkZ2VDb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgSTJDIGFja25vd2xlZGdlIGZlYXR1cmUuICAgICAgICAgICAgICAgDQoqIElucHV0ICAgICAgICAgIDogLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkMgQWNrbm93bGVkZ2VtZW50LiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuIA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUgICAgICAgICAgICAgICAgICAgICANCiogUmV0dXJuICAgICAgICAgOiBOb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0Fja25vd2xlZGdlQ29uZmlnKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgaWYgKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgYWNrbm93bGVkZ2VtZW50ICovDQogICAgSTJDLT5DUiB8PSBJMkNfQWNrX0VuYWJsZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBhY2tub3dsZWRnZW1lbnQgKi8NCiAgICBJMkMtPkNSICY9IEkyQ19BY2tfRGlzYWJsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19JVENvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgSTJDIGludGVycnVwdC4gICAgICAgICAgICAgICAgIA0KKiBJbnB1dCAgICAgICAgICA6IC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgICAgICAgICANCiogUmV0dXJuICAgICAgICAgOiBOb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0lUQ29uZmlnKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgaWYgKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgSTJDIGludGVycnVwdCAqLw0KICAgIEkyQy0+Q1IgfD0gSTJDX0lUX0VuYWJsZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBJMkMgaW50ZXJydXB0ICovDQogICAgSTJDLT5DUiAmPSBJMkNfSVRfRGlzYWJsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19HZXRMYXN0RXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIERlc2NyaXB0aW9uICAgIDogR2V0cyB0aGUgbGFzdCBJMkMgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQuICAgICAgICAgICAgICAgICAgDQoqIElucHV0ICAgICAgICAgIDogTm9uZSAgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIFJldHVybiAgICAgICAgIDogVGhlIExhc3QgaGFwcGVuZWQgRXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IEkyQ19HZXRMYXN0RXZlbnQodm9pZCkNCnsNCiAgdTE2IEZsYWcxID0gMCwgRmxhZzIgPSAwLCBMYXN0RXZlbnQgPSAwOw0KDQogIEZsYWcxID0gSTJDLT5TUjE7DQogIEZsYWcyID0gSTJDLT5TUjI7DQogIEZsYWcyID0gRmxhZzI8PDg7DQogIC8qIEdldCB0aGUgbGFzdCBldmVudCB2YWx1ZSBmcm9tIEkyQyBzdGF0dXMgcmVnaXN0ZXIgKi8NCiAgTGFzdEV2ZW50ID0gKCgoRmxhZzEgfCAoRmxhZzIpKSAmIEkyQ19FdmVudF9NYXNrKSk7DQogIC8qIFJldHVybiB0aGUgbGFzdCBldmVudCAqLw0KICByZXR1cm4gTGFzdEV2ZW50Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19DaGVja0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgTGFzdCBJMkMgRXZlbnQgaXMgZXF1YWwgdG8gdGhlIG9uZSBwYXNzZWQgDQoqICAgICAgICAgICAgICAgICAgYXMgcGFyYW1ldGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ19FVkVOVDogc3BlY2lmaWVzIHRoZSBldmVudCB0byBiZSBjaGVja2VkLiBUaGlzIHBhcmFtZXRlcg0KKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfU0xBVkVfQUREUkVTU19NQVRDSEVEDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX1NMQVZFX0JZVEVfUkVDRUlWRUQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfU0xBVkVfQllURV9UUkFOU01JVFRFRA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19FVkVOVF9TTEFWRV9BQ0tfRkFJTFVSRSANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfTUFTVEVSX01PREVfU0VMRUNUDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX01BU1RFUl9NT0RFX1NFTEVDVEVEDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX01BU1RFUl9CWVRFX1JFQ0VJVkVEDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX01BU1RFUl9CWVRFX1RSQU5TTUlUVEVEDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX01BU1RFUl9NT0RFX0FERFJFU1MxMA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19FVkVOVF9TTEFWRV9TVE9QX0RFVEVDVEVEDQoqIE91dHB1dCAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIFJldHVybiAgICAgICAgIDogQW4gRXJyb3JTdGF0dXMgZW51bXVyYXRpb24gdmFsdWU6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1VDQ0VTUzogTGFzdCBldmVudCBpcyBlcXVhbCB0byB0aGUgSTJDX0V2ZW50DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gRVJST1I6IExhc3QgZXZlbnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIEkyQ19FdmVudCAgICAgICAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KRXJyb3JTdGF0dXMgSTJDX0NoZWNrRXZlbnQodTE2IEkyQ19FVkVOVCkNCnsNCiAgdTE2ICBMYXN0RXZlbnQgPSBJMkNfR2V0TGFzdEV2ZW50KCk7DQoNCiAgLyogQ2hlY2sgd2hldGhlciB0aGUgbGFzdCBldmVudCBpcyBlcXVhbCB0byBJMkNfRVZFTlQgKi8NCiAgaWYgKExhc3RFdmVudCA9PSBJMkNfRVZFTlQpDQogIHsNCiAgICAvKiBSZXR1cm4gU1VDQ0VTUyB3aGVuIGxhc3QgZXZlbnQgaXMgZXF1YWwgdG8gSTJDX0VWRU5UICovDQogICAgcmV0dXJuIFNVQ0NFU1M7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmV0dXJuIEVSUk9SIHdoZW4gbGFzdCBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSBJMkNfRVZFTlQgKi8NCiAgICByZXR1cm4gRVJST1I7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfU2VuZERhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogRGVzY3JpcHRpb24gICAgOiBTZW5kcyBhIGRhdGEgYnl0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogSW5wdXQgICAgICAgICAgOiAtIERhdGE6IGluZGljYXRlcyB0aGUgYnl0ZSB0byBiZSB0cmFuc21pdHRlZC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lICAgICAgICAgICAgDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfU2VuZERhdGEodTggRGF0YSkNCnsNCiAgLyogV3JpdGUgaW4gdGhlIERSIHJlZ2lzdGVyIHRoZSBieXRlIHRvIGJlIHNlbnQgKi8NCiAgSTJDLT5EUiA9IERhdGE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX1JlY2VpdmVEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIERlc2NyaXB0aW9uICAgIDogUmVhZHMgdGhlIHJlY2VpdmVkIGJ5dGUuIA0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogUmV0dXJuICAgICAgICAgOiBUaGUgcmVjZWl2ZWQgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTggSTJDX1JlY2VpdmVEYXRhKHZvaWQpDQp7DQogIC8qIFJldHVybiBmcm9tIHRoZSBEUiByZWdpc3RlciB0aGUgcmVjZWl2ZWQgYnl0ZSAqLw0KICByZXR1cm4gSTJDLT5EUjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfU2VuZDdiaXRBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIERlc2NyaXB0aW9uICAgIDogVHJhbnNtaXRzIHRoZSBhZGRyZXNzIGJ5dGUgdG8gc2VsZWN0IHRoZSBzbGF2ZSBkZXZpY2UuICAgICAgDQoqIElucHV0ICAgICAgICAgIDogLSBBZGRyZXNzOiBzcGVjaWZpZXMgdGhlIHNsYXZlIGFkZHJlc3Mgd2hpY2ggd2lsbCBiZSB0cmFuc21pdHRlZCAgICANCiogICAgICAgICAgICAgICAgICAtIERpcmVjdGlvbjogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIEkyQyBkZXZpY2Ugd2lsbCBiZSBhIA0KKiAgICAgICAgICAgICAgICAgICAgVHJhbnNtaXR0ZXIgb3IgYSBSZWNlaXZlci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgDQoqICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX01PREVfVFJBTlNNSVRURVI6IFRyYW5zbWl0dGVyIG1vZGUNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfTU9ERV9SRUNFSVZFUjogUmVjZWl2ZXIgbW9kZSAgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQkNCiogUmV0dXJuICAgICAgICAgOiBOb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19TZW5kN2JpdEFkZHJlc3ModTggQWRkcmVzcywgdTggRGlyZWN0aW9uKQ0Kew0KICAvKiBUZXN0IG9uIHRoZSBkaXJlY3Rpb24gdG8gZGVmaW5lIHRoZSByZWFkL3dyaXRlIGJpdCAqLw0KICBpZiAoRGlyZWN0aW9uID09IEkyQ19NT0RFX1JFQ0VJVkVSKQ0KICB7DQogICAgLyogU2V0IHRoZSBhZGRyZXNzIGJpdDAgZm9yIHJlYWQgKi8NCiAgICBBZGRyZXNzIHw9IEkyQ19BREQwX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSZXNldCB0aGUgYWRkcmVzcyBiaXQwIGZvciB3cml0ZSAqLw0KICAgIEFkZHJlc3MgJj0gSTJDX0FERDBfUmVzZXQ7DQogIH0NCiAgLyogU2VuZCB0aGUgYWRkcmVzcyAqLw0KICBJMkMtPkRSID0gQWRkcmVzczsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfUmVhZFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogRGVzY3JpcHRpb24gICAgOiBSZWFkcyB0aGUgc3BlY2lmaWVkIEkyQyByZWdpc3RlciBhbmQgcmV0dXJucyBpdHMgdmFsdWUuICAgIA0KKiBJbnB1dDEgICAgICAgICA6IC0gSTJDX1JlZ2lzdGVyOiBzcGVjaWZpZXMgdGhlIHJlZ2lzdGVyIHRvIHJlYWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgICAgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0NSOiAgIENSIHJlZ2lzdGVyLiANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfU1IxOiAgU1IxIHJlZ2lzdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19TUjI6ICBTUjIgcmVnaXN0ZXIuDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0NDUjogIENDUiByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfT0FSMTogT0FSMSByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfT0FSMjogT0FSMiByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRFI6ICAgRFIgcmVnaXN0ZXIuDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VDQ1I6IEVDQ1IgcmVnaXN0ZXIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSB2YWx1ZSBvZiB0aGUgcmVhZCByZWdpc3Rlci4gICAgICAgICAgICAgIA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnU4IEkyQ19SZWFkUmVnaXN0ZXIodTggSTJDX1JlZ2lzdGVyKQ0Kew0KICAvKiBSZXR1cm4gdGhlIHNlbGVjdGVkIHJlZ2lzdGVyIHZhbHVlICovDQogIHJldHVybiAoKih1OCAqKShJMkNfQkFTRSArIEkyQ19SZWdpc3RlcikpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19HZXRGbGFnU3RhdHVzICANCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnIGlzIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkNfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfU0I6IFN0YXJ0IGJpdCBmbGFnIChNYXN0ZXIgbW9kZSkgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfTV9TTDogTWFzdGVyL1NsYXZlIGZsYWcgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BRFNMOiBBZGRyZXNzIG1hdGNoZWQgZmxhZyAoU2xhdmUgbW9kZSkgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQlRGOiBCeXRlIHRyYW5zZmVyIGZpbmlzaGVkIGZsYWcgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQlVTWTogQnVzIGJ1c3kgZmxhZyAgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19UUkE6IFRyYW5zbWl0dGVyL1JlY2VpdmVyIGZsYWcgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUREMTA6IDEwLWJpdCBhZGRyZXNzaW5nIGluIE1hc3RlciBtb2RlIGZsYWcgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19FVkY6IEV2ZW50IGZsYWcgICAgIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0dDQUw6IEdlbmVyYWwgY2FsbCBmbGFnIChzbGF2ZSBtb2RlKSAgIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0JFUlI6IEJ1cyBlcnJvciBmbGFnICAgIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0FSTE86IEFyYml0cmF0aW9uIGxvc3QgZmxhZyAgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TVE9QRjogU3RvcCBkZXRlY3Rpb24gZmxhZyAoc2xhdmUgbW9kZSkgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BRjogQWNrbm93bGVkZ2UgZmFpbHVyZSBmbGFnICAgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfRU5EQUQ6IEVuZCBvZiBhZGRyZXNzIHRyYW5zbWlzc2lvbiBmbGFnICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUNLOiBBY2tub3dsZWRnZSBlbmFibGUgZmxhZyAgICAgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBOZXdTdGF0ZSBvZiB0aGUgSTJDX0ZMQUcgKFNFVCBvciBSRVNFVCkuICAgICAgICAgICAgICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIEkyQ19HZXRGbGFnU3RhdHVzKHUxNiBJMkNfRkxBRykNCnsgDQogICAgdTE2IEZsYWcxID0gMCwgRmxhZzIgPSAwLCBGbGFnMyA9IDAsIFRtcCA9IDA7DQoNCiAgRmxhZzEgPSBJMkMtPlNSMTsNCiAgRmxhZzIgPSBJMkMtPlNSMjsNCiAgRmxhZzIgPSBGbGFnMjw8ODsNCiAgRmxhZzMgPSBJMkMtPkNSICYgMHgwNDsNCiAgDQogIC8qIEdldCBhbGwgdGhlIEkyQyBmbGFncyBpbiBhIHVuaXF1ZSByZWdpc3RlciovDQogIFRtcCA9ICgoKEZsYWcxIHwgKEZsYWcyKSkgJiBJMkNfRXZlbnRfTWFzaykgfCAoRmxhZzM8PDEyKSk7IA0KICANCiAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnICovDQogIGlmKChUbXAgJiBJMkNfRkxBRykgIT0gUkVTRVQpDQogIHsNCiAgICAvKiBSZXR1cm4gU0VUIGlmIEkyQ19GTEFHIGlzIHNldCAqLw0KICAgIHJldHVybiBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmV0dXJuIFJFU0VUIGlmIEkyQ19GTEFHIGlzIHJlc2V0ICovDQogICAgcmV0dXJuIFJFU0VUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0NsZWFyRmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgSTJDknMgcGVuZGluZyBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TQjogU3RhcnQgYml0IGZsYWcgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfTV9TTDogTWFzdGVyL1NsYXZlIGZsYWcgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BRFNMOiBBZHJlc3MgbWF0Y2hlZCBmbGFnICAgIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0JURjogQnl0ZSB0cmFuc2ZlciBmaW5pc2hlZCBmbGFnICAgIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0JVU1k6IEJ1cyBidXN5IGZsYWcgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfVFJBOiBUcmFuc21pdHRlci9SZWNlaXZlciBmbGFnICAgIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0FERDEwOiAxMC1iaXQgYWRkcmVzc2luZyBpbiBNYXN0ZXIgbW9kZSBmbGFnICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfRVZGOiBFdmVudCBmbGFnICAgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19HQ0FMOiBHZW5lcmFsIGNhbGwgZmxhZyAgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19CRVJSOiBCdXMgZXJyb3IgZmxhZyAgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BUkxPOiBBcmJpdHJhdGlvbiBsb3N0IGZsYWcgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfU1RPUEY6IFN0b3AgZGV0ZWN0aW9uIGZsYWcgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BRjogQWNrbm93bGVkZ2UgZmFpbHVyZSBmbGFnICAgICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfRU5EQUQ6IEVuZCBvZiBhZGRyZXNzIHRyYW5zbWlzc2lvbiBmbGFnICAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUNLOiBBY2tub3dsZWRnZSBlbmFibGUgZmxhZyAgICAgICAgICAgICANCiogICAgICAgICAgICAgICAgICAtIHBhcmFtZXRlciBuZWVkZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgZmxhZyB0byBiZSBjbGVhcmVkDQoqICAgICAgICAgICAgICAgICAgICBuZWVkIGEgd3JpdGUgaW4gb25lIHJlZ2lzdGVyICANCiogT3V0cHV0ICAgICAgICAgOiBOb25lCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19DbGVhckZsYWcodTE2IEkyQ19GTEFHLCAuLi4pDQp7DQogIHU4IFRtcCA9ICh1OCkqKCh1MzIgKikgJiBJMkNfRkxBRyArIHNpemVvZihJMkNfRkxBRykpOw0KDQogIC8qIGZsYWdzIHRoYXQgbmVlZCBhIHJlYWQgb2YgdGhlIFNSMiByZWdpc3RlciB0byBiZSBjbGVhcmVkICovDQogIGlmICgoSTJDX0ZMQUcgPT0gSTJDX0ZMQUdfQUREMTApIHx8IChJMkNfRkxBRyA9PSBJMkNfRkxBR19FVkYpIHx8DQogICAgICAoSTJDX0ZMQUcgPT0gSTJDX0ZMQUdfU1RPUEYpIHx8IChJMkNfRkxBRyA9PSBJMkNfRkxBR19BRikgIHx8IA0KICAgICAgKEkyQ19GTEFHID09IEkyQ19GTEFHX0JFUlIpIHx8ICAoSTJDX0ZMQUcgPT0gSTJDX0ZMQUdfQVJMTykgfHwNCiAgICAgIChJMkNfRkxBRyA9PSBJMkNfRkxBR19FTkRBRCkpDQogIHsNCiAgICAvKiBSZWFkIHRoZSBTUjIgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkMtPlNSMjsNCg0KICAgIC8qIFR3byBmbGFncyBuZWVkIGEgc2Vjb25kIHN0ZXAgdG8gYmUgY2xlYXJlZCAqLw0KICAgIHN3aXRjaCAoSTJDX0ZMQUcpDQogICAgew0KICAgICAgIGNhc2UgIEkyQ19GTEFHX0FERDEwOg0KICAgICAgICAgLyogU2VuZCB0aGUgTVNCIDEwYml0IGFkZHJlc3MgcGFzc2VkIGFzIHNlY29uZCBwYXJhbWV0ZXIgKi8NCiAgICAgICAgIEkyQy0+RFIgPSBUbXA7IA0KICAgICAgICAgYnJlYWs7DQogICAgICAgY2FzZSAgSTJDX0ZMQUdfRU5EQUQ6IA0KICAgICAgICAgLyogV3JpdGUgdG8gdGhlIEkyQ19DUiByZWdpc3RlciBieSBzZXR0aW5nIFBFIGJpdCAqLw0KICAgICAgICAgSTJDLT5DUiB8PSBJMkNfUEVfU2V0Ow0KICAgICAgICAgYnJlYWs7DQogICAgfQ0KICB9DQogIC8qIGZsYWdzIHRoYXQgbmVlZCBhIHJlYWQgb2YgdGhlIFNSMSByZWdpc3RlciB0byBiZSBjbGVhcmVkICovDQogIGVsc2UgaWYgKEkyQ19GTEFHPT1JMkNfRkxBR19TQiB8fCBJMkNfRkxBRz09STJDX0ZMQUdfQURTTCB8fCBJMkNfRkxBRz09STJDX0ZMQUdfQlRGIHx8IEkyQ19GTEFHPT1JMkNfRkxBR19UUkEpDQogIHsNCiAgICAvKiBSZWFkIHRoZSBTUjEgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkMtPlNSMTsNCg0KICAgIC8qIHRocmVlIGZsYWdzIG5lZWQgYSBzZWNvbmQgc3RlcCB0byBiZSBjbGVhcmVkICovDQogICAgaWYgKEkyQ19GTEFHID09IEkyQ19GTEFHX1NCKQ0KICAgIHsNCiAgICAgIC8qIFNlbmQgdGhlIGFkZHJlc3MgYnl0ZSBwYXNzZWQgYXMgc2Vjb25kIHBhcmFtZXRlciAqLw0KICAgICAgSTJDLT5EUj1UbXA7DQogICAgfQ0KICAgIGVsc2UgaWYgKEkyQ19GTEFHPT1JMkNfRkxBR19CVEYgfHwgSTJDX0ZMQUc9PUkyQ19GTEFHX1RSQSkNCiAgICB7DQogICAgICAvKiByZXR1cm4gdGhlIHJlY2VpdmVkIGJ5dGUgaW4gdGhlIHZhcmlhYmxlIHBhc3NlZCBhcyBzZWNvbmQgcGFyYW1ldGVyICAqLw0KICAgICAgVG1wPUkyQy0+RFI7DQogICAgfQ0KICB9DQogIC8qIGZsYWdzIHRoYXQgbmVlZCB0byBkaXNhYmxlIHRoZSBJMkMgaW50ZXJmYWNlICovDQogIGVsc2UgaWYgKCBJMkNfRkxBRz09STJDX0ZMQUdfTV9TTCB8fCBJMkNfRkxBRz09STJDX0ZMQUdfR0NBTCkNCiAgew0KICAgIEkyQ19DbWQoRElTQUJMRSk7DQogICAgSTJDX0NtZChFTkFCTEUpOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=