LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBDb3B5cmlnaHQgKEMpIDIwMTYgYnkgU2F2b2lyLWZhaXJlIExpbnV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIEF1dGhvcjogSuRnZXIgTmljb2xhcyA8bmljb2xhcy5qYWdlckBzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqDQoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoNCiogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqDQoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoNCiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoNCiogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojcHJhZ21hIG9uY2UNCg0KI2RlZmluZSBVV1BfREJHX0NMSUVOVCAgICAgIDANCiNkZWZpbmUgVVdQX0RCR19WUyAgICAgICAgICAxDQojZGVmaW5lIFVXUF9EQkdfRklMRSAgICAgICAgMA0KDQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6U3RvcmFnZTsNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCg0KLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLw0KcmVmIGNsYXNzIFJpbmdEZWJ1ZzsNCg0KLyogZGVsZWdhdGUgKi8NCmRlbGVnYXRlIHZvaWQgZGVidWdNZXNzYWdlVG9TY3JlZW4oUGxhdGZvcm06OlN0cmluZ14gbWVzc2FnZSk7DQoNCi8qIHRoaXMgaXMgaG93IHRvIGltcGxlbWVudCBhIHNpbmdsZXRvbiBjbGFzcyovDQpwdWJsaWMgcmVmIGNsYXNzIFJpbmdEZWJ1ZyBzZWFsZWQNCnsNCnB1YmxpYzoNCiAgICAvKiBzaW5nbGV0b24gKi8NCiAgICBzdGF0aWMgcHJvcGVydHkgUmluZ0RlYnVnXiBpbnN0YW5jZQ0KICAgIHsNCiAgICAgICAgUmluZ0RlYnVnXiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdGF0aWMgUmluZ0RlYnVnXiBpbnN0YW5jZV8gPSByZWYgbmV3IFJpbmdEZWJ1ZygpOw0KICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIHByb3BlcnRpZXMgKi8NCg0KICAgIC8qIGZ1bmN0aW9ucyAqLw0KaW50ZXJuYWw6DQogICAgZW51bSBjbGFzcyBUeXBlIHsgRE1OLCBNU0csIFdORywgRVJSIH07DQogICAgdm9pZCBwcmludChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgY29uc3QgVHlwZSYgdHlwZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGUsIGludCBsaW5lKTsNCiAgICB2b2lkIHByaW50KFN0cmluZ14gbWVzc2FnZSwgY29uc3QgVHlwZSYgdHlwZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGUsIGludCBsaW5lKTsNCiAgICB2b2lkIHByaW50KEV4Y2VwdGlvbl4gZSwgc3RkOjpzdHJpbmcgZmlsZSwgaW50IGxpbmUpOw0KDQogICAgLyogZXZlbnQgKi8NCiAgICBldmVudCBkZWJ1Z01lc3NhZ2VUb1NjcmVlbl4gbWVzc2FnZVRvU2NyZWVuOw0KDQpwcml2YXRlOg0KICAgIFJpbmdEZWJ1ZygpOyAvLyBzaW5nbGV0b24NCn07DQoNCnZvaWQgV3JpdGVMaW5lKFN0cmluZ14gc3RyKQ0Kew0KICAgIHN0ZDo6d3N0cmluZ3N0cmVhbSB3U3RyaW5nc3RyZWFtOw0KICAgIHdTdHJpbmdzdHJlYW0gPDwgc3RyLT5EYXRhKCkgPDwgIlxuIjsNCiAgICBPdXRwdXREZWJ1Z1N0cmluZyh3U3RyaW5nc3RyZWFtLnN0cigpLmNfc3RyKCkpOw0KfQ0KDQp2b2lkIFdyaXRlRXhjZXB0aW9uKEV4Y2VwdGlvbl4gZXgpDQp7DQogICAgc3RkOjp3c3RyaW5nc3RyZWFtIHdTdHJpbmdzdHJlYW07DQogICAgd1N0cmluZ3N0cmVhbSA8PCAiMHgiIDw8IGV4LT5IUmVzdWx0IDw8ICI6ICIgPDwgZXgtPk1lc3NhZ2UtPkRhdGEoKTsNCiAgICBPdXRwdXREZWJ1Z1N0cmluZyh3U3RyaW5nc3RyZWFtLnN0cigpLmNfc3RyKCkpOw0KfQ0KDQojZGVmaW5lIERNU0dfKHN0cikgQ29yZUFwcGxpY2F0aW9uOjpNYWluVmlldy0+Q29yZVdpbmRvdy0+RGlzcGF0Y2hlci0+UnVuQXN5bmMoQ29yZURpc3BhdGNoZXJQcmlvcml0eTo6SGlnaCwgXA0KcmVmIG5ldyBEaXNwYXRjaGVkSGFuZGxlcihbPV0oKSB7IFJpbmdEZWJ1Zzo6aW5zdGFuY2UtPnByaW50KHN0ciwgUmluZ0RlYnVnOjpUeXBlOjpETU4sIF9fRklMRV9fLCBfX0xJTkVfXyk7IH0pKQ0KDQojZGVmaW5lIE1TR18oc3RyKSBDb3JlQXBwbGljYXRpb246Ok1haW5WaWV3LT5Db3JlV2luZG93LT5EaXNwYXRjaGVyLT5SdW5Bc3luYyhDb3JlRGlzcGF0Y2hlclByaW9yaXR5OjpIaWdoLCBcDQpyZWYgbmV3IERpc3BhdGNoZWRIYW5kbGVyKFs9XSgpIHsgUmluZ0RlYnVnOjppbnN0YW5jZS0+cHJpbnQoc3RyLCBSaW5nRGVidWc6OlR5cGU6Ok1TRywgX19GSUxFX18sIF9fTElORV9fKTsgfSkpDQoNCiNkZWZpbmUgV05HXyhzdHIpIENvcmVBcHBsaWNhdGlvbjo6TWFpblZpZXctPkNvcmVXaW5kb3ctPkRpc3BhdGNoZXItPlJ1bkFzeW5jKENvcmVEaXNwYXRjaGVyUHJpb3JpdHk6OkhpZ2gsIFwNCnJlZiBuZXcgRGlzcGF0Y2hlZEhhbmRsZXIoWz1dKCkgeyBSaW5nRGVidWc6Omluc3RhbmNlLT5wcmludChzdHIsIFJpbmdEZWJ1Zzo6VHlwZTo6V05HLCBfX0ZJTEVfXywgX19MSU5FX18pOyB9KSkNCg0KI2RlZmluZSBFUlJfKHN0cikgQ29yZUFwcGxpY2F0aW9uOjpNYWluVmlldy0+Q29yZVdpbmRvdy0+RGlzcGF0Y2hlci0+UnVuQXN5bmMoQ29yZURpc3BhdGNoZXJQcmlvcml0eTo6SGlnaCwgXA0KcmVmIG5ldyBEaXNwYXRjaGVkSGFuZGxlcihbPV0oKSB7IFJpbmdEZWJ1Zzo6aW5zdGFuY2UtPnByaW50KHN0ciwgUmluZ0RlYnVnOjpUeXBlOjpFUlIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IH0pKQ0KDQojZGVmaW5lIEVYQ18oZSkgQ29yZUFwcGxpY2F0aW9uOjpNYWluVmlldy0+Q29yZVdpbmRvdy0+RGlzcGF0Y2hlci0+UnVuQXN5bmMoQ29yZURpc3BhdGNoZXJQcmlvcml0eTo6SGlnaCwgXA0KcmVmIG5ldyBEaXNwYXRjaGVkSGFuZGxlcihbPV0oKSB7IFJpbmdEZWJ1Zzo6aW5zdGFuY2UtPnByaW50KGUsIF9fRklMRV9fLCBfX0xJTkVfXyk7IH0pKQ0KDQp9DQo=