LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS4qOwovKioKICogCiAqLwpwdWJsaWMgY2xhc3MgTW9uaXRvcldvcmtpbmdDb3B5IGV4dGVuZHMgTW9uaXRvciBpbXBsZW1lbnRzIElNb25pdG9yV29ya2luZ0NvcHkgewoJcHJvdGVjdGVkIE1vbml0b3IgbW9uaXRvcjsKCQoJLy8gY3JlYXRpb24KCXB1YmxpYyBNb25pdG9yV29ya2luZ0NvcHkoKSB7CgkJLy8gZG8gbm90aGluZwoJfQoKCS8vIHdvcmtpbmcgY29weQoJcHVibGljIE1vbml0b3JXb3JraW5nQ29weShNb25pdG9yIG1vbml0b3IpIHsKCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwoJCXNldEludGVybmFsKG1vbml0b3IpOwoJfQoJCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmludGVybmFsLklNb25pdG9yV29ya2luZ0NvcHkjc2V0UmVtb3RlSG9zdChqYXZhLmxhbmcuU3RyaW5nKQoJICovCglwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKCQlpZCA9IG5ld0lkOwoJfQoKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuaW50ZXJuYWwuSU1vbml0b3JXb3JraW5nQ29weSNzZXRSZW1vdGVIb3N0KGphdmEubGFuZy5TdHJpbmcpCgkgKi8KCXB1YmxpYyB2b2lkIHNldFJlbW90ZUhvc3QoU3RyaW5nIGhvc3QpIHsKCQlyZW1vdGVIb3N0ID0gaG9zdDsKCX0KCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmludGVybmFsLklNb25pdG9yV29ya2luZ0NvcHkjc2V0UmVtb3RlUG9ydChpbnQpCgkgKi8KCXB1YmxpYyB2b2lkIHNldFJlbW90ZVBvcnQoaW50IHBvcnQpIHsKCQlyZW1vdGVQb3J0ID0gcG9ydDsKCX0KCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmludGVybmFsLklNb25pdG9yV29ya2luZ0NvcHkjc2V0TG9jYWxQb3J0KGludCkKCSAqLwoJcHVibGljIHZvaWQgc2V0TG9jYWxQb3J0KGludCBwb3J0KSB7CgkJbG9jYWxQb3J0ID0gcG9ydDsKCX0KCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmludGVybmFsLklNb25pdG9yV29ya2luZ0NvcHkjc2V0UHJvdG9jb2xBZGFwdGVyKElQcm90b2NvbEFkYXB0ZXIpCgkgKi8KCXB1YmxpYyB2b2lkIHNldFByb3RvY29sQWRhcHRlcihJUHJvdG9jb2xBZGFwdGVyIHByb3RvY29sQWRhcHRlcikgewoJCXR5cGUgPSBwcm90b2NvbEFkYXB0ZXI7Cgl9CgkKCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgkKCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGdldFdvcmtpbmdDb3B5KCkgewoJCXJldHVybiB0aGlzOwoJfQoJCglwdWJsaWMgSU1vbml0b3Igc2F2ZSgpIHsKCQlNb25pdG9yTWFuYWdlciBtbSA9IE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7CgkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewoJCQkvL2Jvb2xlYW4gcmVzdGFydCA9IGZhbHNlOwoJCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkgewoJCQkJLy9yZXN0YXJ0ID0gdHJ1ZTsKCQkJCW1tLnN0b3BNb25pdG9yKG1vbml0b3IpOwoJCQl9CgkJCW1vbml0b3Iuc2V0SW50ZXJuYWwodGhpcyk7CgkJCW1tLm1vbml0b3JDaGFuZ2VkKG1vbml0b3IpOwoJCQkvL2lmIChyZXN0YXJ0KQoJCQkvLwltbS5zdGFydE1vbml0b3IobW9uaXRvcik7CgkJfSBlbHNlIHsKCQkJbW9uaXRvciA9IG5ldyBNb25pdG9yKCk7CgkJCW1vbml0b3Iuc2V0SW50ZXJuYWwodGhpcyk7CgkJCW1tLmFkZE1vbml0b3IobW9uaXRvcik7CgkJfQoJCXJldHVybiBtb25pdG9yOwoJfQp9