LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwovKioKICogCiAqLwpwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKCXByb3RlY3RlZCBUcmVlIHRyZWU7Cglwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwoJcHJvdGVjdGVkIExhYmVsIGRlc2NyaXB0aW9uOwoJCglwdWJsaWMgQWJzdHJhY3RUcmVlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewoJCXN1cGVyKHBhcmVudCwgc3R5bGUpOwoJCQoJCWNyZWF0ZVdpZGdldHMoKTsKCX0KCQoJcHJvdGVjdGVkIHZvaWQgY3JlYXRlV2lkZ2V0cygpIHsKCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMzsKCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMzsKCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwoJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwoJCWxheW91dC5udW1Db2x1bW5zID0gMjsKCQlzZXRMYXlvdXQobGF5b3V0KTsKCgkJLy9HcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CgkJLy9zZXRMYXlvdXREYXRhKGRhdGEpOwoJCQoJCVN0cmluZyBkZXNjcmlwdGlvblRleHQgPSBnZXREZXNjcmlwdGlvbkxhYmVsKCk7CgkJaWYgKGRlc2NyaXB0aW9uVGV4dCAhPSBudWxsKSB7CgkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5XUkFQKTsKCQkJbGFiZWwuc2V0VGV4dChkZXNjcmlwdGlvblRleHQpOwoJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7CgkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwoJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCX0KCQkKCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7CgkJbGFiZWwuc2V0VGV4dChnZXRUaXRsZUxhYmVsKCkpOwoJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwoKCQl0cmVlID0gbmV3IFRyZWUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUpOwoJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKCQl0cmVlLnNldExheW91dERhdGEoZGF0YSk7CgkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOwoJCQoJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7CgkJCgkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwoJCWxhYmVsLnNldFRleHQoIiIpOwoJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCQoJCS8vIHZpZXcgY29tcG9zaXRlCgkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwoJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDM7CgkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7CgkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CgkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKCgkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7CgkJY29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCQoJCWxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKCQlsYWJlbC5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIldmlld0J5IikpOwoJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwoJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CgkKCQlmaW5hbCBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7CgkJY29tYm8uc2V0SXRlbXMoZ2V0Q29tYm9PcHRpb25zKCkpOwoJCWNvbWJvLnNlbGVjdCgxKTsKCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwoJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewoJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewoJCQkJaW50IHNlbCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7CgkJCQl2aWV3T3B0aW9uU2VsZWN0ZWQoKGJ5dGUpIHNlbCk7CgkJCX0KCQl9KTsKCQkKCQlpZiAoaGFzRGVzY3JpcHRpb24oKSkgewoJCQlkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7CgkJCWRlc2NyaXB0aW9uLnNldFRleHQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpEZXNjcmlwdGlvbiIpKTsKCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwoJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKCQkJZGF0YS5oZWlnaHRIaW50ID0gMzU7CgkJCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZGF0YSk7CgkJfQoJfQoJCglwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlc2NyaXB0aW9uTGFiZWwoKTsKCQoJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUaXRsZUxhYmVsKCk7CgkKCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRDb21ib09wdGlvbnMoKTsKCQoJcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgkKCXByb3RlY3RlZCB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB0ZXh0KSB7CgkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgdGV4dCAhPSBudWxsKQoJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIld2l6RGVzY3JpcHRpb24iKSArICIgIiArIHRleHQpOwoJfQoJCglwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aWV3T3B0aW9uU2VsZWN0ZWQoYnl0ZSBvcHRpb24pOwoJCglwcm90ZWN0ZWQgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgewoJCXJldHVybiB0cmVlVmlld2VyOwoJfQoKCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgewoJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKCQlyZXR1cm4gc2VsLmdldEZpcnN0RWxlbWVudCgpOwoJfQoJCglwdWJsaWMgdm9pZCByZWZyZXNoKCkgewoJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwoJfQoJCglwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBvYmopIHsKCQl0cmVlVmlld2VyLnJlZnJlc2gob2JqKTsKCX0KCglwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IG9iaikgewoJCXRyZWVWaWV3ZXIucmVtb3ZlKG9iaik7Cgl9Cn0=