LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQucHJvY2VzczJhc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC51dGlsczsNCg0KaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5NYXA7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi5jb21tYW5kcy5DcmVhdGVTZW1hbnRpY1Jlc291cmNlUmVjb3JkaW5nQ29tbWFuZDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24ucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24udWkuRGF3bkVkaXRvcklucHV0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi50cmFuc2FjdGlvbi5EYXduR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnV0aWwuY29ubmVjdGlvbi5DRE9Db25uZWN0aW9uVXRpbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZUZvbGRlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnRyYW5zYWN0aW9uLkNET1RyYW5zYWN0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7DQppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1Xb3JrYmVuY2hQYXJ0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247DQppbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQppbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQppbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQppbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5kaWFncmFtLmVkaXQuY29tbWFuZHMuTG9hZFZpZXdMb2NhdGlvbnM7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJnRmFjdG9yeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Nb2RlbEVsZW1lbnQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhc2VDYW5vbmljYWxFZGl0UG9saWN5Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXNlUGVyc2lzdGVkQ2Fub25pY2FsRWRpdFBvbGljeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5kaWFncmFtLmVkaXQucG9saWNpZXMuRGF3bkNhc2VQZXJzaXN0ZWRDYW5vbmljYWxFZGl0UG9saWN5Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5EYXduQ2FzZVBlcnNpc3RlZFNlbWlDYW5vbmljYWxFZGl0UG9saWN5Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmRpYWdyYW0ucGFydC5BcmdEaWFncmFtRWRpdG9yUGx1Z2luOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmRpYWdyYW0ucGFydC5EYXduQXJnRGlhZ3JhbUVkaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuaW1wbC5DYXNlSW1wbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5kaWFncmFtLmVkaXQuY29tbWFuZHMuUmVwYWlyRGF3blZpZXdMb2NhdGlvbnNDb21tYW5kOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoNCi8vIFN0YXJ0IE1DUA0KcHVibGljIGNsYXNzIERhd25BcmdEaWFncmFtVXRpbCB7DQoJcHJpdmF0ZSBDRE9SZXNvdXJjZSBzb3VyY2VEaWFncmFtUmVzb3VyY2U7IC8vIGZvciBsb2NhdGlvbiBhbmQgc2l6ZSB2aWV3cw0KCXByaXZhdGUgVVJJIG1vZGVsVVJJOw0KCXByaXZhdGUgVVJJIGRpYWdyYW1VUkk7DQoJcHJvdGVjdGVkIFJlc291cmNlIGRpYWdyYW07DQoJcHJpdmF0ZSBDRE9SZXNvdXJjZUZvbGRlciBhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyOw0KCXByaXZhdGUgQ0RPVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb247DQoJcHJpdmF0ZSBMaXN0PEVPYmplY3Q+IGxpc3RSb290T2JqZWN0cyA9IG51bGw7DQoJDQoJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERhd25BcmdEaWFncmFtRWRpdG9yX0lEID0gIm9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmRpYWdyYW0ucGFydC5EYXduQXJnRGlhZ3JhbUVkaXRvciI7DQoJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERhd25DYXNlRWRpdFBhcnRfTU9ERUxfSUQgPSAiQXJnIjsNCgkNCgkvKioNCgkgKiBDb25zdHJ1Y3RvciANCgkgKi8NCglwdWJsaWMgRGF3bkFyZ0RpYWdyYW1VdGlsKENET1Jlc291cmNlIHNvdXJjZURpYWdyYW1SZXNvdXJjZSwgTGlzdDxFT2JqZWN0PiBscm8sIFVSSSBtb2RlbCwgVVJJIGRpYWdyYW0sIENET1Jlc291cmNlRm9sZGVyIGFzc3VyYW5jZXByb2plY3RGb2xkZXIsIENET1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uKSB7DQoJCXN1cGVyKCk7DQoJCXRoaXMuc291cmNlRGlhZ3JhbVJlc291cmNlID0gc291cmNlRGlhZ3JhbVJlc291cmNlOw0KCQl0aGlzLmxpc3RSb290T2JqZWN0cyA9IGxybzsNCgkJdGhpcy5tb2RlbFVSSSA9IG1vZGVsOw0KCQl0aGlzLmRpYWdyYW1VUkkgPSBkaWFncmFtOw0KCQl0aGlzLmFzc3VyYW5jZXByb2plY3RGb2xkZXIgPSBhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyOw0KCQl0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247DQoJfQ0KDQoNCglwdWJsaWMgdm9pZCBnZW5lcmF0ZURpYWdyYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQoJCXRyeSB7DQoJCQlnZW5lcmF0ZURpYWdyYW0wKG1vbml0b3IpOw0KCQkJLyogTUNQDQoJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsNCgkJCXdvcmtzcGFjZS5nZXRSb290KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7DQoJCQkqLw0KCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJfQ0KCX0NCg0KCQ0KCS8vZ2VuZXJhdGVzIGEgZGlhZ3JhbSBmb3IgdGhlIGdpdmVuIGRvbWFpbiBtb2RlbCBmaWxlIG5hbWUNCglwdWJsaWMgdm9pZCBnZW5lcmF0ZURpYWdyYW0wKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCgkJLy9kaWFncmFtID0gRGF3bkFyZ0RpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZURpYWdyYW0oZGlhZ3JhbVVSSSwgbW9kZWxVUkksIG1vbml0b3IpOw0KCQlkaWFncmFtID0gY3JlYXRlRGlhZ3JhbShkaWFncmFtVVJJLCBtb2RlbFVSSSwgbW9uaXRvcik7DQoJCWlmIChkaWFncmFtICE9IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJLy9EYXduQXJnRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbSk7DQoJCQkJb3BlbkRpYWdyYW0oZGlhZ3JhbSk7IC8vIHBhcmEgcXVlIGVsIGVkaXRvciBkZSBhcmdfZGlhZ3JhbSBlc3RlIGFjdGl2bw0KCQkJCS8vIFN0YXJ0IE1DUA0KCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpDQoJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpDQoJCQkJCQkuZ2V0QWN0aXZlRWRpdG9yKCk7DQoJCQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpIHsNCgkJCQkJRGlhZ3JhbUVkaXRQYXJ0ICBlZGl0cCA9ICgoSURpYWdyYW1Xb3JrYmVuY2hQYXJ0KSBlZGl0b3JQYXJ0KS5nZXREaWFncmFtRWRpdFBhcnQoKTsNCg0KCQkJCQllZGl0cC5yZW1vdmVFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSk7DQoNCgkJCQkJLyogTUNQOiBzZSBlamVjdXRhIHRvZG8gMiB2ZWNlcyEhIQ0KCQkJCQllZGl0cC5pbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQoJCQkJCQkJbmV3IENhc2VQZXJzaXN0ZWRDYW5vbmljYWxFZGl0UG9saWN5KCkpOyAvL01DUCBPSk86IHBhcmEgZXZpdGFyIGJ1Y2xlIGluZmluaXRvDQoJCQkJCSovDQoJCQkJCQ0KCQkJCQkvKiBGVU5DSU9OQSBQRVJPIENSRUEgVE9EQVMgTEFTIFZJU1RBUyEhISENCiAJCQkJCWVkaXRwLmluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCgkJCQkJCQluZXcgRGF3bkNhc2VQZXJzaXN0ZWRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KCQkJCQkqLw0KCQkJCQkvLyBjcmVhciBzb2xvIHZpc3RhcyBkZWwgZGlhZ3JhbWENCgkJCQkJLyogTm8gZXMgbmVjZXNhcmlvDQoJCSAgICAgICAgCUxpc3Q8RU9iamVjdD4gc3VibGlzdCA9IGxpc3RSb290T2JqZWN0czsNCgkJICAgICAgICAJTGlzdDxFT2JqZWN0PiB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsNCgkJICAgICAgICAJZm9yKCBFT2JqZWN0IGVsZW1lbnQgOiBzdWJsaXN0KQ0KCQkgICAgICAgIAl7DQoJCSAgICAgICAgCQkvLyBubyBzZSBwdWVkZSBjb3BpYXIgZGVzZGUgQ2FzZSBvIGVsZW1lbnRvcyBkZSBvdHJvcyBtb2RlbG9zDQoJCSAgICAgICAgCSAgICBpZihmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgTW9kZWxFbGVtZW50KQ0KCQkgICAgICAgIAkgICAgCXRvUmVtb3ZlLmFkZChlbGVtZW50KTsNCgkJICAgICAgICAJfQ0KCQkgICAgICAgIAlsaXN0Um9vdE9iamVjdHMucmVtb3ZlQWxsKHRvUmVtb3ZlKTsNCgkJICAgICAgICAJKi8NCgkJCQkJTG9hZFZpZXdMb2NhdGlvbnMgc291cmNlVmlld0xvY2F0aW9ucyA9IG5ldyBMb2FkVmlld0xvY2F0aW9ucyhzb3VyY2VEaWFncmFtUmVzb3VyY2UpOw0KCQkJCQlzb3VyY2VWaWV3TG9jYXRpb25zLkxvYWRPYmplY3RMb2NhdGlvbnMoKTsNCgkJCQkJRGF3bkNhc2VQZXJzaXN0ZWRTZW1pQ2Fub25pY2FsRWRpdFBvbGljeSBzY3AgPSBuZXcgRGF3bkNhc2VQZXJzaXN0ZWRTZW1pQ2Fub25pY2FsRWRpdFBvbGljeSgpOw0KCQkJCQlzY3Auc2V0T2JqZWN0cyhsaXN0Um9vdE9iamVjdHMpOw0KCQkJCQkvL3NjcC5zZXRTb3VyY2VEaWFncmFtKHNvdXJjZURpYWdyYW1SZXNvdXJjZSk7CQkJCQkNCgkJCQkJc2NwLnNldFNvdXJjZURpYWdyYW0oc291cmNlVmlld0xvY2F0aW9ucyk7DQogCQkJCQkvL2VkaXRwLmluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwgc2NwKTsNCgkJCQkJc2NwLnNldEhvc3QoZWRpdHApOw0KCQkJCQkvL3NjcC5yZWZyZXNoKCk7ICAgICAgICAgICAgICAgIA0KCQkJCQlzY3AuZGVhY3RpdmF0ZSgpOyAvLyBwYXJhIHF1ZSBubyBpbnZvcXVlIHJlZnJlc2hTZW1hbnRpYygpIGFsIGVsaW1pbmFyIGRlbCBkaWFncmFtYSB1bm8gZGUgbG9zIG9iamV0b3MNCg0KIAkJCQkJDQoJICAgICAgICAJCS8vIE5vIHB1ZWRvIGNlcnJhciBlbCBkaWFncmFtYSBwb3JxdWUgbm8gc2UgY3JlYW4gbGFzIHZpZXdzISEhIHkgcGllcmRvIGxhIHBlcnNwZWN0aXZhDQoJICAgICAgICAJCURhd25BcmdEaWFncmFtRWRpdG9yIGRhd25FZGl0b3JQYXJ0ID0gKERhd25BcmdEaWFncmFtRWRpdG9yKWVkaXRvclBhcnQ7DQoJICAgICAgICAJCWRhd25FZGl0b3JQYXJ0LmRvU2F2ZShtb25pdG9yKTsNCg0KDQoJICAgICAgICAJCWlmKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9yKSB7DQoJICAgICAgICAJCQlib29sZWFuIHNhdmUgPSB0cnVlOw0KDQoJICAgICAgICAJICAgICAgICB0cnkgew0KCSAgICAgICAgICAgIAkJCURpYWdyYW1FZGl0b3IgZGVkaXRvciA9IChEaWFncmFtRWRpdG9yKWVkaXRvclBhcnQ7DQoJICAgICAgICAgICAgCQkJZGVkaXRvci5nZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKGRlZGl0b3IsIHNhdmUpOyAvL01DUCBjb21lbnRhciBwYXJhIHZlciBlbCByZXN1bHRhZG8gKHZpZXdzIHRlbXBvcmFsZXMpDQoJICAgICAgICAJICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgew0KCSAgICAgICAgCSAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJICAgICAgICAJICAgICAgICB9ICAgICAgCQkJDQoJICAgICAgICAJCX0NCgkJCQl9CQkJCQ0KCQkJCS8vIEVuZCBNQ1ANCgkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsNCgkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJfQ0KCQl9DQoJfQ0KCQ0KCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVEaWFncmFtKFVSSSBkaWFncmFtVVJJLCBVUkkgbW9kZWxVUkksDQoJCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gRGF3bkdNRkVkaXRpbmdEb21haW5GYWN0b3J5DQoJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOw0KDQoJCXByb2dyZXNzTW9uaXRvcg0KCQkJCS5iZWdpblRhc2soDQoJCQkJCQlNZXNzYWdlcy5BcmdEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrLA0KCQkJCQkJMyk7DQoNCgkJLyoNCgkJQ0RPQ29ubmVjdGlvblV0aWwuaW5zdGFuY2UuaW5pdCgNCgkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFJlcG9zaXRvcnlOYW1lKCksDQoJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcm90b2NvbCgpLA0KCQkJCVByZWZlcmVuY2VDb25zdGFudHMuZ2V0U2VydmVyTmFtZSgpKTsNCgkJQ0RPQ29ubmVjdGlvblV0aWwuaW5zdGFuY2UuZ2V0Q3VycmVudFNlc3Npb24oKTsNCgkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7DQoNCgkJQ0RPVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBDRE9Db25uZWN0aW9uVXRpbC5pbnN0YW5jZQ0KCQkJCS5vcGVuQ3VycmVudFRyYW5zYWN0aW9uKHJlc291cmNlU2V0LCBkaWFncmFtVVJJLnRvU3RyaW5nKCkpOw0KDQoJCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKGRpYWdyYW1VUkkpOw0KCQkqLw0KCQlTdHJpbmcgZGlhZ3JhbVJlc291cmNlU3RyID0gZGlhZ3JhbVVSSS50b1N0cmluZygpLnN1YnN0cmluZygiY2RvOi8vb3BlbmNlcnQiLmxlbmd0aCgpLCBkaWFncmFtVVJJLnRvU3RyaW5nKCkubGVuZ3RoKCkpOw0KCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSB0cmFuc2FjdGlvbi5nZXRPckNyZWF0ZVJlc291cmNlKGRpYWdyYW1SZXNvdXJjZVN0cik7DQoNCgkJQ3JlYXRlU2VtYW50aWNSZXNvdXJjZVJlY29yZGluZ0NvbW1hbmQgY3JlYXRlU2VtYW50aWNSZXNvdXJjZUNvbW1hbmQgPSBuZXcgQ3JlYXRlU2VtYW50aWNSZXNvdXJjZVJlY29yZGluZ0NvbW1hbmQoDQoJCQkJZWRpdGluZ0RvbWFpbiwgdHJhbnNhY3Rpb24sIG1vZGVsVVJJLnBhdGgoKSk7DQoNCgkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNyZWF0ZVNlbWFudGljUmVzb3VyY2VDb21tYW5kKTsNCgkJZmluYWwgUmVzb3VyY2UgbW9kZWxSZXNvdXJjZSA9IGNyZWF0ZVNlbWFudGljUmVzb3VyY2VDb21tYW5kDQoJCQkJLmdldFJlc291cmNlKCk7DQoNCgkJZmluYWwgU3RyaW5nIGRpYWdyYW1OYW1lID0gZGlhZ3JhbVVSSS5sYXN0U2VnbWVudCgpOw0KCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCgkJCQllZGl0aW5nRG9tYWluLA0KCQkJCU1lc3NhZ2VzLkFyZ0RpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWwsDQoJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgew0KCQkJQE92ZXJyaWRlDQoJCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KA0KCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCgkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQoJCQkJRU9iamVjdCBtb2RlbCA9IG51bGw7DQoJCQkJaWYgKG1vZGVsUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCkgPiAwKSB7DQoJCQkJCW1vZGVsID0gbW9kZWxSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQltb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOw0KCQkJCQlhdHRhY2hNb2RlbFRvUmVzb3VyY2UobW9kZWwsIG1vZGVsUmVzb3VyY2UpOw0KCQkJCX0NCg0KCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obW9kZWwsDQoJCQkJCQlEYXduQ2FzZUVkaXRQYXJ0X01PREVMX0lELA0KCQkJCQkJQXJnRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOw0KCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsNCgkJCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOw0KCQkJCQlkaWFncmFtLnNldE5hbWUoZGlhZ3JhbU5hbWUpOw0KCQkJCQlkaWFncmFtLnNldEVsZW1lbnQobW9kZWwpOw0KCQkJCX0NCg0KCQkJCXRyeSB7DQoJCQkJCW1vZGVsUmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOw0KCQkJCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOw0KCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJQXJnRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KCQkJCQkJCSJVbmFibGUgdG8gc3RvcmUgbW9kZWwgYW5kIGRpYWdyYW0gcmVzb3VyY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQNCgkJCQl9DQoNCgkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsNCgkJCX0NCgkJfTsNCgkJdHJ5IHsNCgkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsDQoJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSwgbnVsbCk7DQoJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7DQoJCQlBcmdEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQoJCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQNCgkJfQ0KCQlzZXRDaGFyc2V0KFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG1vZGVsUmVzb3VyY2UpKTsNCgkJc2V0Q2hhcnNldChXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpKTsNCgkJcmV0dXJuIGRpYWdyYW1SZXNvdXJjZTsNCgl9DQoNCglwcml2YXRlIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsNCgkJcmV0dXJuIEFyZ0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2UoKTsNCgl9DQoNCglwcml2YXRlIHN0YXRpYyB2b2lkIGF0dGFjaE1vZGVsVG9SZXNvdXJjZShFT2JqZWN0IG1vZGVsLCBSZXNvdXJjZSByZXNvdXJjZSkgew0KCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChtb2RlbCk7DQoJfQ0KCQ0KCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRGlhZ3JhbShSZXNvdXJjZSBkaWFncmFtKQ0KCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsNCgkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCgkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOw0KCQlyZXR1cm4gbnVsbCAhPSBwYWdlLm9wZW5FZGl0b3IobmV3IERhd25FZGl0b3JJbnB1dChkaWFncmFtLmdldFVSSSgpKSwNCgkJCQlEYXduQXJnRGlhZ3JhbUVkaXRvcl9JRCk7DQoJfQ0KCQ0KCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyc2V0KElGaWxlIGZpbGUpIHsNCgkJaWYgKGZpbGUgPT0gbnVsbCkgew0KCQkJcmV0dXJuOw0KCQl9DQoJCXRyeSB7DQoJCQlmaWxlLnNldENoYXJzZXQoIlVURi04IiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQNCgkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQoJCQlBcmdEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQoJCQkJCSJVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGZpbGUgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQNCgkJfQ0KCX0NCn0NCi8vIEVuZCBNQ1A=