LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IEZ1bmRhY2nzbiBUZWNuYWxpYSBSZXNlYXJjaCAmIElubm92YXRpb24uCiAqCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBIdWFzY2FyIEVzcGlub3phIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgTWFyaSBDYXJtZW4gUGFsYWNpb3MgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIEdlbmVyYXRlZCB3aXRoIEFjY2VsZW8KICovCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLnByb3ZpZGVyczsKCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuYXBpLmNvbXBvbmVudC5JUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQ7CgppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmNvbnRleHQuUHJvcGVydGllc0VkaXRpbmdDb250ZXh0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLnV0aWxzLkVFRlV0aWxzOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5wcm92aWRlcnMuUHJvcGVydGllc0VkaXRpbmdQcm92aWRlcjsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUucHJvdmlkZXJzLmltcGwuUHJvcGVydGllc0VkaXRpbmdQcm92aWRlckltcGw7CgppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwoKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5BcnRlZmFjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5FdmlkZW5jZVBhY2thZ2U7CgppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLmNvbXBvbmVudHMuQXJ0ZWZhY3RBcnRlZmFjdEV2YWx1YXRpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5jb21wb25lbnRzLkFydGVmYWN0QXJ0ZWZhY3RFdmVudHNQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5jb21wb25lbnRzLkFydGVmYWN0QXJ0ZWZhY3RQcm9wZXJ0eVZhbHVlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuY29tcG9uZW50cy5BcnRlZmFjdEFydGVmYWN0VmVyc2lvblByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLmNvbXBvbmVudHMuQXJ0ZWZhY3RCYXNlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuY29tcG9uZW50cy5BcnRlZmFjdFByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50OwoKLyoqCiAqIAogKiAKICovCnB1YmxpYyBjbGFzcyBBcnRlZmFjdFByb3BlcnRpZXNFZGl0aW9uUHJvdmlkZXIgZXh0ZW5kcyBQcm9wZXJ0aWVzRWRpdGluZ1Byb3ZpZGVySW1wbCB7CgoJLyoqCgkgKiBDb25zdHJ1Y3RvciB3aXRob3V0IHByb3ZpZGVyIGZvciBzdXBlciB0eXBlcy4KCSAqLwoJcHVibGljIEFydGVmYWN0UHJvcGVydGllc0VkaXRpb25Qcm92aWRlcigpIHsKCQlzdXBlcigpOwoJfQoKCS8qKgoJICogQ29uc3RydWN0b3Igd2l0aCBwcm92aWRlcnMgZm9yIHN1cGVyIHR5cGVzLgoJICogQHBhcmFtIHN1cGVyUHJvdmlkZXJzIHByb3ZpZGVycyB0byB1c2UgZm9yIHN1cGVyIHR5cGVzLgoJICovCglwdWJsaWMgQXJ0ZWZhY3RQcm9wZXJ0aWVzRWRpdGlvblByb3ZpZGVyKExpc3Q8UHJvcGVydGllc0VkaXRpbmdQcm92aWRlcj4gc3VwZXJQcm92aWRlcnMpIHsKCQlzdXBlcihzdXBlclByb3ZpZGVycyk7Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5wcm92aWRlcnMuUHJvcGVydGllc0VkaXRpbmdQcm92aWRlciNwcm92aWRlcyhvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuY29udGV4dC5Qcm9wZXJ0aWVzRWRpdGluZ0NvbnRleHQpCgkgKiAKCSAqLwoJcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoUHJvcGVydGllc0VkaXRpbmdDb250ZXh0IGVkaXRpbmdDb250ZXh0KSB7CgkJcmV0dXJuIChlZGl0aW5nQ29udGV4dC5nZXRFT2JqZWN0KCkgaW5zdGFuY2VvZiBBcnRlZmFjdCkgCgkJCQkJJiYgKEV2aWRlbmNlUGFja2FnZS5MaXRlcmFscy5BUlRFRkFDVCA9PSBlZGl0aW5nQ29udGV4dC5nZXRFT2JqZWN0KCkuZUNsYXNzKCkpOwoJfQoKCS8qKgoJICoge0Bpbmhlcml0RG9jfQoJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUucHJvdmlkZXJzLlByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIjcHJvdmlkZXMob3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmNvbnRleHQuUHJvcGVydGllc0VkaXRpbmdDb250ZXh0LCBqYXZhLmxhbmcuU3RyaW5nKQoJICogCgkgKi8KCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKFByb3BlcnRpZXNFZGl0aW5nQ29udGV4dCBlZGl0aW5nQ29udGV4dCwgU3RyaW5nIHBhcnQpIHsKCQlyZXR1cm4gKGVkaXRpbmdDb250ZXh0LmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIEFydGVmYWN0KSAmJiAoQXJ0ZWZhY3RCYXNlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuQkFTRV9QQVJULmVxdWFscyhwYXJ0KSB8fCBBcnRlZmFjdEFydGVmYWN0VmVyc2lvblByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LkFSVEVGQUNUVkVSU0lPTl9QQVJULmVxdWFscyhwYXJ0KSB8fCBBcnRlZmFjdEFydGVmYWN0UHJvcGVydHlWYWx1ZVByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LkFSVEVGQUNUUFJPUEVSVFlWQUxVRV9QQVJULmVxdWFscyhwYXJ0KSB8fCBBcnRlZmFjdEFydGVmYWN0RXZhbHVhdGlvblByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LkFSVEVGQUNURVZBTFVBVElPTl9QQVJULmVxdWFscyhwYXJ0KSB8fCBBcnRlZmFjdEFydGVmYWN0RXZlbnRzUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuQVJURUZBQ1RFVkVOVFNfUEFSVC5lcXVhbHMocGFydCkpOwoJfQoKCS8qKgoJICoge0Bpbmhlcml0RG9jfQoJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUucHJvdmlkZXJzLlByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIjcHJvdmlkZXMob3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmNvbnRleHQuUHJvcGVydGllc0VkaXRpbmdDb250ZXh0LCBqYXZhLmxhbmcuQ2xhc3MpCgkgKiAKCSAqLwoJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKFByb3BlcnRpZXNFZGl0aW5nQ29udGV4dCBlZGl0aW5nQ29udGV4dCwgamF2YS5sYW5nLkNsYXNzIHJlZmluZW1lbnQpIHsKCQlyZXR1cm4gKGVkaXRpbmdDb250ZXh0LmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIEFydGVmYWN0KSAmJiAocmVmaW5lbWVudCA9PSBBcnRlZmFjdEJhc2VQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcyB8fCByZWZpbmVtZW50ID09IEFydGVmYWN0QXJ0ZWZhY3RWZXJzaW9uUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuY2xhc3MgfHwgcmVmaW5lbWVudCA9PSBBcnRlZmFjdEFydGVmYWN0UHJvcGVydHlWYWx1ZVByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LmNsYXNzIHx8IHJlZmluZW1lbnQgPT0gQXJ0ZWZhY3RBcnRlZmFjdEV2YWx1YXRpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcyB8fCByZWZpbmVtZW50ID09IEFydGVmYWN0QXJ0ZWZhY3RFdmVudHNQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcyk7Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5wcm92aWRlcnMuUHJvcGVydGllc0VkaXRpbmdQcm92aWRlciNwcm92aWRlcyhvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuY29udGV4dC5Qcm9wZXJ0aWVzRWRpdGluZ0NvbnRleHQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5DbGFzcykKCSAqIAoJICovCglAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQoJcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoUHJvcGVydGllc0VkaXRpbmdDb250ZXh0IGVkaXRpbmdDb250ZXh0LCBTdHJpbmcgcGFydCwgamF2YS5sYW5nLkNsYXNzIHJlZmluZW1lbnQpIHsKCQlyZXR1cm4gKGVkaXRpbmdDb250ZXh0LmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIEFydGVmYWN0KSAmJiAoKEFydGVmYWN0QmFzZVByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LkJBU0VfUEFSVC5lcXVhbHMocGFydCkgJiYgcmVmaW5lbWVudCA9PSBBcnRlZmFjdEJhc2VQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcykgfHwgKEFydGVmYWN0QXJ0ZWZhY3RWZXJzaW9uUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuQVJURUZBQ1RWRVJTSU9OX1BBUlQuZXF1YWxzKHBhcnQpICYmIHJlZmluZW1lbnQgPT0gQXJ0ZWZhY3RBcnRlZmFjdFZlcnNpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcykgfHwgKEFydGVmYWN0QXJ0ZWZhY3RQcm9wZXJ0eVZhbHVlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuQVJURUZBQ1RQUk9QRVJUWVZBTFVFX1BBUlQuZXF1YWxzKHBhcnQpICYmIHJlZmluZW1lbnQgPT0gQXJ0ZWZhY3RBcnRlZmFjdFByb3BlcnR5VmFsdWVQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcykgfHwgKEFydGVmYWN0QXJ0ZWZhY3RFdmFsdWF0aW9uUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuQVJURUZBQ1RFVkFMVUFUSU9OX1BBUlQuZXF1YWxzKHBhcnQpICYmIHJlZmluZW1lbnQgPT0gQXJ0ZWZhY3RBcnRlZmFjdEV2YWx1YXRpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcykgfHwgKEFydGVmYWN0QXJ0ZWZhY3RFdmVudHNQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5BUlRFRkFDVEVWRU5UU19QQVJULmVxdWFscyhwYXJ0KSAmJiByZWZpbmVtZW50ID09IEFydGVmYWN0QXJ0ZWZhY3RFdmVudHNQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcykpOwoJfQoKCS8qKgoJICoge0Bpbmhlcml0RG9jfQoJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUucHJvdmlkZXJzLlByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIjZ2V0UHJvcGVydGllc0VkaXRpbmdDb21wb25lbnQob3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmNvbnRleHQuUHJvcGVydGllc0VkaXRpbmdDb250ZXh0LCBqYXZhLmxhbmcuU3RyaW5nKQoJICogCgkgKi8KCXB1YmxpYyBJUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQgZ2V0UHJvcGVydGllc0VkaXRpbmdDb21wb25lbnQoUHJvcGVydGllc0VkaXRpbmdDb250ZXh0IGVkaXRpbmdDb250ZXh0LCBTdHJpbmcgbW9kZSkgewoJCWlmIChlZGl0aW5nQ29udGV4dC5nZXRFT2JqZWN0KCkgaW5zdGFuY2VvZiBBcnRlZmFjdCkgewoJCQlyZXR1cm4gbmV3IEFydGVmYWN0UHJvcGVydGllc0VkaXRpb25Db21wb25lbnQoZWRpdGluZ0NvbnRleHQsIGVkaXRpbmdDb250ZXh0LmdldEVPYmplY3QoKSwgbW9kZSk7CgkJfQoJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0aWVzRWRpdGluZ0NvbXBvbmVudChlZGl0aW5nQ29udGV4dCwgbW9kZSk7Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5wcm92aWRlcnMuUHJvcGVydGllc0VkaXRpbmdQcm92aWRlciNnZXRQcm9wZXJ0aWVzRWRpdGluZ0NvbXBvbmVudChvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuY29udGV4dC5Qcm9wZXJ0aWVzRWRpdGluZ0NvbnRleHQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCgkgKiAKCSAqLwoJcHVibGljIElQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCBnZXRQcm9wZXJ0aWVzRWRpdGluZ0NvbXBvbmVudChQcm9wZXJ0aWVzRWRpdGluZ0NvbnRleHQgZWRpdGluZ0NvbnRleHQsIFN0cmluZyBtb2RlLCBTdHJpbmcgcGFydCkgewoJCWlmIChlZGl0aW5nQ29udGV4dC5nZXRFT2JqZWN0KCkgaW5zdGFuY2VvZiBBcnRlZmFjdCkgewoJCQlpZiAoQXJ0ZWZhY3RCYXNlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuQkFTRV9QQVJULmVxdWFscyhwYXJ0KSkKCQkJCXJldHVybiBuZXcgQXJ0ZWZhY3RCYXNlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQoZWRpdGluZ0NvbnRleHQsIGVkaXRpbmdDb250ZXh0LmdldEVPYmplY3QoKSwgbW9kZSk7CgkJCWlmIChBcnRlZmFjdEFydGVmYWN0VmVyc2lvblByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LkFSVEVGQUNUVkVSU0lPTl9QQVJULmVxdWFscyhwYXJ0KSkKCQkJCXJldHVybiBuZXcgQXJ0ZWZhY3RBcnRlZmFjdFZlcnNpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudChlZGl0aW5nQ29udGV4dCwgZWRpdGluZ0NvbnRleHQuZ2V0RU9iamVjdCgpLCBtb2RlKTsKCQkJaWYgKEFydGVmYWN0QXJ0ZWZhY3RQcm9wZXJ0eVZhbHVlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuQVJURUZBQ1RQUk9QRVJUWVZBTFVFX1BBUlQuZXF1YWxzKHBhcnQpKQoJCQkJcmV0dXJuIG5ldyBBcnRlZmFjdEFydGVmYWN0UHJvcGVydHlWYWx1ZVByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50KGVkaXRpbmdDb250ZXh0LCBlZGl0aW5nQ29udGV4dC5nZXRFT2JqZWN0KCksIG1vZGUpOwoJCQlpZiAoQXJ0ZWZhY3RBcnRlZmFjdEV2YWx1YXRpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5BUlRFRkFDVEVWQUxVQVRJT05fUEFSVC5lcXVhbHMocGFydCkpCgkJCQlyZXR1cm4gbmV3IEFydGVmYWN0QXJ0ZWZhY3RFdmFsdWF0aW9uUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQoZWRpdGluZ0NvbnRleHQsIGVkaXRpbmdDb250ZXh0LmdldEVPYmplY3QoKSwgbW9kZSk7CgkJCWlmIChBcnRlZmFjdEFydGVmYWN0RXZlbnRzUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuQVJURUZBQ1RFVkVOVFNfUEFSVC5lcXVhbHMocGFydCkpCgkJCQlyZXR1cm4gbmV3IEFydGVmYWN0QXJ0ZWZhY3RFdmVudHNQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudChlZGl0aW5nQ29udGV4dCwgZWRpdGluZ0NvbnRleHQuZ2V0RU9iamVjdCgpLCBtb2RlKTsKCQl9CgkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnRpZXNFZGl0aW5nQ29tcG9uZW50KGVkaXRpbmdDb250ZXh0LCBtb2RlLCBwYXJ0KTsKCX0KCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLnByb3ZpZGVycy5Qcm9wZXJ0aWVzRWRpdGluZ1Byb3ZpZGVyI2dldFByb3BlcnRpZXNFZGl0aW5nQ29tcG9uZW50KG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5jb250ZXh0LlByb3BlcnRpZXNFZGl0aW5nQ29udGV4dCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkNsYXNzKQoJICovCglAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQoJcHVibGljIElQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCBnZXRQcm9wZXJ0aWVzRWRpdGluZ0NvbXBvbmVudChQcm9wZXJ0aWVzRWRpdGluZ0NvbnRleHQgZWRpdGluZ0NvbnRleHQsIFN0cmluZyBtb2RlLCBTdHJpbmcgcGFydCwgamF2YS5sYW5nLkNsYXNzIHJlZmluZW1lbnQpIHsKCQlpZiAoZWRpdGluZ0NvbnRleHQuZ2V0RU9iamVjdCgpIGluc3RhbmNlb2YgQXJ0ZWZhY3QpIHsKCQkJaWYgKEFydGVmYWN0QmFzZVByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LkJBU0VfUEFSVC5lcXVhbHMocGFydCkKCQkJCSYmIHJlZmluZW1lbnQgPT0gQXJ0ZWZhY3RCYXNlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuY2xhc3MpCgkJCQlyZXR1cm4gbmV3IEFydGVmYWN0QmFzZVByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50KGVkaXRpbmdDb250ZXh0LCBlZGl0aW5nQ29udGV4dC5nZXRFT2JqZWN0KCksIG1vZGUpOwoJCQlpZiAoQXJ0ZWZhY3RBcnRlZmFjdFZlcnNpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5BUlRFRkFDVFZFUlNJT05fUEFSVC5lcXVhbHMocGFydCkKCQkJCSYmIHJlZmluZW1lbnQgPT0gQXJ0ZWZhY3RBcnRlZmFjdFZlcnNpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcykKCQkJCXJldHVybiBuZXcgQXJ0ZWZhY3RBcnRlZmFjdFZlcnNpb25Qcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudChlZGl0aW5nQ29udGV4dCwgZWRpdGluZ0NvbnRleHQuZ2V0RU9iamVjdCgpLCBtb2RlKTsKCQkJaWYgKEFydGVmYWN0QXJ0ZWZhY3RQcm9wZXJ0eVZhbHVlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuQVJURUZBQ1RQUk9QRVJUWVZBTFVFX1BBUlQuZXF1YWxzKHBhcnQpCgkJCQkmJiByZWZpbmVtZW50ID09IEFydGVmYWN0QXJ0ZWZhY3RQcm9wZXJ0eVZhbHVlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQuY2xhc3MpCgkJCQlyZXR1cm4gbmV3IEFydGVmYWN0QXJ0ZWZhY3RQcm9wZXJ0eVZhbHVlUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQoZWRpdGluZ0NvbnRleHQsIGVkaXRpbmdDb250ZXh0LmdldEVPYmplY3QoKSwgbW9kZSk7CgkJCWlmIChBcnRlZmFjdEFydGVmYWN0RXZhbHVhdGlvblByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LkFSVEVGQUNURVZBTFVBVElPTl9QQVJULmVxdWFscyhwYXJ0KQoJCQkJJiYgcmVmaW5lbWVudCA9PSBBcnRlZmFjdEFydGVmYWN0RXZhbHVhdGlvblByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LmNsYXNzKQoJCQkJcmV0dXJuIG5ldyBBcnRlZmFjdEFydGVmYWN0RXZhbHVhdGlvblByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50KGVkaXRpbmdDb250ZXh0LCBlZGl0aW5nQ29udGV4dC5nZXRFT2JqZWN0KCksIG1vZGUpOwoJCQlpZiAoQXJ0ZWZhY3RBcnRlZmFjdEV2ZW50c1Byb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50LkFSVEVGQUNURVZFTlRTX1BBUlQuZXF1YWxzKHBhcnQpCgkJCQkmJiByZWZpbmVtZW50ID09IEFydGVmYWN0QXJ0ZWZhY3RFdmVudHNQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudC5jbGFzcykKCQkJCXJldHVybiBuZXcgQXJ0ZWZhY3RBcnRlZmFjdEV2ZW50c1Byb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50KGVkaXRpbmdDb250ZXh0LCBlZGl0aW5nQ29udGV4dC5nZXRFT2JqZWN0KCksIG1vZGUpOwoJCX0KCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydGllc0VkaXRpbmdDb21wb25lbnQoZWRpdGluZ0NvbnRleHQsIG1vZGUsIHBhcnQsIHJlZmluZW1lbnQpOwoJfQoKCS8qKgoJICogUHJvdmlkZXMgdGhlIGZpbHRlciB1c2VkIGJ5IHRoZSBwbHVnaW4ueG1sIHRvIGFzc2lnbiBwYXJ0IGZvcm1zLgoJICovCglwdWJsaWMgc3RhdGljIGNsYXNzIEVkaXRpb25GaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyIHsKCQkKCQkvKioKCQkgKiB7QGluaGVyaXREb2N9CgkJICogCgkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGaWx0ZXIjc2VsZWN0KGphdmEubGFuZy5PYmplY3QpCgkJICovCgkJcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKCQkJRU9iamVjdCBlT2JqID0gRUVGVXRpbHMucmVzb2x2ZVNlbWFudGljT2JqZWN0KHRvVGVzdCk7CgkJCXJldHVybiBlT2JqICE9IG51bGwgJiYgRXZpZGVuY2VQYWNrYWdlLkxpdGVyYWxzLkFSVEVGQUNUID09IGVPYmouZUNsYXNzKCk7CgkJfQoJCQoJfQoKfQo=