LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwueG1sOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwubGF1bmNoaW5nLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7CgovKioKICogQGF1dGhvciBOYWNpIERhaQogKgogKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCiAqLwpwdWJsaWMgY2xhc3MgU2VydmVyQWRtaW5Ub29sIHsKCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE5PTkUgPSAwOwoJZmluYWwgcHVibGljIHN0YXRpYyBpbnQgV0VCID0gMTsKCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVKQiA9IDI7CglmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFQVIgPSAzOwoKCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PVERFRklORUQgPSAiPE5PVCBERUZJTkVEPiI7CglmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZJTkVEID0gIjxERUZJTkVEPiI7Cglwcml2YXRlIFN0cmluZyBtYWluQ2xhc3M7CgoJcHVibGljIGNsYXNzIE1vZHVsZSB7CgoJCXByaXZhdGUgaW50IHR5cGUgPSAtMTsKCQlwcml2YXRlIFN0cmluZyBkZXBsb3kgPSAiIjsKCQlwcml2YXRlIFN0cmluZyB1bmRlcGxveSA9ICIiOwoJCXByaXZhdGUgTW9kdWxlIHdlYk1vZHVsZXMgPSBudWxsOwoJCXByaXZhdGUgTW9kdWxlIGVqYk1vZHVsZXMgPSBudWxsOwoJCS8qKgoJCSAqIEByZXR1cm4KCQkgKi8KCQlwdWJsaWMgU3RyaW5nIGdldERlcGxveSgpIHsKCQkJcmV0dXJuIGRlcGxveTsKCQl9CgoJCS8qKgoJCSAqIEByZXR1cm4KCQkgKi8KCQlwdWJsaWMgTW9kdWxlIGdldEVqYk1vZHVsZXMoKSB7CgkJCXJldHVybiBlamJNb2R1bGVzOwoJCX0KCgkJLyoqCgkJICogQHJldHVybgoJCSAqLwoJCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKCQkJcmV0dXJuIHR5cGU7CgkJfQoKCQkvKioKCQkgKiBAcmV0dXJuCgkJICovCgkJcHVibGljIFN0cmluZyBnZXRVbmRlcGxveSgpIHsKCQkJcmV0dXJuIHVuZGVwbG95OwoJCX0KCgkJLyoqCgkJICogQHJldHVybgoJCSAqLwoJCXB1YmxpYyBNb2R1bGUgZ2V0V2ViTW9kdWxlcygpIHsKCQkJcmV0dXJuIHdlYk1vZHVsZXM7CgkJfQoKCQkvKioKCQkgKiBAcGFyYW0gc3RyaW5nCgkJICovCgkJcHVibGljIHZvaWQgc2V0RGVwbG95KFN0cmluZyBzdHJpbmcpIHsKCQkJaWYgKHN0cmluZyA9PSBudWxsKQoJCQkJZGVwbG95ID0gIiI7CgkJCWVsc2UKCQkJCWRlcGxveSA9IHN0cmluZzsKCQl9CgoJCS8qKgoJCSAqIEBwYXJhbSBzdHJpbmcKCQkgKi8KCQlwdWJsaWMgdm9pZCBzZXRFamJNb2R1bGVzKE1vZHVsZSBtb2QpIHsKCQkJZWpiTW9kdWxlcyA9IG1vZDsKCQl9CgoJCS8qKgoJCSAqIEBwYXJhbSBpCgkJICovCgkJcHVibGljIHZvaWQgc2V0VHlwZShpbnQgaSkgewoJCQl0eXBlID0gaTsKCQl9CgoJCS8qKgoJCSAqIEBwYXJhbSBzdHJpbmcKCQkgKi8KCQlwdWJsaWMgdm9pZCBzZXRVbmRlcGxveShTdHJpbmcgc3RyaW5nKSB7CgkJCWlmIChzdHJpbmcgPT0gbnVsbCkKCQkJCXVuZGVwbG95ID0gIiI7CgkJCWVsc2UKCQkJCXVuZGVwbG95ID0gc3RyaW5nOwoJCX0KCgkJLyoqCgkJICogQHBhcmFtIHN0cmluZwoJCSAqLwoJCXB1YmxpYyB2b2lkIHNldFdlYk1vZHVsZXMoTW9kdWxlIG1vZCkgewoJCQl3ZWJNb2R1bGVzID0gbW9kOwoJCX0KCgl9CgoJcHJpdmF0ZSBNb2R1bGUgd2ViOwoJcHJpdmF0ZSBNb2R1bGUgZWpiOwoJcHJpdmF0ZSBNb2R1bGUgZWFyOwoJcHJpdmF0ZSBib29sZWFuIGRlZmluZWQgPSBmYWxzZTsKCglwcml2YXRlIEFycmF5TGlzdCB0b29sQ2xhc3NQYXRoOwoJcHJpdmF0ZSBTZXJ2ZXJUeXBlRGVmaW5pdGlvbiBkZWZpbml0aW9uOwoKCXB1YmxpYyBTZXJ2ZXJBZG1pblRvb2woU2VydmVyVHlwZURlZmluaXRpb24gZGVmKSB7CgkJbWFpbkNsYXNzID0gTk9UREVGSU5FRDsKCQlkZWZpbml0aW9uID0gZGVmOwoJCXRvb2xDbGFzc1BhdGggPSBuZXcgQXJyYXlMaXN0KCk7CgkJd2ViID0gbmV3IE1vZHVsZSgpOwoJCXdlYi5zZXRUeXBlKFdFQik7CgkJZWpiID0gbmV3IE1vZHVsZSgpOwoJCWVqYi5zZXRUeXBlKEVKQik7CgkJZWFyID0gbmV3IE1vZHVsZSgpOwoJCWVhci5zZXRUeXBlKEVKQik7CgkJZWFyLnNldFdlYk1vZHVsZXMobmV3IE1vZHVsZSgpKTsKCQllYXIuc2V0RWpiTW9kdWxlcyhuZXcgTW9kdWxlKCkpOwoKCX0KCglwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJDbGFzc3BhdGgoQ2xhc3NwYXRoSXRlbSBjbGFzc3BhdGhJdGVtKSB7CgkJdGhpcy5nZXRUb29sQ2xhc3NQYXRoKCkuYWRkKGNsYXNzcGF0aEl0ZW0pOwoJfQoKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCgkgKi8KCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CgkJU3RyaW5nIHhtbCA9ICIiOwoJCXhtbAoJCQkrPSAoIlxuPGFkbWluVG9vbD4iCgkJCQkrICJcblx0PHdlYj4iCgkJCQkrICh0aGlzLmdldFdlYigpLmdldERlcGxveSgpLmxlbmd0aCgpID4gMAoJCQkJCT8gIlxuXHRcdDxkZXBsb3k+PCFbQ0RBVEFbIgoJCQkJCQkrIHRoaXMuZ2V0V2ViKCkuZ2V0RGVwbG95KCkKCQkJCQkJKyAiXV0+PC9kZXBsb3k+IgoJCQkJCTogIjxkZXBsb3kgLz4iKQoJCQkJKyAodGhpcy5nZXRXZWIoKS5nZXRVbmRlcGxveSgpLmxlbmd0aCgpID4gMAoJCQkJCT8gIlxuXHRcdDx1bmRlcGxveT48IVtDREFUQVsiCgkJCQkJCSsgdGhpcy5nZXRXZWIoKS5nZXRVbmRlcGxveSgpCgkJCQkJCSsgIl1dPjwvdW5kZXBsb3k+IgoJCQkJCTogIjx1bmRlcGxveSAvPiIpCgkJCQkrICJcblx0PC93ZWI+IgoJCQkJKyAiXG5cdDxlamI+IgoJCQkJKyAodGhpcy5nZXRFamIoKS5nZXREZXBsb3koKS5sZW5ndGgoKSA+IDAKCQkJCQk/ICJcblx0XHQ8ZGVwbG95PjwhW0NEQVRBWyIKCQkJCQkJKyB0aGlzLmdldEVqYigpLmdldERlcGxveSgpCgkJCQkJCSsgIl1dPjwvZGVwbG95PiIKCQkJCQk6ICI8ZGVwbG95IC8+IikKCQkJCSsgKHRoaXMuZ2V0RWpiKCkuZ2V0VW5kZXBsb3koKS5sZW5ndGgoKSA+IDAKCQkJCQk/ICJcblx0XHQ8dW5kZXBsb3k+PCFbQ0RBVEFbIgoJCQkJCQkrIHRoaXMuZ2V0RWpiKCkuZ2V0VW5kZXBsb3koKQoJCQkJCQkrICJdXT48L3VuZGVwbG95PiIKCQkJCQk6ICI8dW5kZXBsb3kgLz4iKQoJCQkJKyAiXG5cdDwvZWpiPiIKCQkJCSsgIlxuXHQ8ZWFyPiIKCQkJCSsgKHRoaXMuZ2V0RWFyKCkuZ2V0RGVwbG95KCkubGVuZ3RoKCkgPiAwCgkJCQkJPyAiXG5cdFx0PGRlcGxveT48IVtDREFUQVsiCgkJCQkJCSsgdGhpcy5nZXRFYXIoKS5nZXREZXBsb3koKQoJCQkJCQkrICJdXT48L2RlcGxveT4iCgkJCQkJOiAiPGRlcGxveSAvPiIpCgkJCQkrICh0aGlzLmdldEVhcigpLmdldFVuZGVwbG95KCkubGVuZ3RoKCkgPiAwCgkJCQkJPyAiXG5cdFx0PHVuZGVwbG95PjwhW0NEQVRBWyIKCQkJCQkJKyB0aGlzLmdldEVhcigpLmdldFVuZGVwbG95KCkKCQkJCQkJKyAiXV0+PC91bmRlcGxveT4iCgkJCQkJOiAiPHVuZGVwbG95IC8+IikKCQkJCSsgIlxuXHRcdDx3ZWJNb2R1bGU+IgoJCQkJKyAodGhpcy5nZXRFYXIoKS5nZXRXZWJNb2R1bGVzKCkuZ2V0RGVwbG95KCkubGVuZ3RoKCkgPiAwCgkJCQkJPyAiXG5cdFx0XHQ8ZGVwbG95PjwhW0NEQVRBWyIKCQkJCQkJKyB0aGlzLmdldEVhcigpLmdldFdlYk1vZHVsZXMoKS5nZXREZXBsb3koKQoJCQkJCQkrICJdXT48L2RlcGxveT4iCgkJCQkJOiAiPGRlcGxveSAvPiIpCgkJCQkrICh0aGlzLmdldEVhcigpLmdldFdlYk1vZHVsZXMoKS5nZXRVbmRlcGxveSgpLmxlbmd0aCgpID4gMAoJCQkJCT8gIlxuXHRcdFx0PHVuZGVwbG95PjwhW0NEQVRBWyIKCQkJCQkJKyB0aGlzLmdldEVhcigpLmdldFdlYk1vZHVsZXMoKS5nZXRVbmRlcGxveSgpCgkJCQkJCSsgIl1dPjwvdW5kZXBsb3k+IgoJCQkJCTogIjx1bmRlcGxveSAvPiIpCgkJCQkrICJcblx0XHQ8L3dlYk1vZHVsZT4iCgkJCQkrICJcblx0XHQ8ZWpiTW9kdWxlPiIKCQkJCSsgKHRoaXMuZ2V0RWFyKCkuZ2V0RWpiTW9kdWxlcygpLmdldERlcGxveSgpLmxlbmd0aCgpID4gMAoJCQkJCT8gIlxuXHRcdFx0PGRlcGxveT48IVtDREFUQVsiCgkJCQkJCSsgdGhpcy5nZXRFYXIoKS5nZXRFamJNb2R1bGVzKCkuZ2V0RGVwbG95KCkKCQkJCQkJKyAiXV0+PC9kZXBsb3k+IgoJCQkJCTogIjxkZXBsb3kgLz4iKQoJCQkJKyAodGhpcy5nZXRFYXIoKS5nZXRFamJNb2R1bGVzKCkuZ2V0VW5kZXBsb3koKS5sZW5ndGgoKSA+IDAKCQkJCQk/ICJcblx0XHRcdDx1bmRlcGxveT48IVtDREFUQVsiCgkJCQkJCSsgdGhpcy5nZXRFYXIoKS5nZXRFamJNb2R1bGVzKCkuZ2V0VW5kZXBsb3koKQoJCQkJCQkrICJdXT48L3VuZGVwbG95PiIKCQkJCQk6ICI8dW5kZXBsb3kgLz4iKQoJCQkJKyAiXG5cdFx0PC9lamJNb2R1bGU+IgoJCQkJKyAiXG5cdDwvZWFyPiIKCQkJCSsgIlxuPC9hZG1pblRvb2w+Iik7CgoJCXhtbCArPSAiXG48YWRtaW5Ub29sUGF0aD4iOwoJCUl0ZXJhdG9yIHByb3BzID0gdGhpcy5nZXRUb29sQ2xhc3NQYXRoKCkuaXRlcmF0b3IoKTsKCQl3aGlsZSAocHJvcHMuaGFzTmV4dCgpKSB7CgkJCXhtbCArPSAiXG5cdCIgKyBwcm9wcy5uZXh0KCkudG9TdHJpbmcoKTsKCQl9CgkJeG1sICs9ICJcbjwvYWRtaW5Ub29sUGF0aD4iOwoKCQlyZXR1cm4geG1sOwoKCX0KCgkvKioKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIGJvb2xlYW4gaXNEZWZpbmVkKCkgewoJCXJldHVybiBkZWZpbmVkOwoJfQoKCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzcGF0aChJSmF2YVByb2plY3QgcHJvaikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCUl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmdldFRvb2xDbGFzc1BhdGgoKS5pdGVyYXRvcigpOwoJCUFycmF5TGlzdCBuZXdQYXRoID0gbmV3IEFycmF5TGlzdCgpOwoJCVN0cmluZyBjcCA9ICIiOwoJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewoJCQlDbGFzc3BhdGhJdGVtIGVsZW1lbnQgPSAoQ2xhc3NwYXRoSXRlbSkgaXRlci5uZXh0KCk7CgkJCVN0cmluZyBsaWIgPQoJCQkJdGhpcy5kZWZpbml0aW9uLnJlc29sdmVQcm9wZXJ0aWVzKGVsZW1lbnQuZ2V0Q2xhc3NwYXRoKCkpOwoJCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0VHlwZSgpKSB7CgkJCQljYXNlIENsYXNzcGF0aEl0ZW0uVkFSSUFCTEUgOgoJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9CgkJCQkJCUphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkobmV3IFBhdGgobGliKSwgbnVsbCwgbnVsbCk7CgkJCQkJUnVudGltZUNsYXNzcGF0aEVudHJ5IHJlbnRyeSA9CgkJCQkJCW5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnkoZW50cnkpOwoJCQkJCW5ld1BhdGguYWRkKHJlbnRyeSk7CgkJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdCA6CgkJCQkJSUNsYXNzcGF0aEVudHJ5IGxlbnRyeSA9CgkJCQkJCUphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChsaWIpLCBudWxsLCBudWxsKTsKCQkJCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgbHJlbnRyeSA9CgkJCQkJCW5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnkobGVudHJ5KTsKCQkJCQluZXdQYXRoLmFkZChscmVudHJ5KTsKCQkJCQlicmVhazsKCQkJfQoJCX0KCgkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIHJlc3VsdExpc3QgPQoJCQkoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSBuZXdQYXRoLnRvQXJyYXkoCgkJCQluZXcgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtuZXdQYXRoLnNpemUoKV0pOwoJCS8vIDEuIHJlbW92ZSBib290cGF0aCBlbnRyaWVzCgkJLy8gMi4gcmVzb2x2ZSAmIHRyYW5zbGF0ZSB0byBsb2NhbCBmaWxlIHN5c3RlbSBwYXRocwoJCUxpc3QgcmVzb2x2ZWQgPSBuZXcgQXJyYXlMaXN0KHJlc3VsdExpc3QubGVuZ3RoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExpc3QubGVuZ3RoOyBpKyspIHsKCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IHJlc3VsdExpc3RbaV07CgkJCWlmIChlbnRyeS5nZXRDbGFzc3BhdGhQcm9wZXJ0eSgpCgkJCQk9PSBJUnVudGltZUNsYXNzcGF0aEVudHJ5LlVTRVJfQ0xBU1NFUykgewoJCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPQoJCQkJCUphdmFSdW50aW1lLnJlc29sdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoZW50cnksIHByb2opOwoJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7CgkJCQkJU3RyaW5nIGxvY2F0aW9uID0gZW50cmllc1tqXS5nZXRMb2NhdGlvbigpOwoJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7CgkJCQkJCXJlc29sdmVkLmFkZChsb2NhdGlvbik7CgkJCQkJCWNwICs9IGxvY2F0aW9uICsgRmlsZS5wYXRoU2VwYXJhdG9yOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQkvL3JldHVybiAoU3RyaW5nW10pcmVzb2x2ZWQudG9BcnJheShuZXcgU3RyaW5nW3Jlc29sdmVkLnNpemUoKV0pOwoJCXJldHVybiBjcDsKCgl9CgoJLyoqCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkgewoJCXJldHVybiBkZWZpbml0aW9uOwoJfQoKCS8qKgoJICogQHJldHVybgoJICovCglwdWJsaWMgTW9kdWxlIGdldEVhcigpIHsKCQlyZXR1cm4gZWFyOwoJfQoKCS8qKgoJICogQHJldHVybgoJICovCglwdWJsaWMgTW9kdWxlIGdldEVqYigpIHsKCQlyZXR1cm4gZWpiOwoJfQoKCS8qKgoJICogQHJldHVybgoJICovCglwdWJsaWMgU3RyaW5nIGdldE1haW5DbGFzcygpIHsKCQlyZXR1cm4gbWFpbkNsYXNzOwoJfQoKCS8qKgoJICogQHJldHVybgoJICovCglwdWJsaWMgQXJyYXlMaXN0IGdldFRvb2xDbGFzc1BhdGgoKSB7CgkJcmV0dXJuIHRvb2xDbGFzc1BhdGg7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBNb2R1bGUgZ2V0V2ViKCkgewoJCXJldHVybiB3ZWI7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gZGVmaW5pdGlvbgoJICovCglwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKFNlcnZlclR5cGVEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKCQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwoJfQoKCS8qKgoJICogQHBhcmFtIG1vZHVsZQoJICovCglwdWJsaWMgdm9pZCBzZXRFYXIoTW9kdWxlIG1vZHVsZSkgewoJCWVhciA9IG1vZHVsZTsKCX0KCgkvKioKCSAqIEBwYXJhbSBtb2R1bGUKCSAqLwoJcHVibGljIHZvaWQgc2V0RWpiKE1vZHVsZSBtb2R1bGUpIHsKCQllamIgPSBtb2R1bGU7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gc3RyaW5nCgkgKi8KCXB1YmxpYyB2b2lkIHNldE1haW5DbGFzcyhTdHJpbmcgc3RyaW5nKSB7CgkJbWFpbkNsYXNzID0gc3RyaW5nOwoJfQoKCS8qKgoJICogQHBhcmFtIGxpc3QKCSAqLwoJcHVibGljIHZvaWQgc2V0VG9vbENsYXNzUGF0aChBcnJheUxpc3QgbGlzdCkgewoJCXRvb2xDbGFzc1BhdGggPSBsaXN0OwoJfQoKCS8qKgoJICogQHBhcmFtIG1vZHVsZQoJICovCglwdWJsaWMgdm9pZCBzZXRXZWIoTW9kdWxlIG1vZHVsZSkgewoJCXdlYiA9IG1vZHVsZTsKCX0KCgkvKioKCSAqIEBwYXJhbSBiCgkgKi8KCXB1YmxpYyB2b2lkIHNldERlZmluZWQoYm9vbGVhbiBiKSB7CgkJZGVmaW5lZCA9IGI7Cgl9Cgp9Cg==