LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IEZ1bmRhY2nzbiBUZWNuYWxpYSBSZXNlYXJjaCAmIElubm92YXRpb24uCiAqCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBIdWFzY2FyIEVzcGlub3phIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgTWFyaSBDYXJtZW4gUGFsYWNpb3MgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5kaWFncmFtLkRuRDsKCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uaW1wbC5EaWFncmFtSW1wbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKCgppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuZGlhZ3JhbS5wcm92aWRlcnMuQXJnRWxlbWVudFR5cGVzOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJnRmFjdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ1BhY2thZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5DbGFpbTsKCgoKCgovKioKICogQ3JlYXRlcyB0aGUgbW9kZWxzIGFuZCB2aWV3cywgYmFzZWQgb24gdGhlIGRyb3BwZWQgdGVtcGxhdGUgZmlsZQogKiBAYXV0aG9yIE2qIENhcm1lbiBQYWxhY2lvcwogKi8KcHVibGljIGNsYXNzIEVCRHJvcENsYWltRWRpdFBvbGljeSB7CgoJcHVibGljIEVCRHJvcENsYWltRWRpdFBvbGljeSgpIHsKCgl9CgoJcHVibGljIENsYWltIGNyZWF0ZU1vZGVsKENsYWltIGVsKSB7CgkJdHJ5ewoJCQkgIC8vIGNyZWFyIG1vZGVsbwoJCQkgIENsYWltIG5ld0VsZW0gPSBBcmdGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFpbSgpOwoJCQkgIG5ld0VsZW0uZVNldChBcmdQYWNrYWdlLkxpdGVyYWxzLk1PREVMX0VMRU1FTlRfX0lELCBlbC5nZXRJZCgpKTsKCQkJICBuZXdFbGVtLmVTZXQoQXJnUGFja2FnZS5MaXRlcmFscy5NT0RFTF9FTEVNRU5UX19OQU1FLCBlbC5nZXROYW1lKCkpOwoJCQkgIG5ld0VsZW0uZVNldChBcmdQYWNrYWdlLkxpdGVyYWxzLkFSR1VNRU5UQVRJT05fRUxFTUVOVF9fREVTQ1JJUFRJT04sIGVsLmdldERlc2NyaXB0aW9uKCkpOwoJCQkgIG5ld0VsZW0uZVNldChBcmdQYWNrYWdlLkxpdGVyYWxzLkFSR1VNRU5UQVRJT05fRUxFTUVOVF9fQ09OVEVOVCwgZWwuZ2V0Q29udGVudCgpKTsKCQkJICBuZXdFbGVtLmVTZXQoQXJnUGFja2FnZS5MaXRlcmFscy5DTEFJTV9fQVNTVU1FRCwgZWwuZ2V0QXNzdW1lZCgpKTsKCQkJICBuZXdFbGVtLmVTZXQoQXJnUGFja2FnZS5MaXRlcmFscy5DTEFJTV9fVE9fQkVfU1VQUE9SVEVELCBlbC5nZXRUb0JlU3VwcG9ydGVkKCkpOwoJCQkgIG5ld0VsZW0uZVNldChBcmdQYWNrYWdlLkxpdGVyYWxzLkNMQUlNX19QVUJMSUMsIGVsLmdldFB1YmxpYygpKTsKCQkJICBuZXdFbGVtLmVTZXQoQXJnUGFja2FnZS5MaXRlcmFscy5DTEFJTV9fVE9fQkVfSU5TVEFOVElBVEVELCBlbC5nZXRUb0JlSW5zdGFudGlhdGVkKCkpOwoJCQkgIAoJCQkgIC8vTk8hISF2YWwgQ2xhaW1JbXBhY3RbMC4uKl0gb3duZWQ7CgkJCSAgLy9OTyEhIXZhbCBDaG9pY2VbMC4uMV0gY2hvaWNlOwoJCQkgIAoJCQkgIHJldHVybiBuZXdFbGVtOwoKCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewoJCQkgIGUucHJpbnRTdGFja1RyYWNlKCk7CgkJfQoJCQoJCXJldHVybiBudWxsOwoJfQoJCgkvKgoJcHVibGljIENyZWF0ZVZpZXdSZXF1ZXN0IGNyZWF0ZVZpZXdSZXF1ZXN0IChEaWFncmFtRWRpdG9yIGVkLCBEaWFncmFtSW1wbCBkZywgQ2xhaW0gZWwsIFBvaW50IGxvY2F0aW9uKSB7CgoJCXRyeXsKCQkJZmluYWwgRGlhZ3JhbUVkaXRvciBlZGl0b3IgPSBlZDsKCQkJZmluYWwgRGlhZ3JhbUltcGwgZGlhZ3IgPSBkZzsKCQkJZmluYWwgQ2xhaW0gZWxlbSA9IGVsOwoJCQkKCQkJLy8gY3JlYXIgbGEgdmlzdGEKCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3Igdmlld0Rlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoCgkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtKSwgTm9kZS5jbGFzcywgKChJSGludGVkVHlwZSlBcmdFbGVtZW50VHlwZXMuQ2xhaW1fMjAwMSkuZ2V0U2VtYW50aWNIaW50KCksIHRydWUsCgkJCQkJCWVkaXRvci5nZXREaWFncmFtRWRpdFBhcnQoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOwoJCgkJCXZpZXdEZXNjcmlwdG9yLnNldFBlcnNpc3RlZCh0cnVlKTsKCQkJICAKCQkJQ3JlYXRlVmlld1JlcXVlc3QgY3JlYXRlUmVxdWVzdCA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcik7CgkJCWNyZWF0ZVJlcXVlc3Quc2V0TG9jYXRpb24obG9jYXRpb24pOwoJCgkJCXJldHVybiBjcmVhdGVSZXF1ZXN0OwoJCQkKCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewoJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCX0KCQkKCQlyZXR1cm4gbnVsbDsKCX0KICAgICovCn0K