LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci8qKgogKiBIZWxwZXIgY2xhc3MgdGhhdCBzdG9yZXMgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3IKICogdGhlIHNlcnZlciB0b29scy4KICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJVSVByZWZlcmVuY2VzIHsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BST01QVF9JUlJFVkVSU0lCTEUgPSAicHJvbXB0LWlycmV2ZXJzaWJsZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9JTVBPUlRfTE9DQVRJT04gPSAiaW1wb3J0LWxvY2F0aW9uIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NBVkVfRURJVE9SUyA9ICJzYXZlLWVkaXRvcnMiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSE9TVF9OQU1FUyA9ICJob3N0LW5hbWVzIjsKCglwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0FWRV9FRElUT1JTX05FVkVSID0gMDsKCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTQVZFX0VESVRPUlNfUFJPTVBUID0gMTsKCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTQVZFX0VESVRPUlNfQVVUTyA9IDI7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9IT1NUTkFNRVMgPSAxMDsKCglwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwoKCS8qKgoJICogU2VydmVyVUlQcmVmZXJlbmNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBTZXJ2ZXJVSVByZWZlcmVuY2VzKCkgewoJCXN1cGVyKCk7CgkJcHJlZmVyZW5jZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Cgl9CgoJcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1BST01QVF9JUlJFVkVSU0lCTEUsIGdldERlZmF1bHRQcm9tcHRCZWZvcmVJcnJldmVyc2libGVDaGFuZ2UoKSk7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1NBVkVfRURJVE9SUywgZ2V0RGVmYXVsdFNhdmVFZGl0b3JzKCkpOwoJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9IT1NUX05BTUVTLCAibG9jYWxob3N0Iik7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIGJlZm9yZSBtYWtpbmcgYW4KCSAqIGlycmV2ZXJzaWJsZSBjaGFuZ2UgaW4gdGhlIGVkaXRvci4KCSAqIAoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGdldFByb21wdEJlZm9yZUlycmV2ZXJzaWJsZUNoYW5nZSgpIHsKCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX1BST01QVF9JUlJFVkVSU0lCTEUpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZAoJICogYmVmb3JlIG1ha2luZyBhbiBpcnJldmVyc2libGUgY2hhbmdlIGluIHRoZSBlZGl0b3IuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRQcm9tcHRCZWZvcmVJcnJldmVyc2libGVDaGFuZ2UoKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBTZXRzIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIGJlZm9yZSBtYWtpbmcgYW4KCSAqIGlycmV2ZXJzaWJsZSBjaGFuZ2UgaW4gdGhlIGVkaXRvci4KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIHZvaWQgc2V0UHJvbXB0QmVmb3JlSXJyZXZlcnNpYmxlQ2hhbmdlKGJvb2xlYW4gYikgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfUFJPTVBUX0lSUkVWRVJTSUJMRSwgYik7CgkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbG9jYXRpb24uCgkgKgoJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0TG9jYXRpb24oKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldFN0cmluZyhQUkVGX0lNUE9SVF9MT0NBVElPTik7Cgl9CgkKCS8qKgoJICogU2V0cyB0aGUgaW1wb3J0IGxvY2F0aW9uLgoJICoKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgdm9pZCBzZXRJbXBvcnRMb2NhdGlvbihTdHJpbmcgcykgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfSU1QT1JUX0xPQ0FUSU9OLCBzKTsKCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3Igc2F2aW5nIGVkaXRvcnMgYmVmb3JlIGxhdW5jaGluZy4KCSAqIAoJICogQHJldHVybiBieXRlCgkgKi8KCXB1YmxpYyBieXRlIGdldERlZmF1bHRTYXZlRWRpdG9ycygpIHsKCQlyZXR1cm4gU0FWRV9FRElUT1JTX1BST01QVDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIHNhdmluZyBlZGl0b3JzIGJlZm9yZSBsYXVuY2hpbmcuCgkgKiAKCSAqIEByZXR1cm4gYnl0ZQoJICovCglwdWJsaWMgYnl0ZSBnZXRTYXZlRWRpdG9ycygpIHsKCQlyZXR1cm4gKGJ5dGUpIHByZWZlcmVuY2VzLmdldEludChQUkVGX1NBVkVfRURJVE9SUyk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSB2YWx1ZSBmb3Igc2F2aW5nIGVkaXRvcnMgYmVmb3JlIGxhdW5jaGluZy4KCSAqIAoJICogQHBhcmFtIGJ5dGUKCSAqLwoJcHVibGljIHZvaWQgc2V0U2F2ZUVkaXRvcnMoYnl0ZSBiKSB7CgkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9TQVZFX0VESVRPUlMsIGIpOwoJCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgbW9zdCByZWNlbnRseSB1c2VkIGhvc3RuYW1lcy4KCSAqIAoJICogQHJldHVybgoJICovCglwdWJsaWMgTGlzdCBnZXRIb3N0bmFtZXMoKSB7CgkJU3RyaW5nIHMgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUFJFRl9IT1NUX05BTUVTKTsKCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICJ8KnwiKTsKCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewoJCQlsaXN0LmFkZChzdC5uZXh0VG9rZW4oKSk7CgkJfQoJCXJldHVybiBsaXN0OwoJfQoKCS8qKgoJICogQWRkIGEgbmV3IGhvc3RuYW1lIHRvIHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgbGlzdC4KCSAqICAKCSAqIEBwYXJhbSBob3N0bmFtZQoJICovCglwdWJsaWMgdm9pZCBhZGRIb3N0bmFtZShTdHJpbmcgaG9zdG5hbWUpIHsKCQlMaXN0IGxpc3QgPSBnZXRIb3N0bmFtZXMoKTsKCQkKCQkvLyByZW1vdmUgZHVwbGljYXRlcwoJCWlmIChsaXN0LmNvbnRhaW5zKGhvc3RuYW1lKSkKCQkJbGlzdC5yZW1vdmUoaG9zdG5hbWUpOwoJCQoJCS8vIGFsd2F5cyBhZGQgc2Vjb25kIChsZWF2ZSBsb2NhbGhvc3QgZmlyc3QpCgkJbGlzdC5hZGQoMSwgaG9zdG5hbWUpOwoJCQoJCS8vIHJlbW92ZSBsZWFzdCB1c2VkIGhvc3RuYW1lCgkJaWYgKGxpc3Quc2l6ZSgpID4gTUFYX0hPU1ROQU1FUykKCQkJbGlzdC5yZW1vdmUobGlzdC5zaXplKCkgLSAxKTsKCQkKCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQlTdHJpbmcgcyA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKCQkJc2IuYXBwZW5kKHMpOwoJCQlzYi5hcHBlbmQoInwqfCIpOwoJCX0KCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0hPU1RfTkFNRVMsIHNiLnRvU3RyaW5nKCkpOwoJCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Cgl9Cn0=