LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbDsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCgoKLyoqCiAqIEBhdXRob3IgTmFjaSBEYWkKICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbiAgewoJCglTZXJ2ZXJBZG1pblRvb2wgYWRtaW5Ub29sOwoJcHJpdmF0ZSBMaXN0IGZEZXNjcmlwdG9yczsKCQoJcHJpdmF0ZSBGaWxlIGRlZmluaXRpb25GaWxlOwoKCS8qKgoJICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KCSAqLwoJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKCQlyZXR1cm4gZGVzY3JpcHRpb247Cgl9CgkvKioKCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgoJICovCglwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Cgl9CgkvKioKCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWQuCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CgkJcmV0dXJuIGlkOwoJfQoJLyoqCgkgKiBAcGFyYW0gaWQgVGhlIGlkIHRvIHNldC4KCSAqLwoJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CgkJdGhpcy5pZCA9IGlkOwoJfQoJLyoqCgkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZlbmRvci4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRWZW5kb3IoKSB7CgkJcmV0dXJuIHZlbmRvcjsKCX0KCS8qKgoJICogQHBhcmFtIHZlbmRvciBUaGUgdmVuZG9yIHRvIHNldC4KCSAqLwoJcHVibGljIHZvaWQgc2V0VmVuZG9yKFN0cmluZyB2ZW5kb3IpIHsKCQl0aGlzLnZlbmRvciA9IHZlbmRvcjsKCX0KCS8qKgoJICogQHJldHVybiBSZXR1cm5zIHRoZSB2ZXJzaW9uLgoJICovCglwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CgkJcmV0dXJuIHZlcnNpb247Cgl9CgkvKioKCSAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIHRvIHNldC4KCSAqLwoJcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewoJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Cgl9Cglwcml2YXRlIFN0cmluZyBuYW1lOwoJcHJpdmF0ZSBTdHJpbmcgaWQ7Cglwcml2YXRlIFN0cmluZyB2ZW5kb3I7Cglwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKCXByaXZhdGUgU3RyaW5nIHZlcnNpb247CgkKCXByaXZhdGUgYm9vbGVhbiB3ZWJNb2R1bGVzOwoJcHJpdmF0ZSBib29sZWFuIGVqYk1vZHVsZXM7Cglwcml2YXRlIGJvb2xlYW4gZWFyTW9kdWxlczsKCglwcml2YXRlIEFycmF5TGlzdCBwcm9wZXJ0aWVzOwoJcHJpdmF0ZSBBcnJheUxpc3Qgc2VydmVyQ2xhc3NQYXRoOwoJcHJpdmF0ZSBBcnJheUxpc3QgY2xpZW50Q2xhc3NQYXRoOwoJcHJpdmF0ZSBBcnJheUxpc3QgcHJvamVjdENsYXNzUGF0aDsKCglwcml2YXRlIFN0cmluZyB3ZWJNb2R1bGVzRGVwbG95RGlyZWN0b3J5OwoJcHJpdmF0ZSBTdHJpbmcgZWpiTW9kdWxlc0RlcGxveURpcmVjdG9yeTsKCXByaXZhdGUgU3RyaW5nIGVhck1vZHVsZXNEZXBsb3lEaXJlY3Rvcnk7CgoJcHJpdmF0ZSBTdHJpbmcgam5kaUluaXRpYWxDb250ZXh0RmFjdG9yeTsKCXByaXZhdGUgU3RyaW5nIGpuZGlQcm92aWRlclVybDsKCglwcml2YXRlIFN0cmluZyBzdGFydENsYXNzOwoJcHJpdmF0ZSBTdHJpbmcgc3RhcnRXb3JraW5nRGlyZWN0b3J5OwoJcHJpdmF0ZSBTdHJpbmcgc3RhcnRWbVBhcmFtZXRlcnM7Cglwcml2YXRlIFN0cmluZyBzdGFydFByb2dyYW1Bcmd1bWVudHM7CgoJcHJpdmF0ZSBTdHJpbmcgc3RvcENsYXNzOwoJcHJpdmF0ZSBTdHJpbmcgc3RvcFdvcmtpbmdEaXJlY3Rvcnk7Cglwcml2YXRlIFN0cmluZyBzdG9wVm1QYXJhbWV0ZXJzOwoJcHJpdmF0ZSBTdHJpbmcgc3RvcFByb2dyYW1Bcmd1bWVudHM7CgoJcHJpdmF0ZSBTdHJpbmcgc2VydmVySG9tZTsKCS8qKgoJICogCgkgKi8KCXB1YmxpYyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpIHsKCQlwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdCgpOwoJCXNlcnZlckNsYXNzUGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKCQljbGllbnRDbGFzc1BhdGggPSBuZXcgQXJyYXlMaXN0KCk7CgkJcHJvamVjdENsYXNzUGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKCQlhZG1pblRvb2wgPSBuZXcgU2VydmVyQWRtaW5Ub29sKHRoaXMpOwoJfQoKCXB1YmxpYyB2b2lkIGFkZFNlcnZlckNsYXNzcGF0aChDbGFzc3BhdGhJdGVtIGNsYXNzcGF0aEl0ZW0pIHsKCQl0aGlzLmdldFNlcnZlckNsYXNzUGF0aCgpLmFkZChjbGFzc3BhdGhJdGVtKTsKCX0KCglwdWJsaWMgdm9pZCBhZGRDbGllbnRDbGFzc3BhdGgoQ2xhc3NwYXRoSXRlbSBjbGFzc3BhdGhJdGVtKSB7CgkJdGhpcy5nZXRDbGllbnRDbGFzc1BhdGgoKS5hZGQoY2xhc3NwYXRoSXRlbSk7Cgl9CglwdWJsaWMgdm9pZCBhZGRQcm9qZWN0Q2xhc3NwYXRoKENsYXNzcGF0aEl0ZW0gY2xhc3NwYXRoSXRlbSkgewoJCXRoaXMuZ2V0Q2xpZW50Q2xhc3NQYXRoKCkuYWRkKGNsYXNzcGF0aEl0ZW0pOwoJfQoKCS8qKgoJICogQHJldHVybiBBcnJheUxpc3QKCSAqLwoJcHVibGljIEFycmF5TGlzdCBnZXRDbGllbnRDbGFzc1BhdGgoKSB7CgkJcmV0dXJuIGNsaWVudENsYXNzUGF0aDsKCX0KCQoJLyoqCgkgKiBAcmV0dXJuIEFycmF5TGlzdAoJICovCglwdWJsaWMgQXJyYXlMaXN0IGdldFByb2plY3RDbGFzc1BhdGgoKSB7CgkJcmV0dXJuIHByb2plY3RDbGFzc1BhdGg7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIFN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldEVhck1vZHVsZXNEZXBsb3lEaXJlY3RvcnkoKSB7CgkJcmV0dXJuIGVhck1vZHVsZXNEZXBsb3lEaXJlY3Rvcnk7Cgl9CgkKCS8qKgoJICogQHJldHVybiBTdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXRFamJNb2R1bGVzRGVwbG95RGlyZWN0b3J5KCkgewoJCXJldHVybiBlamJNb2R1bGVzRGVwbG95RGlyZWN0b3J5OwoJfQoKCS8qKgoJICogQHJldHVybiBBcnJheUxpc3QKCSAqLwoJcHVibGljIEFycmF5TGlzdCBnZXRQcm9wZXJ0aWVzKCkgewoJCXJldHVybiBwcm9wZXJ0aWVzOwoJfQoKCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoVmFyaWFibGVOYW1lKCkgewoKCQlTZXJ2ZXJUeXBlRGVmaW5pdGlvblByb3BlcnR5IHByb3AgPQoJCQlnZXRQcm9wZXJ0eU5hbWVkKCJjbGFzc1BhdGhWYXJpYWJsZU5hbWUiKTsKCQlpZiAocHJvcCAhPSBudWxsKQoJCQlyZXR1cm4gcHJvcC5nZXREZWZhdWx0VmFsdWUoKTsKCQlyZXR1cm4gbnVsbDsKCX0KCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoVmFyaWFibGUoKSB7CgoJCVNlcnZlclR5cGVEZWZpbml0aW9uUHJvcGVydHkgcHJvcCA9IGdldFByb3BlcnR5TmFtZWQoImNsYXNzUGF0aCIpOwoJCWlmIChwcm9wICE9IG51bGwpCgkJCXJldHVybiBwcm9wLmdldERlZmF1bHRWYWx1ZSgpOwoJCXJldHVybiBudWxsOwoJfQoKCXB1YmxpYyBTZXJ2ZXJUeXBlRGVmaW5pdGlvblByb3BlcnR5IGdldFByb3BlcnR5TmFtZWQoU3RyaW5nIGlkKSB7CgkJSXRlcmF0b3IgaXRyID0gZ2V0UHJvcGVydGllcygpLml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKCQkJU2VydmVyVHlwZURlZmluaXRpb25Qcm9wZXJ0eSBlbGVtZW50ID0KCQkJCShTZXJ2ZXJUeXBlRGVmaW5pdGlvblByb3BlcnR5KSBpdHIubmV4dCgpOwoJCQlpZiAoaWQuZXF1YWxzKGVsZW1lbnQuZ2V0SWQoKSkpCgkJCQlyZXR1cm4gZWxlbWVudDsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgkvKioKCSAqIEByZXR1cm4gQXJyYXlMaXN0CgkgKi8KCXB1YmxpYyBBcnJheUxpc3QgZ2V0U2VydmVyQ2xhc3NQYXRoKCkgewoJCXJldHVybiBzZXJ2ZXJDbGFzc1BhdGg7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIFN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldFN0YXJ0Q2xhc3MoKSB7CgkJcmV0dXJuIHN0YXJ0Q2xhc3M7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIFN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldFN0YXJ0UHJvZ3JhbUFyZ3VtZW50cygpIHsKCQlyZXR1cm4gc3RhcnRQcm9ncmFtQXJndW1lbnRzOwoJfQoKCS8qKgoJICogQHJldHVybiBTdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXRTdGFydFZtUGFyYW1ldGVycygpIHsKCQlyZXR1cm4gc3RhcnRWbVBhcmFtZXRlcnM7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIFN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldFN0b3BDbGFzcygpIHsKCQlyZXR1cm4gc3RvcENsYXNzOwoJfQoKCS8qKgoJICogQHJldHVybiBTdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXRTdG9wUHJvZ3JhbUFyZ3VtZW50cygpIHsKCQlyZXR1cm4gc3RvcFByb2dyYW1Bcmd1bWVudHM7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIFN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldFN0b3BWbVBhcmFtZXRlcnMoKSB7CgkJcmV0dXJuIHN0b3BWbVBhcmFtZXRlcnM7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIFN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldFdlYk1vZHVsZXNEZXBsb3lEaXJlY3RvcnkoKSB7CgkJcmV0dXJuIHRoaXMucmVzb2x2ZVByb3BlcnRpZXMod2ViTW9kdWxlc0RlcGxveURpcmVjdG9yeSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBjbGllbnRDbGFzc1BhdGguCgkgKiBAcGFyYW0gY2xpZW50Q2xhc3NQYXRoIFRoZSBjbGllbnRDbGFzc1BhdGggdG8gc2V0CgkgKi8KCXB1YmxpYyB2b2lkIHNldENsaWVudENsYXNzUGF0aChBcnJheUxpc3QgY2xpZW50Q2xhc3NQYXRoKSB7CgkJdGhpcy5jbGllbnRDbGFzc1BhdGggPSBjbGllbnRDbGFzc1BhdGg7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBlYXJNb2R1bGVzRGVwbG95RGlyZWN0b3J5LgoJICogQHBhcmFtIGVhck1vZHVsZXNEZXBsb3lEaXJlY3RvcnkgVGhlIGVhck1vZHVsZXNEZXBsb3lEaXJlY3RvcnkgdG8gc2V0CgkgKi8KCXB1YmxpYyB2b2lkIHNldEVhck1vZHVsZXNEZXBsb3lEaXJlY3RvcnkoU3RyaW5nIGVhck1vZHVsZXNEZXBsb3lEaXJlY3RvcnkpIHsKCQl0aGlzLmVhck1vZHVsZXNEZXBsb3lEaXJlY3RvcnkgPSBlYXJNb2R1bGVzRGVwbG95RGlyZWN0b3J5OwoJfQoKCS8qKgoJICogU2V0cyB0aGUgZWpiTW9kdWxlc0RlcGxveURpcmVjdG9yeS4KCSAqIEBwYXJhbSBlamJNb2R1bGVzRGVwbG95RGlyZWN0b3J5IFRoZSBlamJNb2R1bGVzRGVwbG95RGlyZWN0b3J5IHRvIHNldAoJICovCglwdWJsaWMgdm9pZCBzZXRFamJNb2R1bGVzRGVwbG95RGlyZWN0b3J5KFN0cmluZyBlamJNb2R1bGVzRGVwbG95RGlyZWN0b3J5KSB7CgkJdGhpcy5lamJNb2R1bGVzRGVwbG95RGlyZWN0b3J5ID0gZWpiTW9kdWxlc0RlcGxveURpcmVjdG9yeTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHByb3BlcnRpZXMuCgkgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhBcnJheUxpc3QgcHJvcGVydGllcykgewoJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBzZXJ2ZXJDbGFzc1BhdGguCgkgKiBAcGFyYW0gc2VydmVyQ2xhc3NQYXRoIFRoZSBzZXJ2ZXJDbGFzc1BhdGggdG8gc2V0CgkgKi8KCXB1YmxpYyB2b2lkIHNldFNlcnZlckNsYXNzUGF0aChBcnJheUxpc3Qgc2VydmVyQ2xhc3NQYXRoKSB7CgkJdGhpcy5zZXJ2ZXJDbGFzc1BhdGggPSBzZXJ2ZXJDbGFzc1BhdGg7Cgl9CgoKCS8qKgoJICogU2V0cyB0aGUgUHJvamVjdENsYXNzUGF0aC4KCSAqIEBwYXJhbSBzZXJ2ZXJDbGFzc1BhdGggVGhlIFByb2plY3RDbGFzc1BhdGggdG8gc2V0CgkgKi8KCXB1YmxpYyB2b2lkIHNldFByb2plY3RDbGFzc1BhdGgoQXJyYXlMaXN0IHByb2plY3RDbGFzc1BhdGgpIHsKCQl0aGlzLnByb2plY3RDbGFzc1BhdGggPSBwcm9qZWN0Q2xhc3NQYXRoOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgc3RhcnRDbGFzcy4KCSAqIEBwYXJhbSBzdGFydENsYXNzIFRoZSBzdGFydENsYXNzIHRvIHNldAoJICovCglwdWJsaWMgdm9pZCBzZXRTdGFydENsYXNzKFN0cmluZyBzdGFydENsYXNzKSB7CgkJdGhpcy5zdGFydENsYXNzID0gc3RhcnRDbGFzczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHN0YXJ0UHJvZ3JhbUFyZ3VtZW50cy4KCSAqIEBwYXJhbSBzdGFydFByb2dyYW1Bcmd1bWVudHMgVGhlIHN0YXJ0UHJvZ3JhbUFyZ3VtZW50cyB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0U3RhcnRQcm9ncmFtQXJndW1lbnRzKFN0cmluZyBzdGFydFByb2dyYW1Bcmd1bWVudHMpIHsKCQl0aGlzLnN0YXJ0UHJvZ3JhbUFyZ3VtZW50cyA9IHN0YXJ0UHJvZ3JhbUFyZ3VtZW50czsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHN0YXJ0Vm1QYXJhbWV0ZXJzLgoJICogQHBhcmFtIHN0YXJ0Vm1QYXJhbWV0ZXJzIFRoZSBzdGFydFZtUGFyYW1ldGVycyB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0U3RhcnRWbVBhcmFtZXRlcnMoU3RyaW5nIHN0YXJ0Vm1QYXJhbWV0ZXJzKSB7CgkJdGhpcy5zdGFydFZtUGFyYW1ldGVycyA9IHN0YXJ0Vm1QYXJhbWV0ZXJzOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgc3RvcENsYXNzLgoJICogQHBhcmFtIHN0b3BDbGFzcyBUaGUgc3RvcENsYXNzIHRvIHNldAoJICovCglwdWJsaWMgdm9pZCBzZXRTdG9wQ2xhc3MoU3RyaW5nIHN0b3BDbGFzcykgewoJCXRoaXMuc3RvcENsYXNzID0gc3RvcENsYXNzOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgc3RvcFByb2dyYW1Bcmd1bWVudHMuCgkgKiBAcGFyYW0gc3RvcFByb2dyYW1Bcmd1bWVudHMgVGhlIHN0b3BQcm9ncmFtQXJndW1lbnRzIHRvIHNldAoJICovCglwdWJsaWMgdm9pZCBzZXRTdG9wUHJvZ3JhbUFyZ3VtZW50cyhTdHJpbmcgc3RvcFByb2dyYW1Bcmd1bWVudHMpIHsKCQl0aGlzLnN0b3BQcm9ncmFtQXJndW1lbnRzID0gc3RvcFByb2dyYW1Bcmd1bWVudHM7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBzdG9wVm1QYXJhbWV0ZXJzLgoJICogQHBhcmFtIHN0b3BWbVBhcmFtZXRlcnMgVGhlIHN0b3BWbVBhcmFtZXRlcnMgdG8gc2V0CgkgKi8KCXB1YmxpYyB2b2lkIHNldFN0b3BWbVBhcmFtZXRlcnMoU3RyaW5nIHN0b3BWbVBhcmFtZXRlcnMpIHsKCQl0aGlzLnN0b3BWbVBhcmFtZXRlcnMgPSBzdG9wVm1QYXJhbWV0ZXJzOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgd2ViTW9kdWxlc0RlcGxveURpcmVjdG9yeS4KCSAqIEBwYXJhbSB3ZWJNb2R1bGVzRGVwbG95RGlyZWN0b3J5IFRoZSB3ZWJNb2R1bGVzRGVwbG95RGlyZWN0b3J5IHRvIHNldAoJICovCglwdWJsaWMgdm9pZCBzZXRXZWJNb2R1bGVzRGVwbG95RGlyZWN0b3J5KFN0cmluZyB3ZWJNb2R1bGVzRGVwbG95RGlyZWN0b3J5KSB7CgkJdGhpcy53ZWJNb2R1bGVzRGVwbG95RGlyZWN0b3J5ID0gd2ViTW9kdWxlc0RlcGxveURpcmVjdG9yeTsKCX0KCgkvKioKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc0Vhck1vZHVsZXMoKSB7CgkJcmV0dXJuIGVhck1vZHVsZXM7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGJvb2xlYW4gaXNFamJNb2R1bGVzKCkgewoJCXJldHVybiBlamJNb2R1bGVzOwoJfQoKCS8qKgoJICogQHJldHVybiBTdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBuYW1lOwoJfQoKCS8qKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlcygpIHsKCQlyZXR1cm4gd2ViTW9kdWxlczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGVhck1vZHVsZXMuCgkgKiBAcGFyYW0gZWFyTW9kdWxlcyBUaGUgZWFyTW9kdWxlcyB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0RWFyTW9kdWxlcyhib29sZWFuIGVhck1vZHVsZXMpIHsKCQl0aGlzLmVhck1vZHVsZXMgPSBlYXJNb2R1bGVzOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgZWpiTW9kdWxlcy4KCSAqIEBwYXJhbSBlamJNb2R1bGVzIFRoZSBlamJNb2R1bGVzIHRvIHNldAoJICovCglwdWJsaWMgdm9pZCBzZXRFamJNb2R1bGVzKGJvb2xlYW4gZWpiTW9kdWxlcykgewoJCXRoaXMuZWpiTW9kdWxlcyA9IGVqYk1vZHVsZXM7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBuYW1lLgoJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0CgkgKi8KCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKCQl0aGlzLm5hbWUgPSBuYW1lOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgd2ViTW9kdWxlcy4KCSAqIEBwYXJhbSB3ZWJNb2R1bGVzIFRoZSB3ZWJNb2R1bGVzIHRvIHNldAoJICovCglwdWJsaWMgdm9pZCBzZXRXZWJNb2R1bGVzKGJvb2xlYW4gd2ViTW9kdWxlcykgewoJCXRoaXMud2ViTW9kdWxlcyA9IHdlYk1vZHVsZXM7Cgl9CgoJLyogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKCSAqLwoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlTdHJpbmcgeG1sID0KCQkJIlxuPHNlcnZlckRlZmluaXRpb24gIgoJCQkJKyAiXG5cdCBuYW1lPVwiIgoJCQkJKyBnZXROYW1lKCkKCQkJCSsgIlwiIgoJCQkJKyAiXG5cdCBlamJNb2R1bGVzPVwiIgoJCQkJKyBpc0VqYk1vZHVsZXMoKQoJCQkJKyAiXCIiCgkJCQkrICJcblx0IHdlYk1vZHVsZXM9XCIiCgkJCQkrIGlzV2ViTW9kdWxlcygpCgkJCQkrICJcIiIKCQkJCSsgIlxuXHQgZWFyTW9kdWxlcz1cIiIKCQkJCSsgaXNFYXJNb2R1bGVzKCkKCQkJCSsgIlwiPiI7CgkJSXRlcmF0b3IgcHJvcHMgPSBnZXRQcm9wZXJ0aWVzKCkuaXRlcmF0b3IoKTsKCQl3aGlsZSAocHJvcHMuaGFzTmV4dCgpKSB7CgkJCXhtbCArPSBwcm9wcy5uZXh0KCkudG9TdHJpbmcoKTsKCQl9CgoJCXhtbAoJCQkrPSAoIlxuPHNlcnZlckhvbWU+IgoJCQkJKyBnZXRTZXJ2ZXJIb21lKCkKCQkJCSsgIjwvc2VydmVySG9tZT4iCgkJCQkrICJcbjx3ZWJNb2R1bGVzRGVwbG95RGlyZWN0b3J5PiIKCQkJCSsgZ2V0V2ViTW9kdWxlc0RlcGxveURpcmVjdG9yeSgpCgkJCQkrICI8L3dlYk1vZHVsZXNEZXBsb3lEaXJlY3Rvcnk+IgoJCQkJKyAiXG48ZWpiTW9kdWxlc0RlcGxveURpcmVjdG9yeT4iCgkJCQkrIGdldEVqYk1vZHVsZXNEZXBsb3lEaXJlY3RvcnkoKQoJCQkJKyAiPC9lamJNb2R1bGVzRGVwbG95RGlyZWN0b3J5PiIKCQkJCSsgIlxuPGVhck1vZHVsZXNEZXBsb3lEaXJlY3Rvcnk+IgoJCQkJKyBnZXRFYXJNb2R1bGVzRGVwbG95RGlyZWN0b3J5KCkKCQkJCSsgIjwvZWFyTW9kdWxlc0RlcGxveURpcmVjdG9yeT4iCgkJCQkrICJcbjxqbmRpSW5pdGlhbENvbnRleHRGYWN0b3J5PiIKCQkJCSsgZ2V0Sm5kaUluaXRpYWxDb250ZXh0RmFjdG9yeSgpCgkJCQkrICI8L2puZGlJbml0aWFsQ29udGV4dEZhY3Rvcnk+IgoJCQkJKyAiXG48am5kaVByb3ZpZGVyVXJsPiIKCQkJCSsgZ2V0Sm5kaVByb3ZpZGVyVXJsKCkKCQkJCSsgIjwvam5kaVByb3ZpZGVyVXJsPiIKCQkJCSsgIlxuPHN0YXJ0Q2xhc3M+IgoJCQkJKyBnZXRTdGFydENsYXNzKCkKCQkJCSsgIjwvc3RhcnRDbGFzcz4iCgkJCQkrICJcbjxzdGFydFdvcmtpbmdEaXJlY3Rvcnk+IgoJCQkJKyBnZXRTdGFydFdvcmtpbmdEaXJlY3RvcnkoKQoJCQkJKyAiPC9zdGFydFdvcmtpbmdEaXJlY3Rvcnk+IgoJCQkJKyAiXG48c3RhcnRWbVBhcmFtZXRlcnM+IgoJCQkJKyBnZXRTdGFydFZtUGFyYW1ldGVycygpCgkJCQkrICI8L3N0YXJ0Vm1QYXJhbWV0ZXJzPiIKCQkJCSsgIlxuPHN0YXJ0UHJvZ3JhbUFyZ3VtZW50cz4iCgkJCQkrIGdldFN0YXJ0UHJvZ3JhbUFyZ3VtZW50cygpCgkJCQkrICI8L3N0YXJ0UHJvZ3JhbUFyZ3VtZW50cz4iCgkJCQkrICJcbjxzdG9wQ2xhc3M+IgoJCQkJKyBnZXRTdG9wQ2xhc3MoKQoJCQkJKyAiPC9zdG9wQ2xhc3M+IgoJCQkJKyAiXG48c3RvcFdvcmtpbmdEaXJlY3Rvcnk+IgoJCQkJKyBnZXRTdG9wV29ya2luZ0RpcmVjdG9yeSgpCgkJCQkrICI8L3N0b3BXb3JraW5nRGlyZWN0b3J5PiIKCQkJCSsgIlxuPHN0b3BWbVBhcmFtZXRlcnM+IgoJCQkJKyBnZXRTdG9wVm1QYXJhbWV0ZXJzKCkKCQkJCSsgIjwvc3RvcFZtUGFyYW1ldGVycz4iCgkJCQkrICJcbjxzdG9wUHJvZ3JhbUFyZ3VtZW50cz4iCgkJCQkrIGdldFN0b3BQcm9ncmFtQXJndW1lbnRzKCkKCQkJCSsgIjwvc3RvcFByb2dyYW1Bcmd1bWVudHM+Iik7CgoJCXhtbCArPSAiXG48c2VydmVyQ2xhc3NQYXRoPiI7CgkJcHJvcHMgPSBnZXRTZXJ2ZXJDbGFzc1BhdGgoKS5pdGVyYXRvcigpOwoJCXdoaWxlIChwcm9wcy5oYXNOZXh0KCkpIHsKCQkJeG1sICs9ICJcblx0IiArIHByb3BzLm5leHQoKS50b1N0cmluZygpOwoJCX0KCQl4bWwgKz0gIlxuPC9zZXJ2ZXJDbGFzc1BhdGg+IjsKCgkJeG1sICs9ICJcbjxjbGllbnRDbGFzc1BhdGg+IjsKCQlwcm9wcyA9IGdldENsaWVudENsYXNzUGF0aCgpLml0ZXJhdG9yKCk7CgkJd2hpbGUgKHByb3BzLmhhc05leHQoKSkgewoJCQl4bWwgKz0gIlxuXHQiICsgcHJvcHMubmV4dCgpLnRvU3RyaW5nKCk7CgkJfQoJCXhtbCArPSAiXG48L2NsaWVudENsYXNzUGF0aD4iOwoKCQl4bWwgKz0gIlxuPHByb2plY3RDbGFzc1BhdGg+IjsKCQlwcm9wcyA9IGdldFByb2plY3RDbGFzc1BhdGgoKS5pdGVyYXRvcigpOwoJCXdoaWxlIChwcm9wcy5oYXNOZXh0KCkpIHsKCQkJeG1sICs9ICJcblx0IiArIHByb3BzLm5leHQoKS50b1N0cmluZygpOwoJCX0KCQl4bWwgKz0gIlxuPC9wcm9qZWN0Q2xhc3NQYXRoPiI7CgoJCWlmKCBnZXRBZG1pblRvb2woKS5pc0RlZmluZWQoKSApCgkJCXhtbCArPSBnZXRBZG1pblRvb2woKS50b1N0cmluZygpOwkJCQkKCQkKCQl4bWwgKz0gIlxuPC9zZXJ2ZXJEZWZpbml0aW9uPiI7CgkJcmV0dXJuIHhtbDsKCX0KCgkvKioKCSAqIEByZXR1cm4gU3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRXb3JraW5nRGlyZWN0b3J5KCkgewoJCXJldHVybiBzdGFydFdvcmtpbmdEaXJlY3Rvcnk7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIFN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldFN0b3BXb3JraW5nRGlyZWN0b3J5KCkgewoJCXJldHVybiBzdG9wV29ya2luZ0RpcmVjdG9yeTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHN0YXJ0V29ya2luZ0RpcmVjdG9yeS4KCSAqIEBwYXJhbSBzdGFydFdvcmtpbmdEaXJlY3RvcnkgVGhlIHN0YXJ0V29ya2luZ0RpcmVjdG9yeSB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0U3RhcnRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyBzdGFydFdvcmtpbmdEaXJlY3RvcnkpIHsKCQl0aGlzLnN0YXJ0V29ya2luZ0RpcmVjdG9yeSA9IHN0YXJ0V29ya2luZ0RpcmVjdG9yeTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHN0b3BXb3JraW5nRGlyZWN0b3J5LgoJICogQHBhcmFtIHN0b3BXb3JraW5nRGlyZWN0b3J5IFRoZSBzdG9wV29ya2luZ0RpcmVjdG9yeSB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0U3RvcFdvcmtpbmdEaXJlY3RvcnkoU3RyaW5nIHN0b3BXb3JraW5nRGlyZWN0b3J5KSB7CgkJdGhpcy5zdG9wV29ya2luZ0RpcmVjdG9yeSA9IHN0b3BXb3JraW5nRGlyZWN0b3J5OwoJfQoKCS8qKgoJICogQHJldHVybiBTdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXRKbmRpSW5pdGlhbENvbnRleHRGYWN0b3J5KCkgewoJCXJldHVybiBqbmRpSW5pdGlhbENvbnRleHRGYWN0b3J5OwoJfQoKCS8qKgoJICogQHJldHVybiBTdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXRKbmRpUHJvdmlkZXJVcmwoKSB7CgkJcmV0dXJuIGpuZGlQcm92aWRlclVybDsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGpuZGlJbml0aWFsQ29udGV4dEZhY3RvcnkuCgkgKiBAcGFyYW0gam5kaUluaXRpYWxDb250ZXh0RmFjdG9yeSBUaGUgam5kaUluaXRpYWxDb250ZXh0RmFjdG9yeSB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0Sm5kaUluaXRpYWxDb250ZXh0RmFjdG9yeShTdHJpbmcgam5kaUluaXRpYWxDb250ZXh0RmFjdG9yeSkgewoJCXRoaXMuam5kaUluaXRpYWxDb250ZXh0RmFjdG9yeSA9IGpuZGlJbml0aWFsQ29udGV4dEZhY3Rvcnk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBqbmRpUHJvdmlkZXJVcmwuCgkgKiBAcGFyYW0gam5kaVByb3ZpZGVyVXJsIFRoZSBqbmRpUHJvdmlkZXJVcmwgdG8gc2V0CgkgKi8KCXB1YmxpYyB2b2lkIHNldEpuZGlQcm92aWRlclVybChTdHJpbmcgam5kaVByb3ZpZGVyVXJsKSB7CgkJdGhpcy5qbmRpUHJvdmlkZXJVcmwgPSBqbmRpUHJvdmlkZXJVcmw7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIEZpbGUKCSAqLwoJcHVibGljIEZpbGUgZ2V0RGVmaW5pdGlvbkZpbGUoKSB7CgkJcmV0dXJuIGRlZmluaXRpb25GaWxlOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgZGVmaW5pdGlvbkZpbGUuCgkgKiBAcGFyYW0gZGVmaW5pdGlvbkZpbGUgVGhlIGRlZmluaXRpb25GaWxlIHRvIHNldAoJICovCglwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uRmlsZShGaWxlIGRlZmluaXRpb25GaWxlKSB7CgkJdGhpcy5kZWZpbml0aW9uRmlsZSA9IGRlZmluaXRpb25GaWxlOwoJfQoKCglwdWJsaWMgU3RyaW5nIHJlc29sdmVQcm9wZXJ0aWVzKAoJCVN0cmluZyBwcm9wcGVkU3RyaW5nKSB7CgkJSGFzaE1hcCBjYWNoZSA9IG5ldyBIYXNoTWFwKGdldFByb3BlcnRpZXMoKS5zaXplKCkpOwoJCUl0ZXJhdG9yIGl0ciA9IGdldFByb3BlcnRpZXMoKS5pdGVyYXRvcigpOwoJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CgkJCVNlcnZlclR5cGVEZWZpbml0aW9uUHJvcGVydHkgZWxlbWVudCA9CgkJCQkoU2VydmVyVHlwZURlZmluaXRpb25Qcm9wZXJ0eSkgaXRyLm5leHQoKTsKCQkJY2FjaGUucHV0KGVsZW1lbnQuZ2V0SWQoKSwgZWxlbWVudC5nZXREZWZhdWx0VmFsdWUoKSk7CgkJfQoJCS8vU3RyaW5nIHZtUGF0aCA9IGluc3RhbGwuZ2V0SW5zdGFsbExvY2F0aW9uKCkuZ2V0Q2Fub25pY2FsUGF0aCgpOwoJCS8vdm1QYXRoID0gdm1QYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKCQljYWNoZS5wdXQoImpyZVBhdGgiLCAiSlJFIik7CgoJCVN0cmluZyBzdHIgPSByZXNvbHZlUHJvcGVydGllc0Zyb21DYWNoZShwcm9wcGVkU3RyaW5nLCBjYWNoZSk7CgkJc3RyID0gZml4UGFzc3Rocm91Z2hQcm9wZXJ0aWVzKHN0cik7CgkJcmV0dXJuIHN0cjsKCX0KCgkvKioKCSAqIEBwYXJhbSBzdHIKCSAqIEByZXR1cm4KCSAqLwoJcHJpdmF0ZSBTdHJpbmcgZml4UGFzc3Rocm91Z2hQcm9wZXJ0aWVzKFN0cmluZyBzdHIpIHsKCQlTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSBzdHI7CgkJaWYgKGlzUGFzc1Byb3BlcnR5TGVmdChyZXNvbHZlZFN0cmluZykpIHsKCQkJcmVzb2x2ZWRTdHJpbmcgPSBmaXhQYXJhbShyZXNvbHZlZFN0cmluZyk7CgkJCXJlc29sdmVkU3RyaW5nID0gZml4UGFzc3Rocm91Z2hQcm9wZXJ0aWVzKHJlc29sdmVkU3RyaW5nKTsKCQl9CgkJcmV0dXJuIHJlc29sdmVkU3RyaW5nOwoJfQoKCXByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9wZXJ0aWVzRnJvbUNhY2hlKAoJCVN0cmluZyBwcm9wcGVkU3RyaW5nLAoJCUhhc2hNYXAgY2FjaGUpIHsKCQlTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSBwcm9wcGVkU3RyaW5nOwoJCWlmIChpc1Byb3BlcnR5TGVmdChyZXNvbHZlZFN0cmluZykpIHsKCQkJcmVzb2x2ZWRTdHJpbmcgPSByZXNvbHZlUHJvcGVydHkocmVzb2x2ZWRTdHJpbmcsIGNhY2hlKTsKCQkJcmVzb2x2ZWRTdHJpbmcgPSByZXNvbHZlUHJvcGVydGllc0Zyb21DYWNoZShyZXNvbHZlZFN0cmluZywgY2FjaGUpOwoJCX0KCQlyZXR1cm4gcmVzb2x2ZWRTdHJpbmc7Cgl9CgoJcHJpdmF0ZSBib29sZWFuIGlzUHJvcGVydHlMZWZ0KFN0cmluZyBzdHIpIHsKCQlyZXR1cm4gc3RyLmluZGV4T2YoIiR7IikgPj0gMDsKCX0KCXByaXZhdGUgYm9vbGVhbiBpc1Bhc3NQcm9wZXJ0eUxlZnQoU3RyaW5nIHN0cikgewoJCXJldHVybiBzdHIuaW5kZXhPZigiJXsiKSA+PSAwOwoJfQoKCXByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9wZXJ0eShTdHJpbmcgcHJvcHBlZFN0cmluZywgSGFzaE1hcCBjYWNoZSkgewoJCVN0cmluZyBzdHIgPSBwcm9wcGVkU3RyaW5nOwoJCWludCBzdGFydCA9IHN0ci5pbmRleE9mKCIkeyIpOwoJCWludCBlbmQgPSBzdHIuaW5kZXhPZigifSIsIHN0YXJ0KTsKCQlTdHJpbmcga2V5ID0gc3RyLnN1YnN0cmluZyhzdGFydCArIDIsIGVuZCk7CgoJCXJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHN0YXJ0KQoJCQkrIGNhY2hlLmdldChrZXkpCgkJCSsgc3RyLnN1YnN0cmluZyhlbmQgKyAxKTsKCX0KCQoJcHJpdmF0ZSBTdHJpbmcgZml4UGFyYW0oU3RyaW5nIHByb3BwZWRTdHJpbmcpIHsKCQlTdHJpbmcgc3RyID0gcHJvcHBlZFN0cmluZzsKCQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZigiJXsiKTsKCQlyZXR1cm4gc3RyLnN1YnN0cmluZygwLCBzdGFydCkKCQkJKyAiJHsiCgkJCSsgc3RyLnN1YnN0cmluZyhzdGFydCsyKTsKCX0KCQoJLyoqCgkgKiBAcmV0dXJuIFN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldFNlcnZlckhvbWUoKSB7CgkJcmV0dXJuIHNlcnZlckhvbWU7Cgl9CgoJcHVibGljIHZvaWQgc2V0U2VydmVySG9tZShTdHJpbmcgc2VydmVySG9tZSkgewoJCXRoaXMuc2VydmVySG9tZSA9IHNlcnZlckhvbWU7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBTZXJ2ZXJBZG1pblRvb2wgZ2V0QWRtaW5Ub29sKCkgewoJCXJldHVybiBhZG1pblRvb2w7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gdG9vbAoJICovCglwdWJsaWMgdm9pZCBzZXRBZG1pblRvb2woU2VydmVyQWRtaW5Ub29sIHRvb2wpIHsKCQlhZG1pblRvb2wgPSB0b29sOwoJfQoKCgoJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKCXsKCQlTZXJ2ZXJUeXBlRGVmaW5pdGlvblByb3BlcnR5IHByb3AgPSBnZXRQcm9wZXJ0eU5hbWVkKChTdHJpbmcpaWQpOwoJCWlmKHByb3AgIT0gbnVsbCkKCQkJcmV0dXJuIHByb3AuZ2V0RGVmYXVsdFZhbHVlKCk7CgkJZWxzZQoJCQlyZXR1cm4gbnVsbDsKCX0KCglwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkKCXsKCQlTZXJ2ZXJUeXBlRGVmaW5pdGlvblByb3BlcnR5IHByb3AgPSBnZXRQcm9wZXJ0eU5hbWVkKChTdHJpbmcpaWQpOwoJCXJldHVybiAocHJvcCAhPSBudWxsKTsKCX0KCglwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQoJewoJCVNlcnZlclR5cGVEZWZpbml0aW9uUHJvcGVydHkgcHJvcCA9IGdldFByb3BlcnR5TmFtZWQoKFN0cmluZylpZCk7CgkJaW50IGlkeCA9IGdldFByb3BlcnRpZXMoKS5pbmRleE9mKHByb3ApOwoJCWlmKGlkeCA+PSAwKQoJCXsKCQkJcHJvcC5zZXREZWZhdWx0VmFsdWUoKFN0cmluZyl2YWx1ZSk7CgkJCWdldFByb3BlcnRpZXMoKS5zZXQoaWR4LCBwcm9wKTsKCQl9Cgl9CgkvKioKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRQb3J0KCkgewoJCVNlcnZlclR5cGVEZWZpbml0aW9uUHJvcGVydHkgcHJvcCA9CgkJCWdldFByb3BlcnR5TmFtZWQoInBvcnQiKTsKCQlpZiAocHJvcCAhPSBudWxsKQoJCQlyZXR1cm4gcHJvcC5nZXREZWZhdWx0VmFsdWUoKTsKCQlyZXR1cm4gbnVsbDsKCX0KCgp9Cg==