cGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmludGVybmFsLnVpOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW1wb3J0IGphdmEubmV0LlVSTDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwovKioKICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgaW1hZ2UgcmVzb3VyY2VzLgogKi8KcHVibGljIGNsYXNzIEltYWdlUmVzb3VyY2UgewoJLy8gdGhlIGltYWdlIHJlZ2lzdHJ5Cglwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7CgoJLy8gbWFwIG9mIGltYWdlIGRlc2NyaXB0b3JzIHNpbmNlIHRoZXNlCgkvLyB3aWxsIGJlIGxvc3QgYnkgdGhlIGltYWdlIHJlZ2lzdHJ5Cglwcml2YXRlIHN0YXRpYyBNYXAgaW1hZ2VEZXNjcmlwdG9yczsKCgkvLyBtYXAgb2YgSUVsZW1lbnQgaW1hZ2VzCglwcml2YXRlIHN0YXRpYyBNYXAgZWxlbWVudEltYWdlczsKCgkvLyBiYXNlIHVybHMgZm9yIGltYWdlcwoJcHJpdmF0ZSBzdGF0aWMgVVJMIElDT05fQkFTRV9VUkw7CgoJc3RhdGljIHsKCQl0cnkgewoJCQlTdHJpbmcgcGF0aFN1ZmZpeCA9ICJpY29ucy8iOwoJCQlJQ09OX0JBU0VfVVJMID0gSmF2YVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNldCBpY29uIGJhc2UgVVJMIiwgZSk7CgkJfQoJfQoKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfT0JKID0gIm9iajE2LyI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1dJWkJBTiA9ICJ3aXpiYW4vIjsKCgkvLyBKYXZhIGltYWdlcwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0pBVkFfQ0xBU1NQQVRIX0pBUiA9ICJjbGFzc3BhdGhKYXIiOwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0pBVkFfQ0xBU1NQQVRIX1ZBUiA9ICJjbGFzc3BhdGhWYXIiOwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0pBVkFfU1lTVEVNX1BST1BFUlRZID0gInN5c3RlbVByb3BlcnR5IjsKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19SVU5USU1FX1RZUEUgPSAicnVudGltZVR5cGUiOwoKCS8qKgoJICogQ2Fubm90IGNvbnN0cnVjdCBhbiBJbWFnZVJlc291cmNlLiBVc2Ugc3RhdGljIG1ldGhvZHMgb25seS4KCSAqLwoJcHJpdmF0ZSBJbWFnZVJlc291cmNlKCkge30KCgkvKioKCSAqIERpc3Bvc2Ugb2YgZWxlbWVudCBpbWFnZXMgdGhhdCB3ZXJlIGNyZWF0ZWQuCgkgKi8KCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkaXNwb3NlKCkgewoJCXRyeSB7CgkJCVRyYWNlLnRyYWNlKCJEaXNwb3Npbmcgb2YgZWxlbWVudCBpbWFnZXMiKTsKCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50SW1hZ2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7CgkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpdGVyYXRvci5uZXh0KCk7CgkJCQlpbWFnZS5kaXNwb3NlKCk7CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZSgiQ291bGQgbm90IGRpc3Bvc2Ugb2YgaW1hZ2VzIik7CgkJfQoJfQoJCgkvKioKCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5LgoJICoKCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwoJICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKCSAqLwoJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7CgkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkKCQkJaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoKTsKCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4ga2V5LgoJICoKCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwoJICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IKCSAqLwoJcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKQoJCQlpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpOwoJCXJldHVybiAoSW1hZ2VEZXNjcmlwdG9yKSBpbWFnZURlc2NyaXB0b3JzLmdldChrZXkpOwoJfQoKCS8qKgoJICogSW5pdGlhbGl6ZSB0aGUgaW1hZ2UgcmVzb3VyY2VzLgoJICovCglwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoKSB7CgkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7CgkJaW1hZ2VEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7CgkKCQkvLyBKYXZhIGltYWdlcwoJCXJlZ2lzdGVySW1hZ2UoSU1HX0pBVkFfU1lTVEVNX1BST1BFUlRZLCBVUkxfT0JKICsgImphdmFfc3lzdGVtX3Byb3BlcnR5LmdpZiIpOwoJCXJlZ2lzdGVySW1hZ2UoSU1HX0pBVkFfQ0xBU1NQQVRIX0pBUiwgVVJMX09CSiArICJqYXZhX2phci5naWYiKTsKCQlyZWdpc3RlckltYWdlKElNR19KQVZBX0NMQVNTUEFUSF9WQVIsIFVSTF9PQkogKyAiamF2YV92YXIuZ2lmIik7CgkJcmVnaXN0ZXJJbWFnZShJTUdfUlVOVElNRV9UWVBFLCBVUkxfV0laQkFOICsgIm5ld19ydW50aW1lX3dpei5naWYiKTsKCX0KCgkvKioKCSAqIFJlZ2lzdGVyIGFuIGltYWdlIHdpdGggdGhlIHJlZ2lzdHJ5LgoJICoKCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwoJICogQHBhcmFtIHBhcnRpYWxVUkwgamF2YS5sYW5nLlN0cmluZwoJICovCglwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVySW1hZ2UoU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKCQl0cnkgewoJCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKElDT05fQkFTRV9VUkwsIHBhcnRpYWxVUkwpKTsKCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBpZCk7CgkJCWltYWdlRGVzY3JpcHRvcnMucHV0KGtleSwgaWQpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKCJFcnJvciByZWdpc3RlcmluZyBpbWFnZSAiICsga2V5ICsgIiBmcm9tICIgKyBwYXJ0aWFsVVJMLCBlKTsKCQl9Cgl9Cn0=