LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIE1pa2HrbCBCYXJiZXJvIC0gQnVnIDQ3MDE3NQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnM7CgppbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5Kb2JDYW5jZWxhYmlsaXR5TW9uaXRvci5PcHRpb25zOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zOwppbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uc0xpc3RlbmVyOwppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7CmltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47CmltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7CgovKioKICogVGhlIGNsYXNzIGNvbnRhaW5zIGEgc2V0IG9mIGhlbHBlciBtZXRob2RzIGZvciB0aGUgcnVudGltZSBKb2JzIHBsdWdpbi4KICogVGhlIGZvbGxvd2luZyB1dGlsaXR5IG1ldGhvZHMgYXJlIHN1cHBsaWVkOgogKiAtIHByb3ZpZGVzIGFjY2VzcyB0byBkZWJ1ZyBvcHRpb25zCiAqIC0gcHJvdmlkZXMgc29tZSBidW5kbGUgZGlzY292ZXJ5IGZ1bmN0aW9uYWxpdHkKICoKICogVGhlIGNsb3NlU2VydmljZXMoKSBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHBsdWdpbiBpcyBzdG9wcGVkLgogKgogKiBAc2luY2Ugb3JnLmVjbGlwc2UuY29yZS5qb2JzIDMuMgogKi8KY2xhc3MgSm9iT1NHaVV0aWxzIHsKCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbjxEZWJ1Z09wdGlvbnNMaXN0ZW5lcj4gZGVidWdSZWdpc3RyYXRpb24gPSBudWxsOwoJcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBidW5kbGVUcmFja2VyID0gbnVsbDsKCXByaXZhdGUgU2VydmljZVRyYWNrZXIgam9iQ2FuY2VsYWJpbGl0eU1vbml0b3JPcHRpb25zVHJhY2tlciA9IG51bGw7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSm9iT1NHaVV0aWxzIHNpbmdsZXRvbiA9IG5ldyBKb2JPU0dpVXRpbHMoKTsKCgkvKioKCSAqIEFjY2Vzc29yIGZvciB0aGUgc2luZ2xldG9uIGluc3RhbmNlCgkgKiBAcmV0dXJuIFRoZSBKb2JPU0dpVXRpbHMgaW5zdGFuY2UKCSAqLwoJcHVibGljIHN0YXRpYyBKb2JPU0dpVXRpbHMgZ2V0RGVmYXVsdCgpIHsKCQlyZXR1cm4gc2luZ2xldG9uOwoJfQoKCS8qKgoJICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBibG9jayBpbnN0YW5jZSBjcmVhdGlvbi4KCSAqLwoJcHJpdmF0ZSBKb2JPU0dpVXRpbHMoKSB7CgkJc3VwZXIoKTsKCX0KCglAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKCXZvaWQgb3BlblNlcnZpY2VzKCkgewoJCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IEpvYkFjdGl2YXRvci5nZXRDb250ZXh0KCk7CgkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewoJCQlpZiAoSm9iTWFuYWdlci5ERUJVRykKCQkJCUpvYk1lc3NhZ2VzLm1lc3NhZ2UoIkpvYnNPU0dpVXRpbHMgY2FsbGVkIGJlZm9yZSBwbHVnaW4gc3RhcnRlZCIpOyAvLyROT04tTkxTLTEkCgkJCXJldHVybjsKCQl9CgoJCS8vIHJlZ2lzdGVyIGRlYnVnIG9wdGlvbnMgbGlzdGVuZXIKCQlIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlPD4oMik7CgkJcHJvcGVydGllcy5wdXQoRGVidWdPcHRpb25zLkxJU1RFTkVSX1NZTUJPTElDTkFNRSwgSm9iTWFuYWdlci5QSV9KT0JTKTsKCQlkZWJ1Z1JlZ2lzdHJhdGlvbiA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKERlYnVnT3B0aW9uc0xpc3RlbmVyLmNsYXNzLCBKb2JNYW5hZ2VyLmdldEluc3RhbmNlKCksIHByb3BlcnRpZXMpOwoKCQlidW5kbGVUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCksIG51bGwpOwoJCWJ1bmRsZVRyYWNrZXIub3BlbigpOwoKCQlqb2JDYW5jZWxhYmlsaXR5TW9uaXRvck9wdGlvbnNUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIEpvYkNhbmNlbGFiaWxpdHlNb25pdG9yLk9wdGlvbnMuY2xhc3MsIG51bGwpOwoJCWpvYkNhbmNlbGFiaWxpdHlNb25pdG9yT3B0aW9uc1RyYWNrZXIub3BlbigpOwoJfQoKCXZvaWQgY2xvc2VTZXJ2aWNlcygpIHsKCQlpZiAoZGVidWdSZWdpc3RyYXRpb24gIT0gbnVsbCkgewoJCQlkZWJ1Z1JlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyKCk7CgkJCWRlYnVnUmVnaXN0cmF0aW9uID0gbnVsbDsKCQl9CgkJaWYgKGJ1bmRsZVRyYWNrZXIgIT0gbnVsbCkgewoJCQlidW5kbGVUcmFja2VyLmNsb3NlKCk7CgkJCWJ1bmRsZVRyYWNrZXIgPSBudWxsOwoJCX0KCQlpZiAoam9iQ2FuY2VsYWJpbGl0eU1vbml0b3JPcHRpb25zVHJhY2tlciAhPSBudWxsKSB7CgkJCWpvYkNhbmNlbGFiaWxpdHlNb25pdG9yT3B0aW9uc1RyYWNrZXIuY2xvc2UoKTsKCQkJam9iQ2FuY2VsYWJpbGl0eU1vbml0b3JPcHRpb25zVHJhY2tlciA9IG51bGw7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgYnVuZGxlIGlkIG9mIHRoZSBidW5kbGUgdGhhdCBjb250YWlucyB0aGUgcHJvdmlkZWQgb2JqZWN0LCBvcgoJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJ1bmRsZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRCdW5kbGVJZChPYmplY3Qgb2JqZWN0KSB7CgkJaWYgKGJ1bmRsZVRyYWNrZXIgPT0gbnVsbCkgewoJCQlpZiAoSm9iTWFuYWdlci5ERUJVRykKCQkJCUpvYk1lc3NhZ2VzLm1lc3NhZ2UoIkJ1bmRsZSB0cmFja2VyIGlzIG5vdCBzZXQiKTsgLy8kTk9OLU5MUy0xJAoJCQlyZXR1cm4gbnVsbDsKCQl9CgkJUGFja2FnZUFkbWluIHBhY2thZ2VBZG1pbiA9IChQYWNrYWdlQWRtaW4pIGJ1bmRsZVRyYWNrZXIuZ2V0U2VydmljZSgpOwoJCWlmIChvYmplY3QgPT0gbnVsbCkKCQkJcmV0dXJuIG51bGw7CgkJaWYgKHBhY2thZ2VBZG1pbiA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCQlCdW5kbGUgc291cmNlID0gcGFja2FnZUFkbWluLmdldEJ1bmRsZShvYmplY3QuZ2V0Q2xhc3MoKSk7CgkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsKQoJCQlyZXR1cm4gc291cmNlLmdldFN5bWJvbGljTmFtZSgpOwoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogQ2FsY3VsYXRlcyB3aGV0aGVyIHRoZSBqb2IgcGx1Z2luIHNob3VsZCBzZXQgd29ya2VyIHRocmVhZHMgdG8gYmUgZGFlbW9uCgkgKiB0aHJlYWRzLiAgV2hlbiB3b3JrZXJzIGFyZSBkYWVtb24gdGhyZWFkcywgdGhlIGpvYiBwbHVnaW4gZG9lcyBub3QgbmVlZAoJICogdG8gYmUgZXhwbGljaXRseSBzaHV0IGRvd24gYmVjYXVzZSB0aGUgVk0gY2FuIGV4aXQgd2hpbGUgd29ya2VycyBhcmUgc3RpbGwKCSAqIGFsaXZlLgoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgd29ya2VyIHRocmVhZHMgc2hvdWxkIGJlIGRhZW1vbiB0aHJlYWRzLAoJICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCgkgKi8KCWJvb2xlYW4gdXNlRGFlbW9uVGhyZWFkcygpIHsKCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBKb2JBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwoJCWlmIChjb250ZXh0ID09IG51bGwpIHsKCQkJLy93ZSBhcmUgcnVubmluZyBzdGFuZC1hbG9uZSwgc28gY29uc3VsdCBnbG9iYWwgc3lzdGVtIHByb3BlcnR5CgkJCVN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShJSm9iTWFuYWdlci5QUk9QX1VTRV9EQUVNT05fVEhSRUFEUyk7CgkJCS8vZGVmYXVsdCB0byB1c2UgZGFlbW9uIHRocmVhZHMgaWYgcHJvcGVydHkgaXMgYWJzZW50CgkJCWlmICh2YWx1ZSA9PSBudWxsKQoJCQkJcmV0dXJuIHRydWU7CgkJCXJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKCQl9CgkJLy9vbmx5IHVzZSBkYWVtb24gdGhyZWFkcyBpZiB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZAoJCWZpbmFsIFN0cmluZyB2YWx1ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoSUpvYk1hbmFnZXIuUFJPUF9VU0VfREFFTU9OX1RIUkVBRFMpOwoJCS8vaWYgdmFsdWUgaXMgYWJzZW50LCBkb24ndCB1c2UgZGFlbW9uIHRocmVhZHMgdG8gbWFpbnRhaW4gbGVnYWN5IGJlaGF2aW91cgoJCWlmICh2YWx1ZSA9PSBudWxsKQoJCQlyZXR1cm4gZmFsc2U7CgkJcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgb3B0aW9ucyBmb3IgdGhlIGpvYiBjYW5jZWxhYmlsaXR5IG1vbml0b3IuIE9wdGlvbnMgaGF2ZSB0bwoJICogcmVnaXN0ZXJlZCBhcyBhbiBPU0dpIHNlcnZpY2UuCgkgKgoJICogQHJldHVybiB0aGUgb3B0aW9ucyBmb3IgdGhlIGpvYiBjYW5jZWxhYmlsaXR5IG1vbml0b3IuCgkgKi8KCUpvYkNhbmNlbGFiaWxpdHlNb25pdG9yLk9wdGlvbnMgZ2V0Sm9iQ2FuY2VsYWJpbGl0eU1vbml0b3JPcHRpb25zKCkgewoJCWZpbmFsIE9wdGlvbnMgcmV0OwoJCWlmIChqb2JDYW5jZWxhYmlsaXR5TW9uaXRvck9wdGlvbnNUcmFja2VyID09IG51bGwpIHsKCQkJcmV0ID0gbnVsbDsKCQl9IGVsc2UgewoJCQlPYmplY3Qgc2VydmljZSA9IGpvYkNhbmNlbGFiaWxpdHlNb25pdG9yT3B0aW9uc1RyYWNrZXIuZ2V0U2VydmljZSgpOwoJCQlpZiAoc2VydmljZSA9PSBudWxsKSB7CgkJCQlyZXQgPSBKb2JDYW5jZWxhYmlsaXR5TW9uaXRvci5ERUZBVUxUX09QVElPTlM7CgkJCX0gZWxzZSB7CgkJCQlyZXQgPSAoT3B0aW9ucykgc2VydmljZTsKCQkJfQoJCX0KCQlyZXR1cm4gcmV0OwoJfQp9Cg==