LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUxhdW5jaGFibGVBZGFwdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlB1Ymxpc2hTZXJ2ZXJKb2I7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC4qOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwppbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwovKioKICogU3VwcG9ydCBmb3Igc3RhcnRpbmcvc3RvcHBpbmcgc2VydmVyIGFuZCBjbGllbnRzIGZvciByZXNvdXJjZXMgcnVubmluZyBvbiBhIHNlcnZlci4KICovCnB1YmxpYyBjbGFzcyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGF1bmNoTW9kZXMgPSB7CgkJSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUsIElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSB9OwoKCXByb3RlY3RlZCBPYmplY3Qgc2VsZWN0aW9uOwoKCXByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKCglwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnbG9iYWxTZWxlY3Rpb247CgoJcHJvdGVjdGVkIHN0YXRpYyBNYXAgZ2xvYmFsTGF1bmNoTW9kZTsKCQoJcHJvdGVjdGVkIGJvb2xlYW4gdGFza3NSdW47CgoJLyoqCgkgKiBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCkgewoJCXN1cGVyKCk7Cgl9CgoJLyoqCgkgKiBEaXNwb3NlcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZS4gIFRoZSBpbXBsZW1lbnRvciBzaG91bGQgdW5ob29rIGFueSByZWZlcmVuY2VzCgkgKiB0byBpdHNlbGYgc28gdGhhdCBnYXJiYWdlIGNvbGxlY3Rpb24gY2FuIG9jY3VyLgoJICovCglwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewoJCXdpbmRvdyA9IG51bGw7Cgl9CgoJLyoqCgkgKiBJbml0aWFsaXplcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB3aXRoIHRoZSB3b3JrYmVuY2ggd2luZG93IGl0IHdpbGwgd29yayBpbi4KCSAqCgkgKiBAcGFyYW0gbmV3V2luZG93IHRoZSB3aW5kb3cgdGhhdCBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhpcyBkZWxlZ2F0ZQoJICovCglwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgbmV3V2luZG93KSB7CgkJd2luZG93ID0gbmV3V2luZG93OwoJfQoJCglwdWJsaWMgSVNlcnZlciBnZXRTZXJ2ZXIoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZ2V0RGVmYXVsdFNlcnZlcihtb2R1bGUpOwoJCQoJCS8vIGlnbm9yZSBwcmVmZXJlbmNlIGlmIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMgbW9kZS4KCQlpZiAoc2VydmVyICE9IG51bGwgJiYgIVNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlciwgbGF1bmNoTW9kZSkpCgkJCXNlcnZlciA9IG51bGw7CgkJCgkJaWYgKHNlcnZlciAhPSBudWxsICYmICFTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwgbW9kdWxlLCBtb25pdG9yKSkgewoJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKCQkJdHJ5IHsKCQkJCVNlcnZlclV0aWwubW9kaWZ5TW9kdWxlcyh3YywgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBuZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7CgkJCQl3Yy5zYXZlKGZhbHNlLCBtb25pdG9yKTsKCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGFkZCBtb2R1bGUgdG8gc2VydmVyIiwgY2UpOwoJCQkJc2VydmVyID0gbnVsbDsKCQkJfQoJCX0KCQkKCQlTaGVsbCBzaGVsbDsKCQlpZiAod2luZG93ICE9IG51bGwpCgkJCXNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7CgkJZWxzZQoJCQlzaGVsbCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKCgkJaWYgKHNlcnZlciA9PSBudWxsKSB7CgkJCS8vIHRyeSB0aGUgZnVsbCB3aXphcmQKCQkJUnVuT25TZXJ2ZXJXaXphcmQgd2l6YXJkID0gbmV3IFJ1bk9uU2VydmVyV2l6YXJkKG1vZHVsZSwgbGF1bmNoTW9kZSk7CgkJCUNsb3NhYmxlV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBDbG9zYWJsZVdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewoJCQkJbW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQl0cnkgewoJCQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmpvaW4oIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZmFtaWx5IiwgbnVsbCk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3Igd2FpdGluZyBmb3Igam9iIiwgZSk7CgkJCX0KCQkJc2VydmVyID0gd2l6YXJkLmdldFNlcnZlcigpOwoJCQlib29sZWFuIHByZWZlcnJlZCA9IHdpemFyZC5pc1ByZWZlcnJlZFNlcnZlcigpOwoJCQl0YXNrc1J1biA9IHRydWU7CgoJCQkvLyBzZXQgcHJlZmVycmVkIHNlcnZlciBpZiByZXF1ZXN0ZWQKCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHByZWZlcnJlZCkgewoJCQkJdHJ5IHsKCQkJCQlTZXJ2ZXJDb3JlLnNldERlZmF1bHRTZXJ2ZXIobW9kdWxlLCBzZXJ2ZXIsIG1vbml0b3IpOwoJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewoJCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVQcmVmZXJlbmNlOwoJCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSwgY2UuZ2V0U3RhdHVzKCkpOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXRyeSB7CgkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmZhbWlseSIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciB3YWl0aW5nIGZvciBqb2IiLCBlKTsKCQl9CgkJCgkJcmV0dXJuIHNlcnZlcjsKCX0KCgkvKioKCSAqIFJ1biB0aGUgcmVzb3VyY2Ugb24gYSBzZXJ2ZXIuCgkgKgoJICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKCSAqLwoJcHJvdGVjdGVkIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewoJCVN0cmluZyBsYXVuY2hNb2RlID0gZ2V0TGF1bmNoTW9kZSgpOwoJCUlNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCA9IFNlcnZlclBsdWdpbi5sb2FkTW9kdWxlQXJ0aWZhY3Qoc2VsZWN0aW9uKTsKCQkKCQlTaGVsbCBzaGVsbDsKCQlpZiAod2luZG93ICE9IG51bGwpCgkJCXNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7CgkJZWxzZQoJCQlzaGVsbCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKCgkJaWYgKG1vZHVsZUFydGlmYWN0ID09IG51bGwgfHwgbW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCkgPT0gbnVsbCkgewoJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoTWVzc2FnZXMuZXJyb3JOb01vZHVsZXMpOwoJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJObyBtb2R1bGVzIik7CgkJCXJldHVybjsKCQl9CgkJSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVBcnRpZmFjdC5nZXRNb2R1bGUoKTsKCgkJLy8gY2hlY2sgZm9yIHNlcnZlcnMgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgbW9kZQoJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CgkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwoJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplICYmICFmb3VuZDsgaSsrKSB7CgkJCQlpZiAoU2VydmVyVUlQbHVnaW4uaXNDb21wYXRpYmxlV2l0aExhdW5jaE1vZGUoc2VydmVyc1tpXSwgbGF1bmNoTW9kZSkpIHsKCQkJCQl0cnkgewoJCQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlcnNbaV0uZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKCQkJCQkJaWYgKHBhcmVudHMgIT0gbnVsbCAmJiBwYXJlbnRzLmxlbmd0aCA+IDApCgkJCQkJCQlmb3VuZCA9IHRydWU7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJLy8gaWdub3JlCgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoIWZvdW5kKSB7CgkJCS8vIG5vIGV4aXN0aW5nIHNlcnZlciBzdXBwb3J0cyB0aGUgcHJvamVjdCBhbmQgc3RhcnQgbW9kZSEKCQkJLy8gY2hlY2sgaWYgdGhlcmUgbWlnaHQgYmUgYW5vdGhlciBvbmUgdGhhdCBjYW4gYmUgY3JlYXRlZAoJCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwoJCQlib29sZWFuIGZvdW5kMiA9IGZhbHNlOwoJCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkgewoJCQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgJiYgIWZvdW5kMjsgaSsrKSB7CgkJCQkJSVNlcnZlclR5cGUgdHlwZSA9IHNlcnZlclR5cGVzW2ldOwoJCQkJCUlNb2R1bGVUeXBlW10gbW9kdWxlVHlwZXMgPSB0eXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKTsKCQkJCQlpZiAodHlwZS5zdXBwb3J0c0xhdW5jaE1vZGUobGF1bmNoTW9kZSkgJiYgU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShtb2R1bGVUeXBlcywgbW9kdWxlLmdldE1vZHVsZVR5cGUoKSkpIHsKCQkJCQkJZm91bmQyID0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKCFmb3VuZDIpIHsKCQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vU2VydmVyKTsKCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIk5vIHNlcnZlciBmb3Igc3RhcnQgbW9kZSIpOwoJCQkJcmV0dXJuOwoJCQl9CgkJfQoJCQoJCWlmICghU2VydmVyVUlQbHVnaW4uc2F2ZUVkaXRvcnMoKSkKCQkJcmV0dXJuOwoKCQl0YXNrc1J1biA9IGZhbHNlOwoJCUlTZXJ2ZXIgc2VydmVyID0gZ2V0U2VydmVyKG1vZHVsZSwgbGF1bmNoTW9kZSwgbW9uaXRvcik7CgkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQoJCQlyZXR1cm47CgkJCgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU2VydmVyOiAiICsgc2VydmVyKTsKCQkKCQlpZiAoc2VydmVyID09IG51bGwpIHsKCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKE1lc3NhZ2VzLmVycm9yTm9TZXJ2ZXIpOwoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJObyBzZXJ2ZXIgZm91bmQiKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5wcm9tcHRJZkRpcnR5KHNoZWxsLCBzZXJ2ZXIpKQoJCQlyZXR1cm47CgkJCgkJaWYgKCF0YXNrc1J1bikgewoJCQlTZWxlY3RUYXNrc1dpemFyZCB3aXphcmQgPSBuZXcgU2VsZWN0VGFza3NXaXphcmQoc2VydmVyKTsKCQkJd2l6YXJkLmFkZFBhZ2VzKCk7CgkJCWlmICh3aXphcmQuaGFzVGFza3MoKSAmJiB3aXphcmQuaGFzT3B0aW9uYWxUYXNrcygpKSB7CgkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpCgkJCQkJcmV0dXJuOwoJCQl9IGVsc2UKCQkJCXdpemFyZC5wZXJmb3JtRmluaXNoKCk7CgkJfQoJCQoJCS8vIGdldCB0aGUgbGF1bmNoYWJsZSBhZGFwdGVyIGFuZCBtb2R1bGUgb2JqZWN0CgkJSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyID0gbnVsbDsKCQlPYmplY3QgbGF1bmNoYWJsZSA9IG51bGw7CgkJSUxhdW5jaGFibGVBZGFwdGVyW10gYWRhcHRlcnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TGF1bmNoYWJsZUFkYXB0ZXJzKCk7CgkJaWYgKGFkYXB0ZXJzICE9IG51bGwpIHsKCQkJaW50IHNpemUyID0gYWRhcHRlcnMubGVuZ3RoOwoJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKCQkJCUlMYXVuY2hhYmxlQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlcnNbal07CgkJCQl0cnkgewoJCQkJCU9iamVjdCBsYXVuY2hhYmxlMiA9IGFkYXB0ZXIuZ2V0TGF1bmNoYWJsZShzZXJ2ZXIsIG1vZHVsZUFydGlmYWN0KTsKCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJhZGFwdGVyPSAiICsgYWRhcHRlciArICIsIGxhdW5jaGFibGU9ICIgKyBsYXVuY2hhYmxlMik7CgkJCQkJaWYgKGxhdW5jaGFibGUyICE9IG51bGwpIHsKCQkJCQkJbGF1bmNoYWJsZUFkYXB0ZXIgPSBhZGFwdGVyOwoJCQkJCQlsYXVuY2hhYmxlID0gbGF1bmNoYWJsZTI7CgkJCQkJfQoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbiBsYXVuY2hhYmxlIGFkYXB0ZXIiLCBlKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQlJQ2xpZW50W10gY2xpZW50cyA9IG5ldyBJQ2xpZW50WzBdOwoJCWlmIChsYXVuY2hhYmxlICE9IG51bGwpCgkJCWNsaWVudHMgPSBnZXRDbGllbnRzKHNlcnZlciwgbGF1bmNoYWJsZSwgbGF1bmNoTW9kZSk7CgoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxhdW5jaGFibGUgY2xpZW50czogIiArIGNsaWVudHMpOwoKCQlJQ2xpZW50IGNsaWVudCA9IG51bGw7CgkJaWYgKGNsaWVudHMgPT0gbnVsbCB8fCBjbGllbnRzLmxlbmd0aCA9PSAwKSB7CgkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vQ2xpZW50KTsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiTm8gbGF1bmNoYWJsZSBjbGllbnRzISIpOwoJCQlyZXR1cm47CgkJfSBlbHNlIGlmIChjbGllbnRzLmxlbmd0aCA9PSAxKSB7CgkJCWNsaWVudCA9IGNsaWVudHNbMF07CgkJfSBlbHNlIHsKCQkJU2VsZWN0Q2xpZW50V2l6YXJkIHdpemFyZCA9IG5ldyBTZWxlY3RDbGllbnRXaXphcmQoY2xpZW50cyk7CgkJCUNsb3NhYmxlV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBDbG9zYWJsZVdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKCQkJZGlhbG9nLm9wZW4oKTsKCQkJY2xpZW50ID0gd2l6YXJkLmdldFNlbGVjdGVkQ2xpZW50KCk7CgkJCWlmIChjbGllbnQgPT0gbnVsbCkKCQkJCXJldHVybjsKCQl9CgoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlYWR5IHRvIGxhdW5jaCIpOwoKCQkvLyBzdGFydCBzZXJ2ZXIgaWYgaXQncyBub3QgYWxyZWFkeSBzdGFydGVkCgkJLy8gYW5kIGN1ZSB0aGUgY2xpZW50IHRvIHN0YXJ0CgkJSU1vZHVsZVtdIG1vZHVsZXMgPSBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07IC8vIFRPRE86IGdldCBwYXJlbnQgaGVpcmFyY2h5IGNvcnJlY3QKCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykgewoJCQlMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7CgkJfSBlbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKCQkJYm9vbGVhbiByZXN0YXJ0ID0gZmFsc2U7CgkJCVN0cmluZyBtb2RlID0gc2VydmVyLmdldE1vZGUoKTsKCQkJaWYgKCFJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSAmJiBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgewoJCQkJaW50IHJlc3VsdCA9IG9wZW5XYXJuaW5nRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ0RlYnVnKTsKCQkJCWlmIChyZXN1bHQgPT0gMSkKCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAwKQoJCQkJCXJlc3RhcnQgPSB0cnVlOwoJCQkJZWxzZQoJCQkJCXJldHVybjsKCQkJfSBlbHNlIGlmICghSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSAmJiBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7CgkJCQlpbnQgcmVzdWx0ID0gb3Blbldhcm5pbmdEaWFsb2coc2hlbGwsIE1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nUHJvZmlsZSk7CgkJCQlpZiAocmVzdWx0ID09IDEpCgkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7CgkJCQllbHNlIGlmIChyZXN1bHQgPT0gMCkKCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKCQkJCWVsc2UKCQkJCQlyZXR1cm47CgkJCX0KCQkJaWYgKHJlc3RhcnQpCgkJCQlSZXN0YXJ0U2VydmVySm9iLnJlc3RhcnRTZXJ2ZXIoc2VydmVyLCBsYXVuY2hNb2RlKTsKCQkJCgkJCVB1Ymxpc2hTZXJ2ZXJKb2IgcHVibGlzaEpvYiA9IG5ldyBQdWJsaXNoU2VydmVySm9iKHNlcnZlcik7CgkJCXB1Ymxpc2hKb2Iuc2NoZWR1bGUoKTsKCQkJTGF1bmNoQ2xpZW50Sm9iIGNsaWVudEpvYiA9IG5ldyBMYXVuY2hDbGllbnRKb2Ioc2VydmVyLCBtb2R1bGVzLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIsIGNsaWVudCk7CgkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwoJCX0gZWxzZSBpZiAoc3RhdGUgIT0gSVNlcnZlci5TVEFURV9TVE9QUElORykgewoJCQlQdWJsaXNoU2VydmVySm9iIHB1Ymxpc2hKb2IgPSBuZXcgUHVibGlzaFNlcnZlckpvYihzZXJ2ZXIpOwoJCQlTdGFydFNlcnZlckpvYiBzdGFydFNlcnZlckpvYiA9IG5ldyBTdGFydFNlcnZlckpvYihzZXJ2ZXIsIGxhdW5jaE1vZGUpOwoJCQlMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKCQkJCgkJCWlmICgoKFNlcnZlclR5cGUpc2VydmVyLmdldFNlcnZlclR5cGUoKSkuc3RhcnRCZWZvcmVQdWJsaXNoKCkgJiYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkpIHsKCQkJCXN0YXJ0U2VydmVySm9iLnNjaGVkdWxlKCk7ICAgICAgICAgICAgICAgIAoJCQkJcHVibGlzaEpvYi5zY2hlZHVsZSgpOwoJCQl9IGVsc2UgewoJCQkJcHVibGlzaEpvYi5zY2hlZHVsZSgpOwoJCQkJc3RhcnRTZXJ2ZXJKb2Iuc2NoZWR1bGUoKTsgICAgICAgICAgICAgICAgCgkJCX0KCQkJCgkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwoJCX0KCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGxhdW5jaGFibGUgY2xpZW50cyBmb3IgdGhlIGdpdmVuIHNlcnZlciBhbmQgbGF1bmNoYWJsZQoJICogb2JqZWN0LgoJICoKCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKCSAqIEBwYXJhbSBsYXVuY2hhYmxlCgkgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xpZW50cwoJICovCglwdWJsaWMgc3RhdGljIElDbGllbnRbXSBnZXRDbGllbnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKCQlJQ2xpZW50W10gY2xpZW50cyA9IFNlcnZlclBsdWdpbi5nZXRDbGllbnRzKCk7CgkJaWYgKGNsaWVudHMgIT0gbnVsbCkgewoJCQlpbnQgc2l6ZSA9IGNsaWVudHMubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiY2xpZW50PSAiICsgY2xpZW50c1tpXSk7CgkJCQlpZiAoY2xpZW50c1tpXS5zdXBwb3J0cyhzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUpKQoJCQkJCWxpc3QuYWRkKGNsaWVudHNbaV0pOwoJCQl9CgkJfQoJCQoJCUlDbGllbnRbXSBjbGllbnRzMiA9IG5ldyBJQ2xpZW50W2xpc3Quc2l6ZSgpXTsKCQlsaXN0LnRvQXJyYXkoY2xpZW50czIpOwoJCXJldHVybiBjbGllbnRzMjsKCX0KCgkvKioKCSAqIE9wZW4gYSBtZXNzYWdlIGRpYWxvZy4KCSAqIAoJICogQHBhcmFtIHNoZWxsCgkgKiBAcGFyYW0gbWVzc2FnZQoJICogQHJldHVybiBhIGRpYWxvZyByZXR1cm4gY29uc3RhbnQKCSAqLwoJcHJvdGVjdGVkIGludCBvcGVuV2FybmluZ0RpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIG1lc3NhZ2UpIHsKCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBudWxsLAoJCQltZXNzYWdlLAlNZXNzYWdlRGlhbG9nLldBUk5JTkcsIG5ldyBTdHJpbmdbXSB7TWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdSZXN0YXJ0LAoJCQlNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ0NvbnRpbnVlLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDApOwoJCXJldHVybiBkaWFsb2cub3BlbigpOwoJfQoKCS8qKgoJICogVGhlIGRlbGVnYXRpbmcgYWN0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4gSW1wbGVtZW50CgkgKiB0aGlzIG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCgkgKgoJICogQHBhcmFtIGFjdGlvbiBhY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHRoZSBwcmVzZW50YXRpb24KCSAqIHBvcnRpb24gb2YgdGhlIHBsdWdpbiBhY3Rpb24KCSAqLwoJcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUnVubmluZyBvbiBTZXJ2ZXIuLi4iKTsKCQl0cnkgewoJCQlydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiUnVuIG9uIFNlcnZlciBFcnJvciIsIGUpOwoJCX0KCX0KCQoJcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKCkgewoJCXRyeSB7CgkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBnbG9iYWxMYXVuY2hNb2RlLmdldChnZXRMYXVuY2hNb2RlKCkpOwoJCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc3RhcnQgbW9kZSB0aGF0IHRoZSBzZXJ2ZXIgc2hvdWxkIHVzZS4KCSAqLwoJcHJvdGVjdGVkIFN0cmluZyBnZXRMYXVuY2hNb2RlKCkgewoJCXJldHVybiBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKCX0KCgkvKioKCSAqIERldGVybWluZSB3aGljaCBjbGllbnRzIGNhbiBhY3Qgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgoJICoKCSAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24KCSAqICAgIHBvcnRpb24gb2YgdGhlIHBsdWdpbiBhY3Rpb24KCSAqIEBwYXJhbSBzZWwgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIGRlc2t0b3AKCSAqLwoJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWwpIHsKCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICI+IHNlbGVjdGlvbkNoYW5nZWQiKTsKCQlzZWxlY3Rpb24gPSBudWxsOwoJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCWlmIChzZWwgPT0gbnVsbCB8fCBzZWwuaXNFbXB0eSgpIHx8ICEoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7CgkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKCQkJZ2xvYmFsU2VsZWN0aW9uID0gbnVsbDsKCQkJcmV0dXJuOwoJCX0KCgkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWw7CgkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWxlY3QuaXRlcmF0b3IoKTsKCQlzZWxlY3Rpb24gPSBpdGVyYXRvci5uZXh0KCk7CgkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgeyAvLyBtb3JlIHRoYW4gb25lIHNlbGVjdGlvbiAoc2hvdWxkIG5ldmVyIGhhcHBlbikKCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwoJCQlzZWxlY3Rpb24gPSBudWxsOwoJCQlnbG9iYWxTZWxlY3Rpb24gPSBudWxsOwoJCQlyZXR1cm47CgkJfQoKCQlpZiAoc2VsZWN0aW9uICE9IGdsb2JhbFNlbGVjdGlvbikgewoJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTZWxlY3Rpb246ICIgKyBzZWxlY3Rpb24pOwoJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpCQoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU2VsZWN0aW9uIHR5cGU6ICIgKyBzZWxlY3Rpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwoJCQlnbG9iYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb247CgkJCWdsb2JhbExhdW5jaE1vZGUgPSBuZXcgSGFzaE1hcCgpOwoJCQlpZiAoIVNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChnbG9iYWxTZWxlY3Rpb24pKSB7CgkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CgkJCQlyZXR1cm47CgkJCX0KCQkJCgkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgImNoZWNraW5nIGZvciBtb2R1bGUgYXJ0aWZhY3QiKTsKCQkJSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0ID0gU2VydmVyUGx1Z2luLmdldE1vZHVsZUFydGlmYWN0KGdsb2JhbFNlbGVjdGlvbik7CgkJCUlNb2R1bGUgbW9kdWxlID0gbnVsbDsKCQkJaWYgKG1vZHVsZUFydGlmYWN0ICE9IG51bGwpCgkJCQltb2R1bGUgPSBtb2R1bGVBcnRpZmFjdC5nZXRNb2R1bGUoKTsKCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAibW9kdWxlQXJ0aWZhY3Q9ICIgKyBtb2R1bGVBcnRpZmFjdCArICIsIG1vZHVsZT0gIiArIG1vZHVsZSk7CgkJCWlmIChtb2R1bGUgIT0gbnVsbCkKCQkJCWZpbmRHbG9iYWxMYXVuY2hNb2Rlcyhtb2R1bGUpOwoJCQllbHNlIHsKCQkJCWdsb2JhbExhdW5jaE1vZGUucHV0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBuZXcgQm9vbGVhbih0cnVlKSk7CgkJCQlnbG9iYWxMYXVuY2hNb2RlLnB1dChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLCBuZXcgQm9vbGVhbih0cnVlKSk7CgkJCQlnbG9iYWxMYXVuY2hNb2RlLnB1dChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUsIG5ldyBCb29sZWFuKHRydWUpKTsKCQkJfQoJCX0KCgkJYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIjwgc2VsZWN0aW9uQ2hhbmdlZCAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwoJfQoJCgkvKioKCSAqIERldGVybWluZXMgd2hldGhlciB0aGVyZSBpcyBhIHNlcnZlciBmYWN0b3J5IGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIG1vZHVsZQoJICogYW5kIHRoZSB2YXJpb3VzIHN0YXJ0IG1vZGVzLgoJICovCglwcm90ZWN0ZWQgdm9pZCBmaW5kR2xvYmFsTGF1bmNoTW9kZXMoSU1vZHVsZSBtb2R1bGUpIHsKCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwoJCWlmIChzZXJ2ZXJUeXBlcyAhPSBudWxsKSB7CgkJCWludCBzaXplID0gc2VydmVyVHlwZXMubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJSVNlcnZlclR5cGUgdHlwZSA9IHNlcnZlclR5cGVzW2ldOwoJCQkJaWYgKGlzVmFsaWRTZXJ2ZXJUeXBlKHR5cGUsIG1vZHVsZSkpIHsKCQkJCQlmb3IgKGJ5dGUgYiA9IDA7IGIgPCBsYXVuY2hNb2Rlcy5sZW5ndGg7IGIrKykgewoJCQkJCQlpZiAodHlwZS5zdXBwb3J0c0xhdW5jaE1vZGUobGF1bmNoTW9kZXNbYl0pKSB7CgkJCQkJCQlnbG9iYWxMYXVuY2hNb2RlLnB1dChsYXVuY2hNb2Rlc1tiXSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZSBjYW4gbGF1bmNoIHRoZSBtb2R1bGUuIAoJICovCglwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkU2VydmVyVHlwZShJU2VydmVyVHlwZSB0eXBlLCBJTW9kdWxlIG1vZHVsZSkgewoJCXRyeSB7CgkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHR5cGUuZ2V0UnVudGltZVR5cGUoKTsKCQkJU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzTGF1bmNoTW9kZShJU2VydmVyIHNlcnZlciwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKCQlyZXR1cm4gc2VydmVyLmdldFNlcnZlclR5cGUoKS5zdXBwb3J0c0xhdW5jaE1vZGUobGF1bmNoTW9kZSk7Cgl9Cn0=