LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogMjAwNjAxMDYgICAxMjExOTkgamVzcGVyQHNlbHNrYWJldC5vcmcgLSBKZXNwZXIgTfhsbGVyCiAqIDIwMDYwMzI5ICAgMTI3MDE2IGFuZHl6aGFpQGNhLmlibS5jb20gLSBBbmR5IFpoYWkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kOwoKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKCmltcG9ydCBvcmcuYXBhY2hlLmF4aXMudG9vbHMuYW50LndzZGwuSmF2YTJXc2RsQW50VGFzazsKaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy50b29scy5hbnQud3NkbC5OYW1lc3BhY2VNYXBwaW5nOwppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5BeGlzQ29uc3VtcHRpb25Db3JlTWVzc2FnZXM7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29udGV4dC5BeGlzRW1pdHRlckNvbnRleHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnRleHQuQXhpc0VtaXR0ZXJEZWZhdWx0czsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25Db3JlUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NVdGlsczsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKCi8qKgogKiBDb21tYW5kcyBhcmUgZXhlY3V0YWJsZSwgdW5kb2FibGUsIHJlZG9hYmxlIG9iamVjdHMuCiAqIEV2ZXJ5IENvbW1hbmQgaGFzIGEgbmFtZSBhbmQgYSBkZXNjcmlwdGlvbi4KICovCgpwdWJsaWMgY2xhc3MgSmF2YTJXU0RMQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCnsKCglwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwoJcHJpdmF0ZSBGaWxlIHRlbXBPdXRwdXRXc2RsRmlsZTsKCXByaXZhdGUgZmluYWwgU3RyaW5nIFRFTVAgPSAidGVtcCI7IC8vJE5PTi1OTFMtMSQKCXByaXZhdGUgZmluYWwgU3RyaW5nIFdTRExfRVhUID0gIi53c2RsIjsgLy8kTk9OLU5MUy0xJAoKCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKCkgewoJfQkKCS8qKgoJICogQ29uc3RydWN0b3IgZm9yIEphdmEyV1NETENvbW1hbmQuCgkgKi8KCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKCQlzdXBlcigpOwoJCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwoJfQoKCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKSAKCXsKCQlJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwoJCUlTdGF0dXMgc3RhdHVzOwoJCWlmIChqYXZhV1NETFBhcmFtXyA9PSBudWxsKSB7CgkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKEF4aXNDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5NU0dfRVJST1JfSkFWQV9XU0RMX1BBUkFNX05PVF9TRVQpOwoJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKCQkJcmV0dXJuIHN0YXR1czsKCQl9CgoJCWlmIChqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpID09IG51bGwpIHsKCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQXhpc0NvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCk7CgkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwoJCQlyZXR1cm4gc3RhdHVzOwoJCX0KCgkJUHJvZ3Jlc3NVdGlscy5yZXBvcnQobW9uaXRvciwgTkxTLmJpbmQoQXhpc0NvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLk1TR19HRU5FUkFURV9XU0RMLCBqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpICkpOwoKCQlyZXR1cm4gZXhlY3V0ZUFudFRhc2soZW52aXJvbm1lbnQsIG1vbml0b3IpOwoJfQoKCXByb3RlY3RlZCBJU3RhdHVzIGV4ZWN1dGVBbnRUYXNrKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CgoJCWZpbmFsIGNsYXNzIEVtaXR0ZXIgZXh0ZW5kcyBKYXZhMldzZGxBbnRUYXNrIHsKCQkJcHVibGljIEVtaXR0ZXIoKSB7CgkJCQlzdXBlci5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwoJCQkJc3VwZXIuZ2V0UHJvamVjdCgpLmluaXQoKTsKCQkJCXN1cGVyLnNldFRhc2tUeXBlKCJheGlzIik7IC8vJE5PTi1OTFMtMSQKCQkJCXN1cGVyLnNldFRhc2tOYW1lKCJheGlzLWphdmEyd3NkbCIpOyAvLyROT04tTkxTLTEkCgkJCQlzdXBlci5zZXRPd25pbmdUYXJnZXQobmV3IFRhcmdldCgpKTsKCQkJfQoJCX0KCgkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwoJCUVtaXR0ZXIgZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7CgkJZW1pdHRlci5jcmVhdGVDbGFzc3BhdGgoKS5zZXRQYXRoKGphdmFXU0RMUGFyYW1fLmdldENsYXNzcGF0aCgpKTsKCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coSUxvZy5JTkZPLCA1MDA4LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiQ2xhc3MgUGF0aCA9ICIrIGphdmFXU0RMUGFyYW1fLmdldENsYXNzcGF0aCgpKTsKCQkKCQllbWl0dGVyLnNldFBvcnRUeXBlTmFtZShqYXZhV1NETFBhcmFtXy5nZXRQb3J0VHlwZU5hbWUoKSk7CgkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKElMb2cuSU5GTywgNTAwOSwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIlBvcnQgVHlwZSBOYW1lID0gIisgamF2YVdTRExQYXJhbV8uZ2V0UG9ydFR5cGVOYW1lKCkpOwoJCQoJCWVtaXR0ZXIuc2V0U2VydmljZUVsZW1lbnROYW1lKGphdmFXU0RMUGFyYW1fLmdldFNlcnZpY2VOYW1lKCkpOwoJCWVudmlyb25tZW50LmdldExvZygpLmxvZyhJTG9nLklORk8sIDUwMTAsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJTZXJ2aWNlIE5hbWUgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRTZXJ2aWNlTmFtZSgpKTsKCQkKCQllbWl0dGVyLnNldExvY2F0aW9uKGphdmFXU0RMUGFyYW1fLmdldFVybExvY2F0aW9uKCkpOwoJCWVudmlyb25tZW50LmdldExvZygpLmxvZyhJTG9nLklORk8sIDUwMTEsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJVUkwgTG9jYXRpb24gPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRVcmxMb2NhdGlvbigpKTsKCQkKCQllbWl0dGVyLnNldE1ldGhvZHMoamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kU3RyaW5nKCkpOwoJCWVudmlyb25tZW50LmdldExvZygpLmxvZyhJTG9nLklORk8sIDUwMTIsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJNZXRob2RzID0gIisgamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kU3RyaW5nKCkpOwoJCQoJCWVtaXR0ZXIuc2V0U3R5bGUoamF2YVdTRExQYXJhbV8uZ2V0U3R5bGUoKSk7CgkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKElMb2cuSU5GTywgNTAxMywgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIlN0eWxlID0gIisgamF2YVdTRExQYXJhbV8uZ2V0U3R5bGUoKSk7CgkJCgkJZW1pdHRlci5zZXRVc2UoamF2YVdTRExQYXJhbV8uZ2V0VXNlKCkpOwoJCWVudmlyb25tZW50LmdldExvZygpLmxvZyhJTG9nLklORk8sIDUwMTQsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJVc2UgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRVc2UoKSk7CgkJCQkKCQkvLyBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgYXMgb3V0cHV0IGRpcmVjdG9yeSBmb3IgamF2YTJ3c2RsCgkJSVBhdGggcGx1Z2luU3RhdGVMb2MgPSBXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKTsKCQlGaWxlIHRlbXBEaXIgPSBuZXcgRmlsZShwbHVnaW5TdGF0ZUxvYy50b1N0cmluZygpKTsKCQlGaWxlIG5ld1RlbXBGaWxlID0gbnVsbDsKCQl0cnkgewoJCQluZXdUZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoVEVNUCwgV1NETF9FWFQsIHRlbXBEaXIpOwoJCQl0ZW1wT3V0cHV0V3NkbEZpbGUgPSBuZXdUZW1wRmlsZTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQl0ZW1wT3V0cHV0V3NkbEZpbGUgPSBuZXcgRmlsZSAocGx1Z2luU3RhdGVMb2MuYXBwZW5kKFRFTVArV1NETF9FWFQpLnRvU3RyaW5nKCkpOwoJCX0KCgkJZW1pdHRlci5zZXRPdXRwdXQodGVtcE91dHB1dFdzZGxGaWxlKTsKCQkKCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coSUxvZy5JTkZPLCA1MDE1LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiV1NETCBMb2NhdGlvbiA9ICIrIGphdmFXU0RMUGFyYW1fLmdldE91dHB1dFdzZGxMb2NhdGlvbigpKTsKCQkKCQllbWl0dGVyLnNldE5hbWVzcGFjZShqYXZhV1NETFBhcmFtXy5nZXROYW1lc3BhY2UoKSk7CgkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKElMb2cuSU5GTywgNTAxNiwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIk5hbWUgU3BhY2UgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXROYW1lc3BhY2UoKSk7CgkJCgkJZW1pdHRlci5zZXRDbGFzc05hbWUoamF2YVdTRExQYXJhbV8uZ2V0QmVhbk5hbWUoKSk7CgkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKElMb2cuSU5GTywgNTAxNywgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIkJlYW4gbmFtZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwoJCQoJCWVtaXR0ZXIuc2V0SW1wbENsYXNzKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwoJCQoJICAgIEF4aXNFbWl0dGVyQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUF4aXNDb25zdW1wdGlvbkNvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRBeGlzRW1pdHRlckNvbnRleHQoKTsKCSAgICAKCSAgICBpZiAoY29udGV4dC5pc1VzZUluaGVyaXRlZE1ldGhvZHNFbmFibGVkKCkgIT0gQXhpc0VtaXR0ZXJEZWZhdWx0cy5nZXRVc2VJbmhlcml0ZWRNZXRob2RzRGVmYXVsdCgpKQoJICAgIHsKCSAgICAJZW1pdHRlci5zZXRVc2VJbmhlcml0ZWRNZXRob2RzKGNvbnRleHQuaXNVc2VJbmhlcml0ZWRNZXRob2RzRW5hYmxlZCgpKTsKCQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKElMb2cuSU5GTywgNTA5OSwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIiBzZXQgVXNlSW5oZXJpdGVkTWV0aG9kcyA6ICIgKyBjb250ZXh0LmlzVXNlSW5oZXJpdGVkTWV0aG9kc0VuYWJsZWQoKSApOwoJICAgIH0KCQkKCQlIYXNoTWFwIG1hcHBpbmdzID0gamF2YVdTRExQYXJhbV8uZ2V0TWFwcGluZ3MoKTsKCQlpZihtYXBwaW5ncyAhPSBudWxsKXsKCQkJSXRlcmF0b3Iga2V5cyA9IG1hcHBpbmdzLmtleVNldCgpLml0ZXJhdG9yKCk7CgkJCXdoaWxlKGtleXMuaGFzTmV4dCgpKXsKCQkJCVN0cmluZyBwYWthZ2UgPSAoU3RyaW5nKWtleXMubmV4dCgpOwoJCQkJU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpbWFwcGluZ3MuZ2V0KHBha2FnZSk7CgkJCQlOYW1lc3BhY2VNYXBwaW5nIG1hcCA9IG5ldyBOYW1lc3BhY2VNYXBwaW5nKCk7CgkJCQltYXAuc2V0UGFja2FnZShwYWthZ2UpOwoJCQkJbWFwLnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwoJCQkJZW1pdHRlci5hZGRNYXBwaW5nKG1hcCk7CQkKCQkJfQoJCX0KCQkKCQoJCXRyeSB7CgkJCWVtaXR0ZXIuZXhlY3V0ZSgpOwoJCQlzdGF0dXMgPSBtb3ZlR2VuZXJhdGVkV1NETChlbnZpcm9ubWVudCwgbW9uaXRvcik7CgkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewoJCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coSUxvZy5FUlJPUiwgNTAxOCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgZSk7CgkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKAoJCQlBeGlzQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuTVNHX0VSUk9SX0pBVkFfV1NETF9HRU5FUkFURSArICIgIiAvLyROT04tTkxTLTEkCgkJCStlLmdldENhdXNlKCkudG9TdHJpbmcoKSwgZS5nZXRDYXVzZSgpKTsKCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7CgkJCXJldHVybiBzdGF0dXM7Cgl9IGZpbmFsbHkgewoJCWlmICh0ZW1wT3V0cHV0V3NkbEZpbGUuZXhpc3RzKCkpIHsKCQkJdGVtcE91dHB1dFdzZGxGaWxlLmRlbGV0ZSgpOwoJCX0KCX0KCQlyZXR1cm4gc3RhdHVzOwoKCX0KCQoJcHVibGljIElTdGF0dXMgbW92ZUdlbmVyYXRlZFdTREwoSUVudmlyb25tZW50IGVudmlyb25tZW50LAoJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7CgkJRmlsZUlucHV0U3RyZWFtIGZpblN0cmVhbSA9IG51bGw7CgkJCgkJUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7CgkJSVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKTsKCQkKCQlTdHJpbmcgb3V0cHV0V3NkbExvY2F0aW9uID0gamF2YVdTRExQYXJhbV8uZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCk7CgkJSVBhdGggdGFyZ2V0UGF0aCA9IG5ldyBQYXRoKG91dHB1dFdzZGxMb2NhdGlvbik7CgkJdHJ5IHsKCQkJZmluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZW1wT3V0cHV0V3NkbEZpbGUpOwoJCQlpZiAoZmluU3RyZWFtICE9IG51bGwpIHsKCQkJCUZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGVBdExvY2F0aW9uKGNvbnRleHQsIHRhcmdldFBhdGgubWFrZUFic29sdXRlKCksIGZpblN0cmVhbSwKCQkJCQkJbW9uaXRvciwgc3RhdHVzSGFuZGxlcik7CgkJCQlmaW5TdHJlYW0uY2xvc2UoKTsKCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKEF4aXNDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5NU0dfRVJST1JfTU9WRV9SRVNPVVJDRSxuZXcgU3RyaW5nW117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7CgkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwoJCX0gZmluYWxseSB7CgkJCXRyeSB7CgkJCQlpZiAoZmluU3RyZWFtICE9IG51bGwpIHsKCQkJCQlmaW5TdHJlYW0uY2xvc2UoKTsKCQkJCX0KCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQl9CgkJfQoJCXJldHVybiBzdGF0dXM7Cgl9CgkKCXB1YmxpYyBTdGF0dXMgdW5kbyhJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKCQlyZXR1cm4gbnVsbDsKCX0KCglwdWJsaWMgU3RhdHVzIHJlZG8oSUVudmlyb25tZW50IGVudmlyb25tZW50KSB7CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtLgoJICogQHJldHVybiBKYXZhV1NETFBhcmFtZXRlcgoJICovCglwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpIHsKCQlyZXR1cm4gamF2YVdTRExQYXJhbV87Cgl9CgoJcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcm0pIHsKCQl0aGlzLmphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJtOwoJfQoJCglwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKQoJewoJICBGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRKYXZhV1NETFBhcmFtKCkuZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCkpOyAKCSAgICBTdHJpbmcgdXJsID0gIiI7CgkJICB0cnkgewoJICAgIAl1cmwgPSBmaWxlLnRvVVJMKCkudG9TdHJpbmcoKTsKCSAgICB9CgkJICBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKXt9CgkJcmV0dXJuIHVybDsKCX0KfQo=