LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8YW5kcmVhcy50cmFjenlrQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2luY2x1ZGUgInBjaC5oIg0KDQojaW5jbHVkZSAiVmlkZW9QYWdlLnhhbWwuaCINCg0KI2luY2x1ZGUgPE1lbW9yeUJ1ZmZlci5oPiAgIC8vIElNZW1vcnlCdWZmZXJCeXRlQWNjZXNzDQoNCnVzaW5nIG5hbWVzcGFjZSBSaW5nQ2xpZW50VVdQOjpWaWV3czsNCnVzaW5nIG5hbWVzcGFjZSBWaWV3TW9kZWw7DQp1c2luZyBuYW1lc3BhY2UgVmlkZW87DQoNCnVzaW5nIG5hbWVzcGFjZSBDb25jdXJyZW5jeTsNCnVzaW5nIG5hbWVzcGFjZSBQbGF0Zm9ybTsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpEZXZpY2VzOjpFbnVtZXJhdGlvbjsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpGb3VuZGF0aW9uOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OkZvdW5kYXRpb246OkNvbGxlY3Rpb25zOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpYYW1sOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpYYW1sOjpDb250cm9sczsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDo6Q29udHJvbHM6OlByaW1pdGl2ZXM7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6VUk6OlhhbWw6OkRhdGE7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6VUk6OlhhbWw6OklucHV0Ow0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpYYW1sOjpNZWRpYTsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDo6TmF2aWdhdGlvbjsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpNZWRpYTo6Q2FwdHVyZTsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpBcHBsaWNhdGlvbk1vZGVsOjpDb3JlOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpDb3JlOw0KDQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6R3JhcGhpY3M6OkRpc3BsYXk7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6R3JhcGhpY3M6OkltYWdpbmc7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6TWVkaWE7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6VUk6OlhhbWw6Ok1lZGlhOjpJbWFnaW5nOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6Ok1lZGlhOjpDYXB0dXJlOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OkRldmljZXM6OlNlbnNvcnM7DQoNClZpZGVvUGFnZTo6VmlkZW9QYWdlKCkNCnsNCiAgICBJbml0aWFsaXplQ29tcG9uZW50KCk7DQoNCiAgICBWaWRlb01hbmFnZXI6Omluc3RhbmNlLT5jYXB0dXJlTWFuYWdlcigpLT5kaXNwbGF5SW5mb3JtYXRpb24gPSBEaXNwbGF5SW5mb3JtYXRpb246OkdldEZvckN1cnJlbnRWaWV3KCk7DQogICAgVmlkZW9NYW5hZ2VyOjppbnN0YW5jZS0+Y2FwdHVyZU1hbmFnZXIoKS0+RW51bWVyYXRlV2ViY2Ftc0FzeW5jKCk7DQoNCiAgICBQYWdlOjpOYXZpZ2F0aW9uQ2FjaGVNb2RlID0gTmF2aWdhdGlvbjo6TmF2aWdhdGlvbkNhY2hlTW9kZTo6UmVxdWlyZWQ7DQoNCiAgICBWaWRlb01hbmFnZXI6Omluc3RhbmNlLT5yZW5kZXJlck1hbmFnZXIoKS0+d3JpdGVWaWRlb0ZyYW1lICs9DQogICAgICAgIHJlZiBuZXcgV3JpdGVWaWRlb0ZyYW1lKFt0aGlzXShTdHJpbmdeIGlkLCB1aW50OF90KiBidWYsIGludCB3aWR0aCwgaW50IGhlaWdodCkNCiAgICB7DQogICAgICAgIENvcmVBcHBsaWNhdGlvbjo6TWFpblZpZXctPkNvcmVXaW5kb3ctPkRpc3BhdGNoZXItPlJ1bkFzeW5jKENvcmVEaXNwYXRjaGVyUHJpb3JpdHk6OkhpZ2gsDQogICAgICAgIHJlZiBuZXcgRGlzcGF0Y2hlZEhhbmRsZXIoWz1dKCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBpZiAoIVZpZGVvTWFuYWdlcjo6aW5zdGFuY2UtPnJlbmRlcmVyTWFuYWdlcigpLT5yZW5kZXJlcnMtPlNpemUpDQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICBWaWRlb01hbmFnZXI6Omluc3RhbmNlLT5yZW5kZXJlck1hbmFnZXIoKS0+cmVuZGVyZXIoaWQpLT5pc1JlbmRlcmluZyA9IHRydWU7DQogICAgICAgICAgICAgICAgY3JlYXRlX3Rhc2soV3JpdGVGcmFtZUFzU29mdHdhcmVCaXRtYXBBc3luYyhpZCwgYnVmLCB3aWR0aCwgaGVpZ2h0KSkNCiAgICAgICAgICAgICAgICAudGhlbihbPV0odGFzazx2b2lkPiBwcmV2aW91c1Rhc2spIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVGFzay5nZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoUGxhdGZvcm06OkV4Y2VwdGlvbl4gZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVMaW5lKCAiQ2F1Z2h0IGV4Y2VwdGlvbiBmcm9tIHByZXZpb3VzIHRhc2suXG4iICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoKFBsYXRmb3JtOjpDT01FeGNlcHRpb25eIGUpIHsNCiAgICAgICAgICAgICAgICBXcml0ZUxpbmUoZS0+VG9TdHJpbmcoKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pKTsNCiAgICB9KTsNCg0KICAgIFZpZGVvTWFuYWdlcjo6aW5zdGFuY2UtPmNhcHR1cmVNYW5hZ2VyKCktPnN0YXJ0UHJldmlld2luZyArPQ0KICAgICAgICByZWYgbmV3IFN0YXJ0UHJldmlld2luZyhbdGhpc10oKQ0KICAgIHsNCiAgICAgICAgUHJldmlld0ltYWdlLT5WaXNpYmlsaXR5ID0gV2luZG93czo6VUk6OlhhbWw6OlZpc2liaWxpdHk6OlZpc2libGU7DQogICAgICAgIFByZXZpZXdJbWFnZS0+Rmxvd0RpcmVjdGlvbiA9IFZpZGVvTWFuYWdlcjo6aW5zdGFuY2UtPmNhcHR1cmVNYW5hZ2VyKCktPm1pcnJvcmluZ1ByZXZpZXcgPw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dzOjpVSTo6WGFtbDo6Rmxvd0RpcmVjdGlvbjo6UmlnaHRUb0xlZnQgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dzOjpVSTo6WGFtbDo6Rmxvd0RpcmVjdGlvbjo6TGVmdFRvUmlnaHQ7DQogICAgfSk7DQoNCiAgICBWaWRlb01hbmFnZXI6Omluc3RhbmNlLT5jYXB0dXJlTWFuYWdlcigpLT5zdG9wUHJldmlld2luZyArPQ0KICAgICAgICByZWYgbmV3IFN0b3BQcmV2aWV3aW5nKFt0aGlzXSgpDQogICAgew0KICAgICAgICBQcmV2aWV3SW1hZ2UtPlNvdXJjZSA9IG51bGxwdHI7DQogICAgICAgIFByZXZpZXdJbWFnZS0+VmlzaWJpbGl0eSA9IFdpbmRvd3M6OlVJOjpYYW1sOjpWaXNpYmlsaXR5OjpDb2xsYXBzZWQ7DQogICAgfSk7DQoNCiAgICBWaWRlb01hbmFnZXI6Omluc3RhbmNlLT5jYXB0dXJlTWFuYWdlcigpLT5nZXRTaW5rICs9DQogICAgICAgIHJlZiBuZXcgR2V0U2luayhbdGhpc10oKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIFByZXZpZXdJbWFnZTsNCiAgICB9KTsNCg0KICAgIFZpZGVvTWFuYWdlcjo6aW5zdGFuY2UtPnJlbmRlcmVyTWFuYWdlcigpLT5jbGVhclJlbmRlclRhcmdldCArPQ0KICAgICAgICByZWYgbmV3IENsZWFyUmVuZGVyVGFyZ2V0KFt0aGlzXSgpDQogICAgew0KICAgICAgICBJbmNvbWluZ1ZpZGVvSW1hZ2UtPlNvdXJjZSA9IG51bGxwdHI7DQogICAgfSk7DQoNCiAgICBSaW5nRDo6aW5zdGFuY2UtPmluY29taW5nQWNjb3VudE1lc3NhZ2UgKz0NCiAgICAgICAgcmVmIG5ldyBJbmNvbWluZ0FjY291bnRNZXNzYWdlKFsmXShTdHJpbmdeIGFjY291bnRJZCwgU3RyaW5nXiBmcm9tLCBTdHJpbmdeIHBheWxvYWQpDQogICAgew0KICAgICAgICBzY3JvbGxEb3duKCk7DQogICAgfSk7DQoNCiAgICBSaW5nRDo6aW5zdGFuY2UtPnN0YXRlQ2hhbmdlICs9DQogICAgICAgIHJlZiBuZXcgU3RhdGVDaGFuZ2UoWyZdKFN0cmluZ14gY2FsbElkLCBDYWxsU3RhdHVzIHN0YXRlLCBpbnQgY29kZSkNCiAgICB7DQogICAgICAgIGlmIChzdGF0ZSA9PSBDYWxsU3RhdHVzOjpFTkRFRCkgew0KICAgICAgICAgICAgVmlkZW86OlZpZGVvTWFuYWdlcjo6aW5zdGFuY2UtPnJlbmRlcmVyTWFuYWdlcigpLT5yYWlzZUNsZWFyUmVuZGVyVGFyZ2V0KCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIFJpbmdEOjppbnN0YW5jZS0+aW5jb21pbmdBY2NvdW50TWVzc2FnZSArPSByZWYgbmV3IEluY29taW5nQWNjb3VudE1lc3NhZ2UoWyZdKFN0cmluZ14gYWNjb3VudElkLA0KICAgIFN0cmluZ14gZnJvbSwgU3RyaW5nXiBwYXlsb2FkKSB7DQogICAgICAgIHNjcm9sbERvd24oKTsNCiAgICB9KTsNCn0NCg0Kdm9pZA0KUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6T25OYXZpZ2F0ZWRUbyhXaW5kb3dzOjpVSTo6WGFtbDo6TmF2aWdhdGlvbjo6TmF2aWdhdGlvbkV2ZW50QXJnc14gZSkNCnsNCiAgICB1cGRhdGVQYWdlQ29udGVudCgpOw0KfQ0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6OnVwZGF0ZVBhZ2VDb250ZW50KCkNCnsNCiAgICBhdXRvIGl0ZW0gPSBTbWFydFBhbmVsSXRlbXNWaWV3TW9kZWw6Omluc3RhbmNlLT5fc2VsZWN0ZWRJdGVtOw0KICAgIGF1dG8gY29udGFjdCA9IChpdGVtKSA/IGl0ZW0tPl9jb250YWN0IDogbnVsbHB0cjsNCg0KICAgIGlmICghY29udGFjdCkNCiAgICAgICAgcmV0dXJuOw0KDQogICAgX2NhbGxlZV8tPlRleHQgPSBjb250YWN0LT5uYW1lXzsNCg0KICAgIF9tZXNzYWdlc0xpc3RfLT5JdGVtc1NvdXJjZSA9IGNvbnRhY3QtPl9jb252ZXJzYXRpb24tPl9tZXNzYWdlczsNCg0KICAgIHNjcm9sbERvd24oKTsNCn0NCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpzY3JvbGxEb3duKCkNCnsNCiAgICBfc2Nyb2xsVmlld18tPlVwZGF0ZUxheW91dCgpOw0KICAgIF9zY3JvbGxWaWV3Xy0+U2Nyb2xsVG9WZXJ0aWNhbE9mZnNldChfc2Nyb2xsVmlld18tPlNjcm9sbGFibGVIZWlnaHQpOw0KfQ0KDQp2b2lkDQpSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfc2VuZEJ0bl9fQ2xpY2soUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6Um91dGVkRXZlbnRBcmdzXiBlKQ0Kew0KICAgIHNlbmRNZXNzYWdlKCk7DQp9DQoNCnZvaWQNClJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol9tZXNzYWdlVGV4dEJveF9fS2V5RG93bihQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6S2V5Um91dGVkRXZlbnRBcmdzXiBlKQ0Kew0KICAgIGlmIChlLT5LZXkgPT0gV2luZG93czo6U3lzdGVtOjpWaXJ0dWFsS2V5OjpFbnRlcikgew0KICAgICAgICBzZW5kTWVzc2FnZSgpOw0KICAgIH0NCn0NCg0Kdm9pZA0KUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6c2VuZE1lc3NhZ2UoKQ0Kew0KICAgIGF1dG8gaXRlbSA9IFNtYXJ0UGFuZWxJdGVtc1ZpZXdNb2RlbDo6aW5zdGFuY2UtPl9zZWxlY3RlZEl0ZW07DQogICAgYXV0byBjb250YWN0ID0gaXRlbS0+X2NvbnRhY3Q7DQoNCiAgICBhdXRvIHR4dCA9IF9tZXNzYWdlVGV4dEJveF8tPlRleHQ7DQoNCiAgICAvKiBlbXB0eSB0aGUgdGV4dGJveCAqLw0KICAgIF9tZXNzYWdlVGV4dEJveF8tPlRleHQgPSAiIjsNCg0KICAgIGlmICghY29udGFjdCB8fCB0eHQtPklzRW1wdHkoKSkNCiAgICAgICAgcmV0dXJuOw0KDQogICAgUmluZ0Q6Omluc3RhbmNlLT5zZW5kQWNjb3VudFRleHRNZXNzYWdlKHR4dCk7DQogICAgc2Nyb2xsRG93bigpOw0KfQ0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6OkJ1dHRvbl9DbGljayhQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfYnRuQ2FuY2VsX19DbGljayhQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQoNCn0NCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfYnRuSGFuZ1VwX19UYXBwZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICBhdXRvIGl0ZW0gPSBTbWFydFBhbmVsSXRlbXNWaWV3TW9kZWw6Omluc3RhbmNlLT5fc2VsZWN0ZWRJdGVtOw0KICAgIFJpbmdEOjppbnN0YW5jZS0+aGFuZ1VwQ2FsbDIoaXRlbS0+X2NhbGxJZCk7DQoNCiAgICBwcmVzc0hhbmdVcENhbGwoKTsNCn0NCg0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol9idG5QYXVzZV9fVGFwcGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQogICAgcGF1c2VDYWxsKCk7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfYnRuQ2hhdF9fVGFwcGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQogICAgY2hhdE9wZW4gPSAhY2hhdE9wZW47DQogICAgaWYgKGNoYXRPcGVuKSB7DQogICAgICAgIF9yb3dDaGF0QnhfLT5IZWlnaHQgPSAyMDA7DQogICAgICAgIGNoYXRQYW5lbENhbGwoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIF9yb3dDaGF0QnhfLT5IZWlnaHQgPSAwOw0KICAgIH0NCn0NCg0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol9idG5BZGRGcmllbmRfX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKQ0Kew0KICAgIGFkZENvbnRhY3RDYWxsKCk7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfYnRuU3dpdGNoX19UYXBwZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICB0cmFuc2ZlckNhbGwoKTsNCn0NCg0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol9idG5NaWNyb3Bob25lX19UYXBwZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICBzd2l0Y2hNaWNyb3Bob25lU3RhdGVDYWxsKCk7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfYnRuTWVtb19fVGFwcGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQogICAgcmVjY29yZFZpZGVvQ2FsbCgpOw0KfQ0KDQoNCnZvaWQgUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6X2J0bkhRX19UYXBwZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICBxdWFsaXR5VmlkZW9MZXZlbENhbGwoKTsNCn0NCg0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol9idG5WaWRlb19fVGFwcGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQogICAgc3dpdGNoVmlkZW9TdGF0ZUNhbGwoKTsNCn0NCg0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol92aWRlb0NvbnRyb2xfX1BvaW50ZXJNb3ZlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6UG9pbnRlclJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICBpZiAoYmFyRmFkaW5nKQ0KICAgICAgICBteVN0b3J5Ym9hcmQtPkJlZ2luKCk7DQogICAgYmFyRmFkaW5nXyA9IHRydWU7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpidG5BbnlfZW50ZXJlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6UG9pbnRlclJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICBiYXJGYWRpbmdfID0gZmFsc2U7DQogICAgbXlTdG9yeWJvYXJkLT5TdG9wKCk7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpidG5BbnlfZXhpdGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpQb2ludGVyUm91dGVkRXZlbnRBcmdzXiBlKQ0Kew0KICAgIGJhckZhZGluZ18gPSB0cnVlOw0KfQ0KDQp0YXNrPHZvaWQ+DQpWaWRlb1BhZ2U6OldyaXRlRnJhbWVBc1NvZnR3YXJlQml0bWFwQXN5bmMoU3RyaW5nXiBpZCwgdWludDhfdCogYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpDQp7DQogICAgYXV0byB2ZnJhbWUgPSByZWYgbmV3IFZpZGVvRnJhbWUoQml0bWFwUGl4ZWxGb3JtYXQ6OkJncmE4LCB3aWR0aCwgaGVpZ2h0KTsNCiAgICBhdXRvIGZyYW1lID0gdmZyYW1lLT5Tb2Z0d2FyZUJpdG1hcDsNCg0KICAgIGNvbnN0IGludCBCWVRFU19QRVJfUElYRUwgPSA0Ow0KDQogICAgQml0bWFwQnVmZmVyXiBidWZmZXIgPSBmcmFtZS0+TG9ja0J1ZmZlcihCaXRtYXBCdWZmZXJBY2Nlc3NNb2RlOjpSZWFkV3JpdGUpOw0KICAgIElNZW1vcnlCdWZmZXJSZWZlcmVuY2VeIHJlZmVyZW5jZSA9IGJ1ZmZlci0+Q3JlYXRlUmVmZXJlbmNlKCk7DQoNCiAgICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNZW1vcnlCdWZmZXJCeXRlQWNjZXNzPiBieXRlQWNjZXNzOw0KICAgIGlmIChTVUNDRUVERUQocmVpbnRlcnByZXRfY2FzdDxJVW5rbm93bio+KHJlZmVyZW5jZSktPlF1ZXJ5SW50ZXJmYWNlKElJRF9QUFZfQVJHUygmYnl0ZUFjY2VzcykpKSkNCiAgICB7DQogICAgICAgIGJ5dGUqIGRhdGE7DQogICAgICAgIHVuc2lnbmVkIGNhcGFjaXR5Ow0KICAgICAgICBieXRlQWNjZXNzLT5HZXRCdWZmZXIoJmRhdGEsICZjYXBhY2l0eSk7DQoNCiAgICAgICAgYXV0byBkZXNjID0gYnVmZmVyLT5HZXRQbGFuZURlc2NyaXB0aW9uKDApOw0KDQogICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGRlc2MuSGVpZ2h0OyByb3crKykNCiAgICAgICAgew0KICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgZGVzYy5XaWR0aDsgY29sKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYXV0byBjdXJyUGl4ZWwgPSBkZXNjLlN0YXJ0SW5kZXggKyBkZXNjLlN0cmlkZSAqIHJvdyArIEJZVEVTX1BFUl9QSVhFTCAqIGNvbDsNCg0KICAgICAgICAgICAgICAgIGRhdGFbY3VyclBpeGVsICsgMF0gPSBidWZbY3VyclBpeGVsICsgMF07DQogICAgICAgICAgICAgICAgZGF0YVtjdXJyUGl4ZWwgKyAxXSA9IGJ1ZltjdXJyUGl4ZWwgKyAxXTsNCiAgICAgICAgICAgICAgICBkYXRhW2N1cnJQaXhlbCArIDJdID0gYnVmW2N1cnJQaXhlbCArIDJdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGRlbGV0ZSByZWZlcmVuY2U7DQogICAgZGVsZXRlIGJ1ZmZlcjsNCg0KICAgIFZpZGVvTWFuYWdlcjo6aW5zdGFuY2UtPnJlbmRlcmVyTWFuYWdlcigpLT5yZW5kZXJlcihpZCktPmlzUmVuZGVyaW5nID0gZmFsc2U7DQoNCiAgICBhdXRvIHNiU291cmNlID0gcmVmIG5ldyBNZWRpYTo6SW1hZ2luZzo6U29mdHdhcmVCaXRtYXBTb3VyY2UoKTsNCiAgICByZXR1cm4gY3JlYXRlX3Rhc2soc2JTb3VyY2UtPlNldEJpdG1hcEFzeW5jKGZyYW1lKSkNCiAgICAgICAgICAgLnRoZW4oW3RoaXMsIHNiU291cmNlXSgpDQogICAgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgSW5jb21pbmdWaWRlb0ltYWdlLT5Tb3VyY2UgPSBzYlNvdXJjZTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uXiBlKSB7DQogICAgICAgICAgICBXcml0ZUV4Y2VwdGlvbihlKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KfQ0K