LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X3J0Yy5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDAzLzEwLzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgUlRDIHNvZnR3YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA3LzE3LzIwMDYgOiBWMS4wDQoqIDAzLzEwLzIwMDYgOiBWMC4xDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBTT0ZUV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBTT0ZUV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICI3NXhfcnRjLmgiDQojaW5jbHVkZSAiNzV4X21yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojZGVmaW5lIFJUQ19DTkZfRW5hYmxlX01hc2sgICAgICAweDAwMTAgICAgICAvKiBDb25maWd1cmF0aW9uIEZsYWcgRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgUlRDX0NORl9EaXNhYmxlX01hc2sgICAgIDB4RkZFRiAgICAgIC8qIENvbmZpZ3VyYXRpb24gRmxhZyBEaXNhYmxlIE1hc2sgKi8NCiNkZWZpbmUgUlRDX0xTQl9NYXNrICAgICAgICAgICAgIDB4MDAwMEZGRkYgIC8qIFJUQyBMU0IgTWFzayAqLw0KI2RlZmluZSBSVENfTVNCX01hc2sgICAgICAgICAgICAgMHhGRkZGMDAwMCAgLyogUlRDIE1TQiBNYXNrICovDQojZGVmaW5lIFJUQ19QcmVzY2FsZXJfTVNCX01hc2sgICAweDAwMEYwMDAwICAvKiBSVEMgUHJlc2NhbGVyIE1TQiBNYXNrICovDQoNCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFJUQ19EZUluaXQNCiogRGVzY3JpcHRpb24gICAgOiBEZWluaXRpYWxpemVzIHRoZSBSVEMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXINCiogICAgICAgICAgICAgICAgICBkZWZhdWx0IHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19EZUluaXQodm9pZCkNCnsNCiAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfUlRDLEVOQUJMRSk7DQogIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1JUQyxESVNBQkxFKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBSVENfSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgUlRDIGludGVycnVwdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBSVENfSVQ6IHNwZWNpZmllcyB0aGUgUlRDIGludGVycnVwdHMgc291cmNlcyB0byBiZSBlbmFibGVkDQoqICAgICAgICAgICAgICAgICAgICBvciBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZQ0KKiAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX092ZXJmbG93OiBPdmVyZmxvdyBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX0FsYXJtOiBBbGFybSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX1NlY29uZDogU2Vjb25kIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgUlRDIGludGVycnVwdHMuDQoqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19JVENvbmZpZyh1MTYgUlRDX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFJUQy0+Q1JIIHw9IFJUQ19JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSVEMtPkNSSCAmPSB+UlRDX0lUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0VudGVyQ29uZmlnTW9kZQ0KKiBEZXNjcmlwdGlvbiAgICA6IEVudGVycyB0aGUgUlRDIGNvbmZpZ3VyYXRpb24gbW9kZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19FbnRlckNvbmZpZ01vZGUodm9pZCkNCnsNCiAgLyogU2V0IHRoZSBDTkYgZmxhZyB0byBlbnRlciBpbiB0aGUgQ29uZmlndXJhdGlvbiBNb2RlICovDQogIFJUQy0+Q1JMIHw9IFJUQ19DTkZfRW5hYmxlX01hc2s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0V4aXRDb25maWdNb2RlDQoqIERlc2NyaXB0aW9uICAgIDogRXhpdHMgZnJvbSB0aGUgUlRDIGNvbmZpZ3VyYXRpb24gbW9kZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19FeGl0Q29uZmlnTW9kZSh2b2lkKQ0Kew0KICAvKiBSZXNldCB0aGUgQ05GIGZsYWcgdG8gZXhpdCBmcm9tIHRoZSBDb25maWd1cmF0aW9uIE1vZGUgKi8NCiAgUlRDLT5DUkwgJj0gUlRDX0NORl9EaXNhYmxlX01hc2s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0dldENvdW50ZXINCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBSVEMgY291bnRlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFJUQyBjb3VudGVyIHZhbHVlLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBSVENfR2V0Q291bnRlcih2b2lkKQ0Kew0KICB1MTYgVG1wID0gMDsNCiAgVG1wID0gUlRDLT5DTlRMOw0KICANCiAgcmV0dXJuICgoKHUzMilSVEMtPkNOVEggPDwgMTYgKSB8VG1wKSA7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX1NldENvdW50ZXINCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBSVEMgY291bnRlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBSVEMgY291bnRlciBuZXcgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19TZXRDb3VudGVyKHUzMiBDb3VudGVyVmFsdWUpDQp7DQogIFJUQ19FbnRlckNvbmZpZ01vZGUoKTsNCiAgDQovKiBDT1VOVEVSIENvbmZpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBTZXQgUlRDIENPVU5URVIgTVNCIHdvcmQgKi8NCiAgUlRDLT5DTlRIID0oQ291bnRlclZhbHVlICYgUlRDX01TQl9NYXNrKSA+PiAxNjsNCiAgLyogU2V0IFJUQyBDT1VOVEVSIExTQiB3b3JkICovDQogIFJUQy0+Q05UTCA9KENvdW50ZXJWYWx1ZSAmIFJUQ19MU0JfTWFzayk7DQogIA0KICBSVENfRXhpdENvbmZpZ01vZGUoKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBSVENfU2V0UHJlc2NhbGVyDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgUlRDIHByZXNjYWxlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBSVEMgcHJlc2NhbGVyIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUlRDX1NldFByZXNjYWxlcih1MzIgUHJlc2NhbGVyVmFsdWUpDQp7DQogIFJUQ19FbnRlckNvbmZpZ01vZGUoKTsNCiAgDQovKiBQUkVTQ0FMRVIgQ29uZmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBTZXQgUlRDIFBSRVNDQUxFUiBNU0Igd29yZCAqLw0KICBSVEMtPlBSTEggPSAoUHJlc2NhbGVyVmFsdWUgJiBSVENfUHJlc2NhbGVyX01TQl9NYXNrKSA+PiAxNjsNCiAgLyogU2V0IFJUQyBQUkVTQ0FMRVIgTFNCIHdvcmQgKi8NCiAgUlRDLT5QUkxMID0gKFByZXNjYWxlclZhbHVlICYgUlRDX0xTQl9NYXNrKTsNCiAgDQogIFJUQ19FeGl0Q29uZmlnTW9kZSgpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFJUQ19HZXRQcmVzY2FsZXINCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBSVEMgcHJlc2NhbGVyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogUlRDIHByZXNjYWxlciB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MzIgUlRDX0dldFByZXNjYWxlcih2b2lkKQ0Kew0KICB1MTYgVG1wID0gMDsNCiAgVG1wID0gUlRDLT5QUkxMOw0KICANCiAgcmV0dXJuICgoKHUzMikoUlRDLT5QUkxIICYgMHgwMDBGKSA8PCAxNiApIHwgVG1wKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBSVENfU2V0QWxhcm0NCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBSVEMgYWxhcm0gdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogUlRDIGFsYXJtIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUlRDX1NldEFsYXJtKHUzMiBBbGFybVZhbHVlKQ0Kew0KICBSVENfRW50ZXJDb25maWdNb2RlKCk7DQogIA0KLyogQUxBUk0gQ29uZmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogU2V0IHRoZSBBTEFSTSBNU0Igd29yZCAqLw0KICBSVEMtPkFMUkggPSAoQWxhcm1WYWx1ZSAmIFJUQ19NU0JfTWFzaykgPj4gMTY7DQogIC8qIFNldCB0aGUgQUxBUk0gTFNCIHdvcmQgKi8NCiAgUlRDLT5BTFJMID0gKEFsYXJtVmFsdWUgJiBSVENfTFNCX01hc2spOw0KICANCiAgUlRDX0V4aXRDb25maWdNb2RlKCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0dldERpdmlkZXINCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBSVEMgZGl2aWRlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFJUQyBEaXZpZGVyIHZhbHVlLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBSVENfR2V0RGl2aWRlcih2b2lkKQ0Kew0KICB1MTYgVG1wID0gMDsNCiAgVG1wID0gUlRDLT5ESVZMIDsNCiAgcmV0dXJuICgoKHUzMikoUlRDLT5ESVZIICYgMHgwMDBGKSA8PCAxNiApIHwgVG1wKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBSVENfV2FpdEZvckxhc3RUYXNrDQoqIERlc2NyaXB0aW9uICAgIDogV2FpdHMgdW50aWwgbGFzdCB3cml0ZSBvcGVyYXRpb24gb24gUlRDIHJlZ2lzdGVycyBoYXMgZmluaXNoZWQuDQoqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHdyaXRlIHRvIFJUQyByZWdpc3RlcnMuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBSVENfV2FpdEZvckxhc3RUYXNrKHZvaWQpDQp7DQogIC8qIExvb3AgdW50aWwgUlRPRkYgZmxhZyBpcyBzZXQgKi8NCiAgd2hpbGUgKChSVEMtPkNSTCAmIFJUQ19GTEFHX1JUT0ZGKSA9PSBSRVNFVCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX1dhaXRGb3JTeW5jaHJvDQoqIERlc2NyaXB0aW9uICAgIDogV2FpdHMgdW50aWwgdGhlIFJUQyByZWdpc3RlcnMgKFJUQ19DTlQsIFJUQ19BTFIgYW5kIFJUQ19QUkwpIA0KKiAgICAgICAgICAgICAgICAgIGFyZSBzeW5jaHJvbml6ZWQgd2l0aCBSVEMgQVBCIGNsb2NrLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSByZWFkIG9wZXJhdGlvbiBhZnRlciANCiogICAgICAgICAgICAgICAgICBhbiBBUEIgcmVzZXQgb3IgYW4gQVBCIGNsb2NrIHN0b3AuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBSVENfV2FpdEZvclN5bmNocm8odm9pZCkNCnsNCiAgLyogQ2xlYXIgUlNGIGZsYWcgKi8NCiAgUlRDLT5DUkwgJj0gflJUQ19GTEFHX1JTRjsNCiAgDQogIC8qIExvb3AgdW50aWwgUlNGIGZsYWcgaXMgc2V0ICovDQogIHdoaWxlKChSVEMtPkNSTCAmIFJUQ19GTEFHX1JTRik9PSBSRVNFVCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0dldEZsYWdTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBmbGFnIGlzIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogUlRDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0ZMQUdfUlRPRkY6IFJUQyBPcGVyYXRpb24gT0ZGIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19GTEFHX1JTRjogUmVnaXN0ZXJzIFN5bmNocm9uaXplZCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgLSBSVENfRkxBR19PdmVyZmxvdzogT3ZlcmZsb3cgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19GTEFHX0FsYXJtOiBBbGFybSBpbnRlcnJ1cHQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0ZMQUdfU2Vjb25kOiBTZWNvbmQgaW50ZXJydXB0IGZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBSVENfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIFJUQ19HZXRGbGFnU3RhdHVzKHUxNiBSVENfRkxBRykNCnsNCiAgaWYoKFJUQy0+Q1JMICYgUlRDX0ZMQUcpICE9IFJFU0VUKQ0KICB7DQogICAgcmV0dXJuIFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICByZXR1cm4gUkVTRVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBSVENfQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBSVEOScyBwZW5kaW5nIGZsYWdzLg0KKiBJbnB1dCAgICAgICAgICA6IFJUQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBvbmUgb3IgbW9yZSBvZg0KKiAgICAgICAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgLSBSVENfRkxBR19SU0Y6IFJlZ2lzdGVycyBTeW5jaHJvbml6ZWQgZmxhZy4gVGhpcyBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBjbGVhcmVkIG9ubHkgYWZ0ZXIgYW4gQVBCIHJlc2V0IG9yIGFuIEFQQiBDbG9jayBzdG9wLg0KKiAgICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0ZMQUdfT3ZlcmZsb3c6IE92ZXJmbG93IGludGVycnVwdCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgLSBSVENfRkxBR19BbGFybTogQWxhcm0gaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19GTEFHX1NlY29uZDogU2Vjb25kIGludGVycnVwdCBmbGFnDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19DbGVhckZsYWcodTE2IFJUQ19GTEFHKQ0Kew0KICAvKiBDbGVhciB0aGUgY29yZXNzcG9uZGluZyBSVEMgZmxhZyAqLw0KICBSVEMtPkNSTCAmPSB+UlRDX0ZMQUc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0dldElUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgaW50ZXJydXB0IGhhcyBvY2N1cmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiBSVENfSVQ6IHNwZWNpZmllcyB0aGUgUlRDIGludGVycnVwdHMgc291cmNlcyB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2Ygb25lIG9yIG1vcmUgb2YNCiogICAgICAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19JVF9PdmVyZmxvdzogT3ZlcmZsb3cgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19JVF9BbGFybTogQWxhcm0gaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19JVF9TZWNvbmQ6IFNlY29uZCBpbnRlcnJ1cHQNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiB0aGUgUlRDX0lUIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIFJUQ19HZXRJVFN0YXR1cyh1MTYgUlRDX0lUKQ0Kew0KICBpZigoKFJUQy0+Q1JIICYgUlRDX0lUKSAhPSBSRVNFVCkmJiAoKFJUQy0+Q1JMICYgUlRDX0lUKSAhPSBSRVNFVCkpDQogIHsNCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFJUQ19DbGVhcklUUGVuZGluZ0JpdA0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgUlRDknMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiogSW5wdXQgICAgICAgICAgOiBSVENfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLiANCiogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBvbmUgb3IgbW9yZSBvZg0KKiAgICAgICAgICAgICAgICAgICB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX092ZXJmbG93OiBPdmVyZmxvdyBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX0FsYXJtOiBBbGFybSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX1NlY29uZDogU2Vjb25kIGludGVycnVwdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBSVENfQ2xlYXJJVFBlbmRpbmdCaXQodTE2IFJUQ19JVCkNCnsNCiAgLyogQ2xlYXIgdGhlIGNvcmVzc3BvbmRpbmcgUlRDIHBlbmRpbmcgYml0ICovDQogIFJUQy0+Q1JMICY9IH5SVENfSVQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=