LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwoKaW1wb3J0IGphdmEudXRpbC4qOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZhY3Rvcnk7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLyoqCiAqIEEgaGVscGVyIGNsYXNzIGZvciBkZWZpbmluZyBhIG1vZHVsZSBmYWN0b3J5IHRoYXQgcHJvdmlkZXMgbW9kdWxlcwogKiBiYXNlZCBvbiBwcm9qZWN0cy4KICogCiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIGV4dGVuZHMgTW9kdWxlRmFjdG9yeURlbGVnYXRlIHsKCXByaXZhdGUgc3RhdGljIExpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwoKCS8vIGxpc3Qgb2YgSU1vZHVsZXMKCXByaXZhdGUgTGlzdCBtb2R1bGVzOwoKCS8qKgoJICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUuCgkgKi8KCXB1YmxpYyBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKCkgewoJCXN1cGVyKCk7CgkJCgkJZmFjdG9yaWVzLmFkZCh0aGlzKTsKCX0KCgkvKioKCSAqIENhY2hlIGFueSBwcmVleGlzdGluZyBtb2R1bGVzLgoJICovCglwcml2YXRlIGZpbmFsIHZvaWQgY2FjaGVNb2R1bGVzKCkgewoJCWlmIChtb2R1bGVzICE9IG51bGwpCgkJCXJldHVybjsKCQkKCQl0cnkgewoJCQljbGVhckNhY2hlKCk7CgkJCUlQcm9qZWN0W10gcHJvamVjdHMyID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7CgkJCWludCBzaXplID0gcHJvamVjdHMyLmxlbmd0aDsKCQkJbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQkvL1RyYWNlLnRyYWNlKCJjYWNoaW5nOiAiICsgdGhpcyArICIgIiArIHByb2plY3RzW2ldICsgIiAiICsgaXNWYWxpZE1vZHVsZShwcm9qZWN0c1tpXSkpOwoJCQkJaWYgKHByb2plY3RzMltpXS5pc0FjY2Vzc2libGUoKSkgewoJCQkJCXRyeSB7CgkJCQkJCUlNb2R1bGUgbW9kdWxlID0gY3JlYXRlTW9kdWxlKHByb2plY3RzMltpXSk7CgkJCQkJCWlmIChtb2R1bGUgIT0gbnVsbCkKCQkJCQkJCW1vZHVsZXMuYWRkKG1vZHVsZSk7CgkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgbW9kdWxlIiwgdCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FjaGluZyBtb2R1bGVzIiwgZSk7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJuIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KCSAqIAoJICogQHJldHVybiB0aGUgd29ya3NwYWNlIHJvb3QKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgZ2V0V29ya3NwYWNlUm9vdCgpIHsKCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgbW9kdWxlcyBwcm92aWRlZCBieSB0aGlzIGZhY3RvcnkuCgkgKiAKCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb2R1bGVzCgkgKi8KCXB1YmxpYyBmaW5hbCBJTW9kdWxlW10gZ2V0TW9kdWxlcygpIHsKCQljYWNoZU1vZHVsZXMoKTsKCQkKCQlJTW9kdWxlW10gbW9kdWxlczIgPSBuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV07CgkJbW9kdWxlcy50b0FycmF5KG1vZHVsZXMyKTsKCQlyZXR1cm4gbW9kdWxlczI7Cgl9CgoJLyoqCgkgKiBIYW5kbGUgY2hhbmdlcyB0byBhIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyB2b2lkIGhhbmRsZUdsb2JhbFByb2plY3RDaGFuZ2UoZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKCQlNb2R1bGVGYWN0b3J5W10gZmFjdG9yaWVzMiA9IFNlcnZlclBsdWdpbi5nZXRNb2R1bGVGYWN0b3JpZXMoKTsKCQlpbnQgc2l6ZSA9IGZhY3RvcmllczIubGVuZ3RoOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCWlmIChmYWN0b3JpZXMyW2ldLmRlbGVnYXRlICE9IG51bGwgJiYgZmFjdG9yaWVzMltpXS5kZWxlZ2F0ZSBpbnN0YW5jZW9mIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUpIHsKCQkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgcG1mZCA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBmYWN0b3JpZXMyW2ldLmRlbGVnYXRlOwoJCQkJaWYgKHBtZmQuZGVsdGFBZmZlY3RzTW9kdWxlcyhkZWx0YSkpIHsKCQkJCQlwbWZkLm1vZHVsZXMgPSBudWxsOwoJCQkJCWZhY3RvcmllczJbaV0uY2xlYXJNb2R1bGVDYWNoZSgpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVsdGEgbWF5IGhhdmUgY2hhbmdlZCBtb2R1bGVzLAoJICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCgkgKiAKCSAqIEBwYXJhbSBkZWx0YSBhIHJlc291cmNlIGRlbHRhCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWx0YSBtYXkgaGF2ZSBjaGFuZ2VkIG1vZHVsZXMsCgkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQoJICovCglwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGVsdGFBZmZlY3RzTW9kdWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewoJCWNsYXNzIFRlbXAgewoJCQlib29sZWFuIGIgPSBmYWxzZTsKCQl9CgkJZmluYWwgVGVtcCB0ID0gbmV3IFRlbXAoKTsKCQkKCQlmaW5hbCBJUGF0aFtdIGxpc3RlbmVyUGF0aHMgPSBnZXRMaXN0ZW5lclBhdGhzKCk7CgkJaWYgKGxpc3RlbmVyUGF0aHMgPT0gbnVsbCB8fCBsaXN0ZW5lclBhdGhzLmxlbmd0aCA9PSAwKQoJCQlyZXR1cm4gZmFsc2U7CgkJZmluYWwgaW50IHNpemUgPSBsaXN0ZW5lclBhdGhzLmxlbmd0aDsKCQkKCQl0cnkgewoJCQlkZWx0YS5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhMikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCQkJCWlmICh0LmIpCgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgZGVsdGEyLmdldFJlc291cmNlKCkgKyAiICAiICsgZGVsdGEyLmdldEtpbmQoKSArICIgIiArIGRlbHRhMi5nZXRGbGFncygpKTsKCQkJCQlib29sZWFuIG9rID0gZmFsc2U7CgkJCQkJSVBhdGggcGF0aCA9IGRlbHRhMi5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CgkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCQkJaWYgKGxpc3RlbmVyUGF0aHNbaV0uZXF1YWxzKHBhdGgpKSB7CgkJCQkJCQl0LmIgPSB0cnVlOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9IGVsc2UgaWYgKHBhdGguaXNQcmVmaXhPZihsaXN0ZW5lclBhdGhzW2ldKSkgewoJCQkJCQkJb2sgPSB0cnVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXJldHVybiBvazsKCQkJCX0KCQkJfSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJLy8gaWdub3JlCgkJfQoJCS8vVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRGVsdGEgY29udGFpbnMgY2hhbmdlOiAiICsgdC5iKTsKCQlyZXR1cm4gdC5iOwoJfQoKCS8qKgoJICogQ2xlYXIgYW5kIGNhY2hlZCBtZXRhZGF0YS4KCSAqLwoJcHJvdGVjdGVkIHZvaWQgY2xlYXJDYWNoZSgpIHsKCQkvLyBpZ25vcmUKCX0KCgkvKioKCSAqIENyZWF0ZXMgdGhlIG1vZHVsZSBmb3IgYSBnaXZlbiBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QgdG8gY3JlYXRlIG1vZHVsZXMgZm9yCgkgKiBAcmV0dXJuIGEgbW9kdWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgbm8gbW9kdWxlIGluIHRoZSBwcm9qZWN0CgkgKi8KCXByb3RlY3RlZCBhYnN0cmFjdCBJTW9kdWxlIGNyZWF0ZU1vZHVsZShJUHJvamVjdCBwcm9qZWN0KTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRoYXQgdGhlIG1vZHVsZSBzaG91bGQgbGlzdGVuIHRvCgkgKiBmb3Igc3RhdGUgY2hhbmdlcy4gVGhlIHBhdGhzIHNob3VsZCBiZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGhzLgoJICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGUgcGF0aHMuCgkgKgoJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHBhdGhzCgkgKi8KCXByb3RlY3RlZCBJUGF0aFtdIGdldExpc3RlbmVyUGF0aHMoKSB7CgkJcmV0dXJuIG51bGw7Cgl9Cn0=