LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKoCoKICogQ29udHJpYnV0b3JzOgogKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2U7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwppbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5PbmVWYWxpZGF0b3JPcGVyYXRpb247CmltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lDb250ZXh0OwoKLyoqCiAqIFRlc3QgZm9yIHZhbGlkYXRpb24gb2YgNTAgV1NETCBmaWxlcyBpbiB0aGUgc2FtcGxlIHdvcmtzcGFjZS4KICogCiAqIEBhdXRob3IgS2lodXAgQm9vLCBJQk0KICovCnB1YmxpYyBjbGFzcyBWYWxpZGF0ZVdTRExQcm9qZWN0VGVzdENhc2UgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKCQoJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewoJCXJldHVybiBuZXcgVGVzdFN1aXRlKFZhbGlkYXRlV1NETFByb2plY3RUZXN0Q2FzZS5jbGFzcywgIlRlc3QiKTsKCX0KCgkvKgoJICogKG5vbi1KYXZhZG9jKQoJICogCgkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCgkgKi8KCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkgICAgc3VwZXIuc2V0VXAoKTsKCQkvLyBTZXQgdGhlIFdTLUkgcHJlZmVyZW5jZSB0byBpZ25vcmUgc28gV1MtSSB2YWxpZGF0aW9uIHdpbGwgbm90IGJlIHJ1bi4KCQlXU1BsdWdpbiB3c3VpID0gV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKCQlQZXJzaXN0ZW50V1NJQ29udGV4dCB3c2ljb250ZXh0ID0gd3N1aS5nZXRXU0lTU0JQQ29udGV4dCgpOwoJCXdzaWNvbnRleHQudXBkYXRlV1NJQ29tcGxpYW5jZXMoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3RXU0RMUHJvamVjdFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlTdHJpbmcgcHJvamVjdERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicHJvamVjdERpciIpOwoJCUFzc2VydC5hc3NlcnROb3ROdWxsKHByb2plY3REaXIpOwoJCWlmICghcHJvamVjdERpci5lbmRzV2l0aCgiLyIpICYmICFwcm9qZWN0RGlyLmVuZHNXaXRoKCJcXCIpKQoJCQlwcm9qZWN0RGlyID0gcHJvamVjdERpciArICIvIjsKCQlGaWxlIGRpciA9IG5ldyBGaWxlKHByb2plY3REaXIpOwoJCWlmIChkaXIuZXhpc3RzKCkgJiYgZGlyLmlzRGlyZWN0b3J5KCkpIHsKCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgiV1NETFByb2plY3QiKTsKCQkJcHJvamVjdC5jcmVhdGUobnVsbCk7CgkJCXByb2plY3Qub3BlbihudWxsKTsKCQkJY29weShkaXIsIHByb2plY3QpOwoJCQlqb2luQmFja2dyb3VuZEpvYnMoKTsKCgkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBteVJ1bm5hYmxlID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbigKCQkJCQlwcm9qZWN0LAoJCQkJCSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2UuVmFsaWRhdG9yIiwKCQkJCQl0cnVlLCAKCQkJCQlmYWxzZSk7CgkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwoKCQkJdGFnQXNTdW1tYXJ5KCJWYWxpZGF0ZSBXU0RMIFByb2plY3QiLCBuZXcgRGltZW5zaW9uW10ge0RpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MsIERpbWVuc2lvbi5XT1JLSU5HX1NFVCB9KTsKCQkJc3RhcnRNZWFzdXJpbmcoKTsKCQkJd29ya3NwYWNlLnJ1bihteVJ1bm5hYmxlLCBudWxsKTsKCQkJLy8gcHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELG51bGwpOwoJCQlzdG9wTWVhc3VyaW5nKCk7CgkJCWNvbW1pdE1lYXN1cmVtZW50cygpOwoJCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwoJCX0gZWxzZQoJCQlmYWlsKGRpci50b1N0cmluZygpKTsKCX0KCglwcml2YXRlIHZvaWQgY29weShGaWxlIHNyYywgSUNvbnRhaW5lciBkZXN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKCQkJRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKCQlGaWxlW10gY2hpbGRyZW4gPSBzcmMubGlzdEZpbGVzKCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewoJCQlTdHJpbmcgbmFtZSA9IGNoaWxkcmVuW2ldLmdldE5hbWUoKTsKCQkJaWYgKGNoaWxkcmVuW2ldLmlzRGlyZWN0b3J5KCkpIHsKCQkJCUlGb2xkZXIgZm9sZGVyID0gZGVzdC5nZXRGb2xkZXIobmV3IFBhdGgobmFtZSkpOwoJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKCQkJCWNvcHkoY2hpbGRyZW5baV0sIGZvbGRlcik7CgkJCX0gZWxzZSB7CgkJCQlJRmlsZSBmaWxlID0gZGVzdC5nZXRGaWxlKG5ldyBQYXRoKG5hbWUpKTsKCQkJCWZpbGUuY3JlYXRlKG5ldyBGaWxlSW5wdXRTdHJlYW0oY2hpbGRyZW5baV0pLCB0cnVlLCBudWxsKTsKCQkJfQoJCX0KCX0KCglwcml2YXRlIHZvaWQgam9pbkJhY2tncm91bmRKb2JzKCkgewoJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKCQkJcHVibGljIHZvaWQgcnVuKCkgewoJCQkJdHJ5IHsKCQkJCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbigKCQkJCQkJCVJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7CgkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CgkJCQl9CgkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CgkJCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKCQkJCXdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgNTAwMCkgewoJCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewoJCQkJCQlkaXNwbGF5LnNsZWVwKCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSk7Cgl9Cn0K