LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIE5hY2kgTS4gRGFpCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKCmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7CgovKioKICogQSBzZXJ2ZXJEZWZpbml0aW9uVHlwZSBhd2FyZSB3aXphcmQgZm9yIGRlZmluaW5nIHJ1bnRpbWVzLgogKiAKICogQGF1dGhvciBHb3JrZW0gRXJjYW4KICovCnB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50IHsKCQoJcHJpdmF0ZSBTZXJ2ZXJUeXBlRGVmaW5pdGlvbkdyb3VwIGZTZXJ2ZXJQYW5lbDsKCXByaXZhdGUgUnVudGltZURlbGVnYXRlIGZSdW50aW1lRGVsZWdhdGU7CiAgICBwcml2YXRlIE1hcCBmU2VydmVyUnVudGltZVByb3BlcnRpZXM7CgkKCS8qKgoJICogQ29uc3RydWN0b3IKCSAqLwoJcHVibGljIEdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSB7CgkJc3VwZXIoKTsKCX0KCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEZyYWdtZW50I2lzQ29tcGxldGUoKQoJICovCglwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewoJICAJUnVudGltZURlbGVnYXRlIHJ1bnRpbWUgPSBnZXRSdW50aW1lRGVsZWdhdGUoKTsKCQlpZiAocnVudGltZSA9PSBudWxsKQoJCQlyZXR1cm4gZmFsc2U7CgkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKCk7CgkJcmV0dXJuIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuaXNPSygpKTsKCX0KCQoJcHVibGljIHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSkgewoJCWNyZWF0ZVNlcnZlckRlZmluaXRpb25UeXBlQ29tcG9zaXRlKHBhcmVudCk7Cgl9CgoJCgoJLyoqCiAgICAgKiBAcGFyYW0gc2VsZWN0ZWQKICAgICAqLwogICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcnZlckRlZmluaXRpb25UeXBlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsgICAgIAogICAgICAgIE1hcCBwcm9wZXJ0aWVzPSBudWxsOwoJCVNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbj1udWxsOwogICAgICAgIGlmKGdldFJ1bnRpbWVEZWxlZ2F0ZSgpIT1udWxsKQoJCXsKCQkJcHJvcGVydGllcyA9IGdldFJ1bnRpbWVEZWxlZ2F0ZSgpLmdldEF0dHJpYnV0ZShHZW5lcmljU2VydmVyUnVudGltZS5TRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUywoTWFwKW51bGwpOwoJCQlkZWZpbml0aW9uID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb24oZ2V0U2VydmVyRGVmaW5pdGlvbklkKCkscHJvcGVydGllcyk7CgkJfQoJCWZTZXJ2ZXJQYW5lbCA9IG5ldyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbkdyb3VwKHRoaXMsZGVmaW5pdGlvbixTZXJ2ZXJUeXBlRGVmaW5pdGlvbkdyb3VwLkNPTlRFWFRfUlVOVElNRSxwcm9wZXJ0aWVzLHBhcmVudCk7CiAgICB9CgkKCXByaXZhdGUgU3RyaW5nIGdldFNlcnZlckRlZmluaXRpb25JZCgpCgl7CgkJU3RyaW5nIGN1cnJlbnREZWZpbml0aW9uPSBudWxsOwoJCWlmKGdldFJ1bnRpbWVEZWxlZ2F0ZSgpIT1udWxsKQoJCQljdXJyZW50RGVmaW5pdGlvbiA9ICBnZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwoJCWlmKGN1cnJlbnREZWZpbml0aW9uIT0gbnVsbCAmJiBjdXJyZW50RGVmaW5pdGlvbi5sZW5ndGgoKT4wKQoJCXsJCgkJCXJldHVybiBjdXJyZW50RGVmaW5pdGlvbjsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgkKCQoJCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRGcmFnbWVudCNlbnRlcigpCgkgKi8KCXB1YmxpYyB2b2lkIGVudGVyKCkgewoJCQogICAgICAgIFN0cmluZyBzZXJ2ZXJEZWZpbml0aW9uID0gZ2V0U2VydmVyRGVmaW5pdGlvbklkKCk7CgkJaWYoc2VydmVyRGVmaW5pdGlvbiE9bnVsbCAmJiBzZXJ2ZXJEZWZpbml0aW9uLmxlbmd0aCgpPjApCgkJewoJCSAgICBNYXAgcHJvcGVydGllcyA9IG51bGw7CgkgICAgICAgIGlmIChnZXRSdW50aW1lRGVsZWdhdGUoKSAhPSBudWxsKSB7CgkgICAgICAgICAgICBwcm9wZXJ0aWVzID0gZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0QXR0cmlidXRlKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLlNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTLChNYXApIG51bGwpOwoJICAgICAgICB9CgkgICAgICAgIFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uKHNlcnZlckRlZmluaXRpb24scHJvcGVydGllcyk7CgkgICAgICAgIGlmKGZTZXJ2ZXJQYW5lbCE9bnVsbCkKCQkJCWZTZXJ2ZXJQYW5lbC5yZXNldChkZWZpbml0aW9uLFNlcnZlclR5cGVEZWZpbml0aW9uR3JvdXAuQ09OVEVYVF9SVU5USU1FLCBwcm9wZXJ0aWVzKTsKCQl9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgcG9wdWxhdGVSdW50aW1lRGVsZWdhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHZhbGlkYXRlKCk7Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEZyYWdtZW50I2V4aXQoKQoJICovCglwdWJsaWMgdm9pZCBleGl0KCkgewoJICAgIHRyeSB7CgkJCXBvcHVsYXRlUnVudGltZURlbGVnYXRlUHJvcGVydGllcygpOyAKCSAgICAgICAgZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkuc2F2ZSh0cnVlLG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwoJICAgIH0KCSAgICBjYXRjaChFeGNlcHRpb24gZSl7Ly91bmhhbmRsZWQKCSAgICB9CiAgICAgICAgZlJ1bnRpbWVEZWxlZ2F0ZT1udWxsOwogICB9CgoJcHJvdGVjdGVkIE1hcCBnZXRTZXJ2ZXJSdW50aW1lUHJvcGVydGllcygpewoJICAgIHJldHVybiBmU2VydmVyUnVudGltZVByb3BlcnRpZXM7IAoJfQoKCXByaXZhdGUgU3RyaW5nIGNyZWF0ZU5hbWUoKQoJewoJICAgIFJ1bnRpbWVEZWxlZ2F0ZSBkbCA9IGdldFJ1bnRpbWVEZWxlZ2F0ZSgpOwoJICAgIElSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IGRsLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpOwoJICAgIFN0cmluZyBuYW1lID0gR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJydW50aW1lTmFtZSIsIG5ldyBTdHJpbmdbXSB7cnVudGltZVR5cGUuZ2V0TmFtZSgpfSk7CgkJSVJ1bnRpbWVbXSBsaXN0ID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwoJCWludCBzdWZmaXggPSAxOwoJCVN0cmluZyBzdWZmaXhOYW1lPW5hbWU7CgkJZm9yKGludCBpPTA7aTxsaXN0Lmxlbmd0aDtpKyspCgkgICAgewoJICAgICAgICBpZihsaXN0W2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSl8fCBsaXN0W2ldLmdldE5hbWUoKS5lcXVhbHMoc3VmZml4TmFtZSkpCgkgICAgICAgICAgICBzdWZmaXgrKzsKCSAgICAgICAgc3VmZml4TmFtZT0gbmFtZSsiICIrc3VmZml4OwoJICAgIH0KCSAgICAKCQlpZihzdWZmaXg+MSkKCQkgICAgcmV0dXJuIHN1ZmZpeE5hbWU7CgkgICAgcmV0dXJuIG5hbWU7Cgl9CgkKCXByaXZhdGUgUnVudGltZURlbGVnYXRlIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpCgl7CgkJaWYoZlJ1bnRpbWVEZWxlZ2F0ZSA9PSBudWxsKQoJCXsJCgkJICAgIElSdW50aW1lV29ya2luZ0NvcHkgd2MgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSlnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7CgkJICAgIGlmKHdjPT1udWxsKQoJCSAgICAgICAgcmV0dXJuIG51bGw7CgkJICAgIGZSdW50aW1lRGVsZWdhdGUgPSAoUnVudGltZURlbGVnYXRlKXdjLmdldEFkYXB0ZXIoUnVudGltZURlbGVnYXRlLmNsYXNzKTsKCQl9CgkJcmV0dXJuIGZSdW50aW1lRGVsZWdhdGU7Cgl9CiAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC51aS5TZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQjZGVzY3JpcHRpb24oKQogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewogICAgICAgIFN0cmluZyByTmFtZSA9IGdldFJ1bnRpbWVOYW1lKCk7CiAgICAgICAgaWYock5hbWUgPT0gbnVsbCB8fCByTmFtZS5sZW5ndGgoKTwxKQogICAgICAgICAgICByTmFtZT0iR2VuZXJpYyI7ICAgICAgCiAgICAgICAgcmV0dXJuICBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoInJ1bnRpbWVXaXphcmREZXNjcmlwdGlvbiIsbmV3IFN0cmluZ1tdIHtyTmFtZX0pOwogICAgfQogICAgLyogKG5vbi1KYXZhZG9jKQogICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwudWkuU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50I3RpdGxlKCkKICAgICAqLwogICAgcHVibGljIFN0cmluZyB0aXRsZSgpIHsKICAgICAgICBTdHJpbmcgck5hbWUgPSBnZXRSdW50aW1lTmFtZSgpOwogICAgICAgIGlmKHJOYW1lID09IG51bGwgfHwgck5hbWUubGVuZ3RoKCk8MSkKICAgICAgICAgICAgck5hbWU9IkdlbmVyaWMiOwogICAgICAgcmV0dXJuIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygicnVudGltZVdpemFyZFRpdGxlIixuZXcgU3RyaW5nW117ck5hbWV9KTsKICAgIH0KICAgIAogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UnVudGltZU5hbWUoKQogICAgewogICAgICAgaWYoZ2V0UnVudGltZURlbGVnYXRlKCkhPW51bGwgJiYgZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZSgpIT1udWxsKQogICAgICAgICAgICByZXR1cm4gZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZSgpLmdldE5hbWUoKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIAogICAgLyogKG5vbi1KYXZhZG9jKQogICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwudWkuU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50I3NlcnZlckRlZmluaXRpb25UeXBlUHJvcGVydGllc0NoYW5nZWQoKQogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXJ2ZXJEZWZpbml0aW9uVHlwZVByb3BlcnRpZXNDaGFuZ2VkKCkgewoJCXBvcHVsYXRlUnVudGltZURlbGVnYXRlUHJvcGVydGllcygpOwoJCXZhbGlkYXRlKCk7CiAgIH0KICAgIC8qKgogICAgICogCiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVJ1bnRpbWVEZWxlZ2F0ZVByb3BlcnRpZXMoKSB7CiAgICAgICAKICAgICAgICBmU2VydmVyUnVudGltZVByb3BlcnRpZXMgPSBmU2VydmVyUGFuZWwuZ2V0UHJvcGVydGllcygpOwogICAgICAgIE1hcCBwcm9wZXJ0aWVzID0gZ2V0U2VydmVyUnVudGltZVByb3BlcnRpZXMoKTsKICAgICAgICBSdW50aW1lRGVsZWdhdGUgZGwgPSBnZXRSdW50aW1lRGVsZWdhdGUoKTsKICAgICAgICBkbC5zZXRBdHRyaWJ1dGUoR2VuZXJpY1NlcnZlclJ1bnRpbWUuU0VSVkVSX0RFRklOSVRJT05fSUQsIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwogICAgICAgIGRsLnNldEF0dHJpYnV0ZShHZW5lcmljU2VydmVyUnVudGltZS5TRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUyxwcm9wZXJ0aWVzKTsKICAgICAgICBkbC5nZXRSdW50aW1lV29ya2luZ0NvcHkoKS5zZXROYW1lKGNyZWF0ZU5hbWUoKSk7CiAgICB9CiAgICAKICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpCiAgICB7CgkJaWYgKGdldFJ1bnRpbWVEZWxlZ2F0ZSgpID09IG51bGwpIHsKCQkJdGhpcy5nZXRXaXphcmQoKS5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKCQkJcmV0dXJuOwoJCX0KCQlJU3RhdHVzIHN0YXR1cyA9IGdldFJ1bnRpbWVEZWxlZ2F0ZSgpLnZhbGlkYXRlKCk7CgkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc09LKCkpCgkJCWdldFdpemFyZCgpLnNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKCQllbHNlCgkJCWdldFdpemFyZCgpLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7CgkJZ2V0V2l6YXJkKCkudXBkYXRlKCk7CiAgICB9Cn0K