cGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLyoqCiAqIAogKi8KcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Cglwcm90ZWN0ZWQgVHJlZSB0cmVlOwoJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKCXByb3RlY3RlZCBMYWJlbCBkZXNjcmlwdGlvbjsKCQoJcHVibGljIEFic3RyYWN0VHJlZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKCQkKCQljcmVhdGVXaWRnZXRzKCk7Cgl9CgkKCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdpZGdldHMoKSB7CgkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwoJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDM7CgkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDM7CgkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CgkJc2V0TGF5b3V0KGxheW91dCk7CgoJCS8vR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwoJCS8vc2V0TGF5b3V0RGF0YShkYXRhKTsKCQkKCQlTdHJpbmcgZGVzY3JpcHRpb25UZXh0ID0gZ2V0RGVzY3JpcHRpb25MYWJlbCgpOwoJCWlmIChkZXNjcmlwdGlvblRleHQgIT0gbnVsbCkgewoJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7CgkJCWxhYmVsLnNldFRleHQoZGVzY3JpcHRpb25UZXh0KTsKCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwoJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQl9CgkJCgkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwoJCWxhYmVsLnNldFRleHQoZ2V0VGl0bGVMYWJlbCgpKTsKCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7CgkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CgkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKCgkJdHJlZSA9IG5ldyBUcmVlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CgkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CgkJdHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKCQkKCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwoJCQoJCWxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKCQlsYWJlbC5zZXRUZXh0KCIiKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7CgkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQkKCQkvLyB2aWV3IGNvbXBvc2l0ZQoJCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7CgkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAzOwoJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwoJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CgkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CgkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwoJCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7CgoJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwoJCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQkKCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7CgkJbGFiZWwuc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXZpZXdCeSIpKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCgkJZmluYWwgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwoJCWNvbWJvLnNldEl0ZW1zKGdldENvbWJvT3B0aW9ucygpKTsKCQljb21iby5zZWxlY3QoMSk7CgkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKCQkJCWludCBzZWwgPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwoJCQkJdmlld09wdGlvblNlbGVjdGVkKChieXRlKSBzZWwpOwoJCQl9CgkJfSk7CgkJCgkJaWYgKGhhc0Rlc2NyaXB0aW9uKCkpIHsKCQkJZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwoJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIld2l6RGVzY3JpcHRpb24iKSk7CgkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CgkJCWRhdGEuaGVpZ2h0SGludCA9IDM1OwoJCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCX0KCX0KCQoJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCk7CgkKCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VGl0bGVMYWJlbCgpOwoJCglwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0Q29tYm9PcHRpb25zKCk7CgkKCXByb3RlY3RlZCBib29sZWFuIGhhc0Rlc2NyaXB0aW9uKCkgewoJCXJldHVybiB0cnVlOwoJfQoJCglwcm90ZWN0ZWQgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdGV4dCkgewoJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIHRleHQgIT0gbnVsbCkKCQkJZGVzY3JpcHRpb24uc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXdpekRlc2NyaXB0aW9uIikgKyAiICIgKyB0ZXh0KTsKCX0KCQoJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlld09wdGlvblNlbGVjdGVkKGJ5dGUgb3B0aW9uKTsKCQoJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKCQlyZXR1cm4gdHJlZVZpZXdlcjsKCX0KCglwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7CgkJcmV0dXJuIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKCX0KCQoJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKCX0KCQoJcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3Qgb2JqKSB7CgkJdHJlZVZpZXdlci5yZWZyZXNoKG9iaik7Cgl9CgoJcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBvYmopIHsKCQl0cmVlVmlld2VyLnJlbW92ZShvYmopOwoJfQp9