I3ByYWdtYSBvbmNlDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IErkZ2VyIE5pY29sYXMgPG5pY29sYXMuamFnZXJAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICAgICAqDQoqIEF1dGhvcjogVHJhY3p5ayBBbmRyZWFzIDxhbmRyZWFzLnRyYWN6eWtAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqDQoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoNCiogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqDQoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoNCiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoNCiogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1c2luZyBuYW1lc3BhY2UgUGxhdGZvcm06OkNvbGxlY3Rpb25zOw0KDQpuYW1lc3BhY2UgUmluZ0NsaWVudFVXUA0Kew0KLyogZGVsZWdhdGUgKi8NCmRlbGVnYXRlIHZvaWQgQ2FsbFJlY2lldmVkKENhbGxeIGNhbGwpOw0KZGVsZWdhdGUgdm9pZCBDYWxsU3RhdHVzVXBkYXRlZChDYWxsXiBjYWxsKTsNCmRlbGVnYXRlIHZvaWQgQ2FsbFN0YXJ0ZWQoKTsNCmRlbGVnYXRlIHZvaWQgQ2FsbEVuZGVkKCk7DQoNCm5hbWVzcGFjZSBWaWV3TW9kZWwgew0KcHVibGljIHJlZiBjbGFzcyBDYWxsc1ZpZXdNb2RlbCBzZWFsZWQNCnsNCmludGVybmFsOg0KICAgIC8qIHNpbmdsZXRvbiAqLw0KICAgIHN0YXRpYyBwcm9wZXJ0eSBDYWxsc1ZpZXdNb2RlbF4gaW5zdGFuY2UNCiAgICB7DQogICAgICAgIENhbGxzVmlld01vZGVsXiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdGF0aWMgQ2FsbHNWaWV3TW9kZWxeIGluc3RhbmNlXyA9IHJlZiBuZXcgQ2FsbHNWaWV3TW9kZWwoKTsNCiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZV87DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBwcm9wZXJ0aWVzICovDQogICAgcHJvcGVydHkgVmVjdG9yPFN0cmluZ14+XiBfY2FsbElkTGlzdA0KICAgIHsNCiAgICAgICAgVmVjdG9yPFN0cmluZ14+XiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gY2FsbElkc0xpc3RfOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyogZXZlbnRzICovDQogICAgZXZlbnQgQ2FsbFJlY2lldmVkXiBjYWxsUmVjaWV2ZWQ7DQogICAgZXZlbnQgQ2FsbFN0YXR1c1VwZGF0ZWReIGNhbGxTdGF0dXNVcGRhdGVkOw0KICAgIGV2ZW50IENhbGxTdGFydGVkXiBjYWxsU3RhcnRlZDsNCiAgICBldmVudCBDYWxsRW5kZWReIGNhbGxFbmRlZDsNCg0KcHJpdmF0ZToNCiAgICBDYWxsc1ZpZXdNb2RlbCgpOyAvLyBzaW5nbGV0b24NCiAgICBWZWN0b3I8U3RyaW5nXj5eIGNhbGxJZHNMaXN0XzsNCg0KfTsNCn0NCn0NCg==