LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLyoqCiAqIAogKi8KcHVibGljIGNsYXNzIFNlcnZlclR5cGUgaW1wbGVtZW50cyBJU2VydmVyVHlwZSwgSU9yZGVyZWQgewoJcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwoKCS8qKgoJICogU2VydmVyVHlwZSBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgU2VydmVyVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewoJCXN1cGVyKCk7CgkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKCX0KCQoJcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewoJCXJldHVybiBlbGVtZW50OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBmYWN0b3J5LgoJICoKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldElkKCkgewoJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKCX0KCQoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwoJfQoKCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOwoJfQoJCglwdWJsaWMgSVJ1bnRpbWVUeXBlIGdldFJ1bnRpbWVUeXBlKCkgewoJCVN0cmluZyB0eXBlSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZCIpOwoJCWlmICh0eXBlSWQgPT0gbnVsbCkKCQkJcmV0dXJuIG51bGw7CgkJcmV0dXJuIFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKHR5cGVJZCk7Cgl9CgoJcHVibGljIGJvb2xlYW4gaGFzUnVudGltZSgpIHsKCQlTdHJpbmcgcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lIik7CgkJcmV0dXJuICJ0cnVlIi5lcXVhbHMocyk7Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0aGUgb3JkZXIuCgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGludCBnZXRPcmRlcigpIHsKCQl0cnkgewoJCQlTdHJpbmcgbyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcmRlciIpOwoJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChvKTsKCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewoJCQlyZXR1cm4gLTE7CgkJfQoJfQoJCglwcm90ZWN0ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCkgewoJCVN0cmluZyBsYXVuY2hDb25maWdJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsYXVuY2hDb25maWdJZCIpOwoJCWlmIChsYXVuY2hDb25maWdJZCA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKCQlyZXR1cm4gbGF1bmNoTWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZShsYXVuY2hDb25maWdJZCk7Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBzdGFydCBvciBtYXkgYWxyZWFkeSBiZSBzdGFydGVkCgkgKiBpbiB0aGUgZ2l2ZW4gbW9kZSwgYW5kIGZhbHNlIGlmIG5vdC4gVXNlcyB0aGUgbGF1bmNoTW9kZSBhdHRyaWJ1dGUsCgkgKiB3aGljaCBtYXkgY29udGFpbiB0aGUgc3RyaW5ncyAicnVuIiwgImRlYnVnIiwgYW5kL29yICJwcm9maWxlIi4KCSAqIAoJICogQHBhcmFtIGxhdW5jaE1vZGUgU3RyaW5nCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMYXVuY2hNb2RlKFN0cmluZyBsYXVuY2hNb2RlKSB7CgkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGNvbmZpZ1R5cGUgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSgpOwoJCWlmIChjb25maWdUeXBlID09IG51bGwpIHsKCQkJU3RyaW5nIG1vZGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibGF1bmNoTW9kZXMiKTsKCQkJaWYgKG1vZGUgPT0gbnVsbCkKCQkJCXJldHVybiBmYWxzZTsKCQkJcmV0dXJuIG1vZGUuaW5kZXhPZihsYXVuY2hNb2RlKSA+PSAwOwoJCX0KCQlyZXR1cm4gY29uZmlnVHlwZS5zdXBwb3J0c01vZGUobGF1bmNoTW9kZSk7Cgl9CgoJLypwdWJsaWMgSVNlcnZlckNvbmZpZ3VyYXRpb25UeXBlIGdldFNlcnZlckNvbmZpZ3VyYXRpb25UeXBlKCkgewoJCVN0cmluZyBjb25maWd1cmF0aW9uVHlwZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNvbmZpZ3VyYXRpb25UeXBlSWQiKTsKCQlyZXR1cm4gU2VydmVyQ29yZS5maW5kU2VydmVyQ29uZmlndXJhdGlvblR5cGUoY29uZmlndXJhdGlvblR5cGVJZCk7Cgl9Ki8KCQoJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSZW1vdGVIb3N0cygpIHsKCQlTdHJpbmcgaG9zdHMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgic3VwcG9ydHNSZW1vdGVIb3N0cyIpOwoJCXJldHVybiAoaG9zdHMgIT0gbnVsbCAmJiBob3N0cy50b0xvd2VyQ2FzZSgpLmVxdWFscygidHJ1ZSIpKTsKCX0KCglwdWJsaWMgYnl0ZSBnZXRJbml0aWFsU3RhdGUoKSB7CgkJU3RyaW5nIHN0YXRlU3RyaW5nID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImluaXRpYWxTdGF0ZSIpOwoJCWlmIChzdGF0ZVN0cmluZyAhPSBudWxsKQoJCQlzdGF0ZVN0cmluZyA9IHN0YXRlU3RyaW5nLnRvTG93ZXJDYXNlKCk7CgkJaWYgKCJzdG9wcGVkIi5lcXVhbHMoc3RhdGVTdHJpbmcpKQoJCQlyZXR1cm4gSVNlcnZlci5TVEFURV9TVE9QUEVEOwoJCWVsc2UgaWYgKCJzdGFydGVkIi5lcXVhbHMoc3RhdGVTdHJpbmcpKQoJCQlyZXR1cm4gSVNlcnZlci5TVEFURV9TVEFSVEVEOwoJCXJldHVybiBJU2VydmVyLlNUQVRFX1VOS05PV047Cgl9CgkKCXB1YmxpYyBpbnQgZ2V0U2VydmVyU3RhdGVTZXQoKSB7CgkJU3RyaW5nIHN0YXRlU2V0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInN0YXRlU2V0Iik7CgkJaWYgKHN0YXRlU2V0ID09IG51bGwpCgkJCXJldHVybiBTRVJWRVJfU1RBVEVfU0VUX01BTkFHRUQ7CgkJZWxzZSBpZiAoc3RhdGVTZXQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJhdHRhY2giKSA+PSAwKQoJCQlyZXR1cm4gU0VSVkVSX1NUQVRFX1NFVF9BVFRBQ0hFRDsKCQllbHNlIGlmIChzdGF0ZVNldC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInB1Ymxpc2giKSA+PSAwKQoJCQlyZXR1cm4gU0VSVkVSX1NUQVRFX1NFVF9QVUJMSVNIRUQ7CgkJZWxzZQoJCQlyZXR1cm4gU0VSVkVSX1NUQVRFX1NFVF9NQU5BR0VEOwoJfQoKCXB1YmxpYyBib29sZWFuIGhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSB7CgkJcmV0dXJuICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldEF0dHJpYnV0ZSgiaGFzQ29uZmlndXJhdGlvbiIpKSk7Cgl9CgoJcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVTZXJ2ZXIoU3RyaW5nIGlkLCBJRmlsZSBmaWxlLCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQoJCQlpZCA9IFNlcnZlclBsdWdpbi5nZW5lcmF0ZUlkKCk7CgkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gbmV3IFNlcnZlcldvcmtpbmdDb3B5KGlkLCBmaWxlLCBydW50aW1lLCB0aGlzKTsKCQlzd2Muc2V0RGVmYXVsdHMobW9uaXRvcik7CgkJcmV0dXJuIHN3YzsKCX0KCglwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCgkJCWlkID0gU2VydmVyUGx1Z2luLmdlbmVyYXRlSWQoKTsKCQkKCQlJUnVudGltZSBydW50aW1lID0gbnVsbDsKCQlpZiAoaGFzUnVudGltZSgpKSB7CgkJCS8vIGxvb2sgZm9yIGV4aXN0aW5nIHJ1bnRpbWUKCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gZ2V0UnVudGltZVR5cGUoKTsKCQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlclV0aWwuZ2V0UnVudGltZXMocnVudGltZVR5cGUpOwoJCQlpZiAocnVudGltZXMgIT0gbnVsbCAmJiBydW50aW1lcy5sZW5ndGggPiAwKQoJCQkJcnVudGltZSA9IHJ1bnRpbWVzWzBdOwoJCQllbHNlIHsKCQkJCS8vIGNyZWF0ZSBydW50aW1lCgkJCQl0cnkgewoJCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdDID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShpZCArICItcnVudGltZSIsIG1vbml0b3IpOwoJCQkJCVNlcnZlclV0aWwuc2V0UnVudGltZURlZmF1bHROYW1lKHJ1bnRpbWVXQyk7CgkJCQkJcnVudGltZSA9IHJ1bnRpbWVXQzsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGRuJ3QgY3JlYXRlIHJ1bnRpbWUiLCBlKTsKCQkJCX0KCQkJfQoJCX0KCgkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gbmV3IFNlcnZlcldvcmtpbmdDb3B5KGlkLCBmaWxlLCBydW50aW1lLCB0aGlzKTsKCQlTZXJ2ZXJVdGlsLnNldFNlcnZlckRlZmF1bHROYW1lKHN3Yyk7CgkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKCQkJc3djLnNldFJ1bnRpbWUocnVudGltZSk7CgkJCgkJaWYgKHN3Yy5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpKSB7CgkJCS8vIFRPRE86IGNvbmZpZwoJCQkoKFNlcnZlcilzd2MpLmltcG9ydENvbmZpZ3VyYXRpb24ocnVudGltZSwgbnVsbCk7CgkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0U2VydmVyUHJvamVjdCgpLmdldEZvbGRlcihzd2MuZ2V0TmFtZSgpICsgIi1jb25maWciKTsKCQkJc3djLnNldFNlcnZlckNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKCQl9CgkJCgkJLy9UT0RPOiBpbXBvcnQgc2VydmVyIGNvbmZpZwoJCS8qIElTZXJ2ZXJDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnID0gbnVsbDsKCQlpZiAoaGFzU2VydmVyQ29uZmlndXJhdGlvbigpKSB7CgkJCWlmIChydW50aW1lICE9IG51bGwpCgkJCQljb25maWcgPSBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uVHlwZSgpLmltcG9ydEZyb21SdW50aW1lKGlkICsgIi1jb25maWciLCBmaWxlLCBydW50aW1lLCBtb25pdG9yKTsKCQkJaWYgKGNvbmZpZyA9PSBudWxsKQoJCQkJY29uZmlnID0gZ2V0U2VydmVyQ29uZmlndXJhdGlvblR5cGUoKS5jcmVhdGVTZXJ2ZXJDb25maWd1cmF0aW9uKGlkICsgIi1jb25maWciLCBmaWxlLCBtb25pdG9yKTsKCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJDb25maWd1cmF0aW9uRGVmYXVsdE5hbWUoY29uZmlnKTsKCQkJaWYgKGNvbmZpZyAhPSBudWxsKQoJCQkJc3djLnNldFNlcnZlckNvbmZpZ3VyYXRpb24oY29uZmlnKTsKCQl9Ki8KCQkKCQlzd2Muc2V0RGVmYXVsdHMobW9uaXRvcik7CgkJCgkJcmV0dXJuIHN3YzsKCX0KCQoJcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRTZXJ2ZXJQcm9qZWN0KCkgewoJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7CgkJaWYgKHByb2plY3RzICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBwcm9qZWN0cy5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlpZiAoU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0c1tpXSkuaXNTZXJ2ZXJQcm9qZWN0KCkpCgkJCQkJcmV0dXJuIHByb2plY3RzW2ldOwoJCQl9CgkJfQoJCQoJCVN0cmluZyBzID0gZmluZFVudXNlZFNlcnZlclByb2plY3ROYW1lKCk7CgkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChzKTsKCX0KCQoJLyoqCgkgKiBGaW5kcyBhbiB1bnVzZWQgcHJvamVjdCBuYW1lIHRvIHVzZSBhcyBhIHNlcnZlciBwcm9qZWN0LgoJICogCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZmluZFVudXNlZFNlcnZlclByb2plY3ROYW1lKCkgewoJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwoJCVN0cmluZyBuYW1lID0gU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlZGVmYXVsdFNlcnZlclByb2plY3ROYW1lIiwgIiIpOwoJCWludCBjb3VudCA9IDE7CgkJd2hpbGUgKHJvb3QuZ2V0UHJvamVjdChuYW1lKS5leGlzdHMoKSkgewoJCQluYW1lID0gU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlZGVmYXVsdFNlcnZlclByb2plY3ROYW1lIiwgKytjb3VudCArICIiKTsKCQl9CgkJcmV0dXJuIG5hbWU7Cgl9CgkKCS8qKgoJICogUmV0dXJuIHRoZSB0aW1lb3V0IChpbiBtcykgdGhhdCBzaG91bGQgYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHN0YXJ0LgoJICogUmV0dXJucyAtMSBpZiB0aGVyZSBpcyBubyB0aW1lb3V0LgoJICogCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBpbnQgZ2V0U3RhcnRUaW1lb3V0KCkgewoJCXRyeSB7CgkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzdGFydFRpbWVvdXQiKSk7CgkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KCgkvKioKCSAqIFJldHVybiB0aGUgdGltZW91dCAoaW4gbXMpIHRvIHdhaXQgYmVmb3JlIGFzc3VtaW5nIHRoYXQgdGhlIHNlcnZlcgoJICogaGFzIGZhaWxlZCB0byBzdG9wLiBSZXR1cm5zIC0xIGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQuCgkgKiAgCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXQoKSB7CgkJdHJ5IHsKCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInN0b3BUaW1lb3V0IikpOwoJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCXJldHVybiAiU2VydmVyVHlwZVsiICsgZ2V0SWQoKSArICJdIjsKCX0KfQ==