cGFja2FnZSBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3I7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycCBhbmQgb3RoZXJzLgpBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKoApDb250cmlidXRvcnM6CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkRlbGV0ZVJlc291cmNlQWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5UZXh0QWN0aW9uSGFuZGxlcjsKCi8qKgogKiBUaGlzIGlzIHRoZSBhY3Rpb24gZ3JvdXAgZm9yIHJlZmFjdG9yIGFjdGlvbnMsCiAqIGluY2x1ZGluZyBnbG9iYWwgYWN0aW9uIGhhbmRsZXJzIGZvciBjb3B5LCBwYXN0ZSBhbmQgZGVsZXRlLgogKiAKICogQHNpbmNlIDIuMAogKi8KcHVibGljIGNsYXNzIFJlZmFjdG9yQWN0aW9uR3JvdXAgZXh0ZW5kcyBSZXNvdXJjZU5hdmlnYXRvckFjdGlvbkdyb3VwIHsKCXByaXZhdGUgQ2xpcGJvYXJkIGNsaXBib2FyZDsKCglwcml2YXRlIENvcHlBY3Rpb24gY29weUFjdGlvbjsKCXByaXZhdGUgRGVsZXRlUmVzb3VyY2VBY3Rpb24gZGVsZXRlQWN0aW9uOwoJcHJpdmF0ZSBQYXN0ZUFjdGlvbiBwYXN0ZUFjdGlvbjsKCXByaXZhdGUgUmVzb3VyY2VOYXZpZ2F0b3JSZW5hbWVBY3Rpb24gcmVuYW1lQWN0aW9uOwoJcHJpdmF0ZSBSZXNvdXJjZU5hdmlnYXRvck1vdmVBY3Rpb24gbW92ZUFjdGlvbjsKCXByaXZhdGUgVGV4dEFjdGlvbkhhbmRsZXIgdGV4dEFjdGlvbkhhbmRsZXI7CgkKCXB1YmxpYyBSZWZhY3RvckFjdGlvbkdyb3VwKElSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3IpIHsKCQlzdXBlcihuYXZpZ2F0b3IpOwoJfQoKCXByb3RlY3RlZCB2b2lkIG1ha2VBY3Rpb25zKCkgewoJCVRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IChUcmVlVmlld2VyKSBuYXZpZ2F0b3IuZ2V0Vmlld2VyKCk7CgkJU2hlbGwgc2hlbGwgPSBuYXZpZ2F0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7CgkJY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChzaGVsbC5nZXREaXNwbGF5KCkpOwoJCXBhc3RlQWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKHNoZWxsLCBjbGlwYm9hcmQpOwoJCWNvcHlBY3Rpb24gPSBuZXcgQ29weUFjdGlvbihzaGVsbCwgY2xpcGJvYXJkLCBwYXN0ZUFjdGlvbik7CgkJbW92ZUFjdGlvbiA9IG5ldyBSZXNvdXJjZU5hdmlnYXRvck1vdmVBY3Rpb24oc2hlbGwsIHRyZWVWaWV3ZXIpOwoJCXJlbmFtZUFjdGlvbiA9IG5ldyBSZXNvdXJjZU5hdmlnYXRvclJlbmFtZUFjdGlvbihzaGVsbCwgdHJlZVZpZXdlcik7CgkJZGVsZXRlQWN0aW9uID0gbmV3IERlbGV0ZVJlc291cmNlQWN0aW9uKHNoZWxsKTsKCX0KCglwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPQoJCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKTsKCgkJYm9vbGVhbiBhbnlSZXNvdXJjZVNlbGVjdGVkID0KCQkJIXNlbGVjdGlvbi5pc0VtcHR5KCkKCQkJCSYmIFJlc291cmNlU2VsZWN0aW9uVXRpbC5hbGxSZXNvdXJjZXNBcmVPZlR5cGUoCgkJCQkJc2VsZWN0aW9uLAoJCQkJCUlSZXNvdXJjZS5QUk9KRUNUIHwgSVJlc291cmNlLkZPTERFUiB8IElSZXNvdXJjZS5GSUxFKTsKCgkJY29weUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7CgkJbWVudS5hZGQoY29weUFjdGlvbik7CgkJcGFzdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwoJCW1lbnUuYWRkKHBhc3RlQWN0aW9uKTsKCgkJaWYgKGFueVJlc291cmNlU2VsZWN0ZWQpIHsKCQkJZGVsZXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKCQkJbWVudS5hZGQoZGVsZXRlQWN0aW9uKTsKCQkJbW92ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7CgkJCW1lbnUuYWRkKG1vdmVBY3Rpb24pOwoJCQlyZW5hbWVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwoJCQltZW51LmFkZChyZW5hbWVBY3Rpb24pOwoJCX0KCX0KCglwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CgkJdGV4dEFjdGlvbkhhbmRsZXIgPSBuZXcgVGV4dEFjdGlvbkhhbmRsZXIoYWN0aW9uQmFycyk7IC8vIGhvb2tzIGhhbmRsZXJzCgkJdGV4dEFjdGlvbkhhbmRsZXIuc2V0Q29weUFjdGlvbihjb3B5QWN0aW9uKTsKCQl0ZXh0QWN0aW9uSGFuZGxlci5zZXRQYXN0ZUFjdGlvbihwYXN0ZUFjdGlvbik7CgkJdGV4dEFjdGlvbkhhbmRsZXIuc2V0RGVsZXRlQWN0aW9uKGRlbGV0ZUFjdGlvbik7CgkJcmVuYW1lQWN0aW9uLnNldFRleHRBY3Rpb25IYW5kbGVyKHRleHRBY3Rpb25IYW5kbGVyKTsKCQkKCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NT1ZFLCBtb3ZlQWN0aW9uKTsKCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5SRU5BTUUsIHJlbmFtZUFjdGlvbik7Cgl9CgoJcHVibGljIHZvaWQgdXBkYXRlQWN0aW9uQmFycygpIHsKCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPQoJCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKTsKCgkJY29weUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7CgkJcGFzdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwoJCWRlbGV0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7CgkJbW92ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7CgkJcmVuYW1lQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKCX0KCQoJLyoqCiAJICogSGFuZGxlcyBhIGtleSBwcmVzc2VkIGV2ZW50IGJ5IGludm9raW5nIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uCiAJICovCglwdWJsaWMgdm9pZCBoYW5kbGVLZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7CgkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuREVMICYmIGV2ZW50LnN0YXRlTWFzayA9PSAwKSB7CgkJCWlmIChkZWxldGVBY3Rpb24uaXNFbmFibGVkKCkpIHsKCQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKCQkJfQoJCX0KCQllbHNlIGlmIChldmVudC5rZXlDb2RlID09IFNXVC5GMiAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMCkgewoJCQlpZiAocmVuYW1lQWN0aW9uLmlzRW5hYmxlZCgpKSB7CgkJCQlyZW5hbWVBY3Rpb24ucnVuKCk7CgkJCX0KCQl9Cgl9CgkKCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CgkJaWYgKGNsaXBib2FyZCAhPSBudWxsKSB7CgkJCWNsaXBib2FyZC5kaXNwb3NlKCk7CgkJCWNsaXBib2FyZCA9IG51bGw7CgkJfQoJCXN1cGVyLmRpc3Bvc2UoKTsKCX0KfQ==