LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDExIERyYWVnZXIgTWVkaWNhbCBHbWJIIChodHRwOi8vd3d3LmRyYWVnZXIuY29tKS4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICoKICogQ09OVFJJQlVUT1JTOgogKiAJCVBldGVyIEthcmxpdHNjaGVrIChpbml0aWFsIGNvbnRyaWJ1dGlvbikKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwLmdlbgoKaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdAppbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uCmltcG9ydCBqYXZhLnV0aWwuTGlzdAppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZXRyaWNlZ2VuLlJvb3QKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmZzbS5iYXNlLklMb2dnZXIKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uQXR0cmlidXRlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkNvbXBsZXhUeXBlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkRhdGFDbGFzcwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5nZW5lcmljLlByb2NlZHVyZUhlbHBlcnMKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuZ2VuZXJpYy5Sb29tRXh0ZW5zaW9ucwppbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLkphdmFJb0ZpbGVTeXN0ZW1BY2Nlc3MKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20udXRpbC5Sb29tSGVscGVycwoKQFNpbmdsZXRvbgpjbGFzcyBEYXRhQ2xhc3NHZW4gewoKCUBJbmplY3QgZXh0ZW5zaW9uIEphdmFJb0ZpbGVTeXN0ZW1BY2Nlc3MgZmlsZUFjY2VzcwoJQEluamVjdCBleHRlbnNpb24gQ3BwRXh0ZW5zaW9ucyBzdGRFeHQKCUBJbmplY3QgZXh0ZW5zaW9uIFJvb21FeHRlbnNpb25zIHJvb21FeHQKCUBJbmplY3QgZXh0ZW5zaW9uIFByb2NlZHVyZUhlbHBlcnMgaGVscGVycwovLwlASW5qZWN0IGV4dGVuc2lvbiBUeXBlSGVscGVycyB0eXBlSGVscGVycwoJQEluamVjdCBJbml0aWFsaXphdGlvbiBpbml0SGVscGVyCglASW5qZWN0IGV4dGVuc2lvbiBSb29tSGVscGVycwoJQEluamVjdCBJTG9nZ2VyIGxvZ2dlcgoKCWRlZiBkb0dlbmVyYXRlKFJvb3Qgcm9vdCkgewoJCWxvZ2dlci5sb2dJbmZvKCJnZW5lcmF0aW5nIGNvZGUiKQoJCWZvciAoZGM6IHJvb3QudXNlZERhdGFDbGFzc2VzKSB7CgkJCXZhciBwYXRoID0gZGMuZ2VuZXJhdGlvblRhcmdldFBhdGggKyBkYy5nZXRQYXRoCgoJCQkvLyBoZWFkZXIgZmlsZQoJCQlsb2dnZXIubG9nSW5mbygiZ2VuZXJhdGluZyBEYXRhQ2xhc3MgaGVhZGVyICciK2RjLmdldENwcEhlYWRlckZpbGVOYW1lKyInIGluICciK3BhdGgrIiciKQoJCQlmaWxlQWNjZXNzLnNldE91dHB1dFBhdGgocGF0aCkKCQkJZmlsZUFjY2Vzcy5nZW5lcmF0ZUZpbGUoZGMuZ2V0Q3BwSGVhZGVyRmlsZU5hbWUsIHJvb3QuZ2VuZXJhdGVIZWFkZXJGaWxlKGRjKSkKCgkJCS8vIHNvdXJjZSBmaWxlCgkJCWxvZ2dlci5sb2dJbmZvKCJnZW5lcmF0aW5nIERhdGFDbGFzcyBzb3VyY2UgJyIrZGMuZ2V0Q3BwU291cmNlRmlsZU5hbWUrIicgaW4gJyIrcGF0aCsiJyIpCgkJCWZpbGVBY2Nlc3Muc2V0T3V0cHV0UGF0aChwYXRoKQoJCQlmaWxlQWNjZXNzLmdlbmVyYXRlRmlsZShkYy5nZXRDcHBTb3VyY2VGaWxlTmFtZSwgcm9vdC5nZW5lcmF0ZVNvdXJjZUZpbGUoZGMpKQoKCQl9CgoJfQoKCWRlZiBnZW5lcmF0ZUhlYWRlckZpbGUoUm9vdCByb290LCBEYXRhQ2xhc3MgZGMpIHsKCQkvL1RPRE86IGdldFJlZmVyZW5jZWREYXRhQ2xhc3NlcyBkb2VzIG5vdCBjb250YWluIGEgYmFzZSBjbGFzcyBvZiB0aGUgb3duIHBhY2thZ2UKCScnJwoJCatnZW5lcmF0ZUluY2x1ZGVHdWFyZEJlZ2luKGRjLCAnJym7CgoJCSNpbmNsdWRlICJjb21tb24vZXREYXRhdHlwZXNDcHAuaHBwIgoJCatJRiBkYy5iYXNlIT1udWxsuyNpbmNsdWRlICKrZGMuYmFzZS5wYXRou6tkYy5iYXNlLm5hbWW7Lmgiq0VORElGuwoJCatGT1IgY2xhc3NlcyA6IHJvb3QuZ2V0UmVmZXJlbmNlZERhdGFDbGFzc2VzKGRjKbsKCQkJI2luY2x1ZGUgIqtjbGFzc2VzLnBhdGi7q2NsYXNzZXMubmFtZbsuaCIKCQmrRU5ERk9SuwoJCatGT1IgbW9kZWwgOiByb290LmdldFJlZmVyZW5jZWRNb2RlbHMoZGMpuwoJCQmrRk9SIGNsYXNzZXMgOiBtb2RlbC5kYXRhQ2xhc3Nlc7sKCQkJCSNpbmNsdWRlICKrY2xhc3Nlcy5wYXRou6tjbGFzc2VzLm5hbWW7LmgiCgkJCatFTkRGT1K7CgkJq0VOREZPUrsKCgkJq2RjLnVzZXJDb2RlMS51c2VyQ29kZbsKCgkJdXNpbmcgbmFtZXNwYWNlIGV0UnVudGltZTsgLy8gVE9ETyBKSCByZW1vdmUKCgkJq2RjLmdlbmVyYXRlTmFtZXNwYWNlQmVnaW67CgoJCWNsYXNzIKtkYy5uYW1lu6tJRiBkYy5iYXNlIT1udWxsuyA6IHB1YmxpYyCrZGMuYmFzZS5uYW1lu6tFTkRJRrsgewoKCQlwdWJsaWM6CgkJCatoZWxwZXJzLnVzZXJDb2RlKGRjLnVzZXJDb2RlMim7CgoJCQmraGVscGVycy5hdHRyaWJ1dGVzKGRjLmF0dHJpYnV0ZXMpuwoKCQkJq2hlbHBlcnMuYXR0cmlidXRlU2V0dGVyc0dldHRlcnNJbXBsZW1lbnRhdGlvbihkYy5hdHRyaWJ1dGVzLCBkYy5uYW1lKbsKCgkJCatoZWxwZXJzLm9wZXJhdGlvbnNEZWNsYXJhdGlvbihkYy5vcGVyYXRpb25zLCBkYy5uYW1lKbsKCgkJCS8vIGRlZmF1bHQgY29uc3RydWN0b3IsIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IKCQkJq2RjLm5hbWW7KCk7CgkJCatkYy5uYW1luyhjb25zdCCrZGMubmFtZbsmIHJocyk7CgkJCatkYy5uYW1luyYgb3BlcmF0b3I9KGNvbnN0IKtkYy5uYW1luyYgcmhzKTsKCgkJCS8vIGNvbnN0cnVjdG9yIHVzaW5nIGZpZWxkcwoJCQmrSUYgIWRjLmFsbEF0dHJpYnV0ZXMuZW1wdHm7q2RjLm5hbWW7KKtkYy5hbGxBdHRyaWJ1dGVzLmFyZ0xpc3S7KTurRU5ESUa7CgkJfTsKCgkJq2RjLmdlbmVyYXRlTmFtZXNwYWNlRW5kuwoKCQmrZ2VuZXJhdGVJbmNsdWRlR3VhcmRFbmQoZGMsICcnKbsKCgknJycKCX0KCglkZWYgZ2VuZXJhdGVTb3VyY2VGaWxlKFJvb3Qgcm9vdCwgRGF0YUNsYXNzIGRjKSB7CgkJJycnCgkJLyoqCgkJICogQGF1dGhvciBnZW5lcmF0ZWQgYnkgZVRyaWNlCgkJICoKCQkgKiBTb3VyY2UgRmlsZSBvZiBEYXRhQ2xhc3Mgq2RjLm5hbWW7CgkJICovCgoJCSNpbmNsdWRlICKrZGMuZ2V0Q3BwSGVhZGVyRmlsZU5hbWW7IgoKCQkjaW5jbHVkZSAiZXRVbml0L2V0VW5pdC5oIgoKCQmrZGMuZ2VuZXJhdGVOYW1lc3BhY2VCZWdpbrsKCgkJq2hlbHBlcnMudXNlckNvZGUoZGMudXNlckNvZGUzKbsKCgkJLy8gZGVmYXVsdCBjb25zdHJ1Y3RvcgoJCatkYy5uYW1luzo6q2RjLm5hbWW7KCkKCQkJq2RjLmdlbmVyYXRlRGVmYXVsdEluaXRhbGl6ZXJMaXN0uwoJCXsKCQkJq2luaXRIZWxwZXIuZ2VuRXh0cmFJbml0aWFsaXplcnMoZGMuYXR0cmlidXRlcym7CgkJCatkYy51c2VyU3RydWN0b3JCb2R5KHRydWUpuwoJCX0KCgkJLy8gY29weSBjb25zdHJ1Y3RvcgoJCatkYy5uYW1luzo6q2RjLm5hbWW7KGNvbnN0IKtkYy5uYW1luyYgcmhzKQoJCQmrZGMuZ2VuZXJhdGVDb3B5SW5pdGFsaXplckxpc3S7CgkJewoJCX0KCgkJLy8gY29uc3RydWN0b3IgdXNpbmcgZmllbGRzCgkJLy8gVE9ETwoJCatJRiAhZGMuYWxsQXR0cmlidXRlcy5lbXB0ebsKCQkJq2RjLm5hbWW7OjqrZGMubmFtZbsoq2RjLmFsbEF0dHJpYnV0ZXMuYXJnTGlzdLspCgkJCQmrZGMuZ2VuZXJhdGVGaWVsZEluaXRpYWxpemVyTGlzdLsKCQkJewoJCQl9CgkJq0VORElGuwoKCQkvLyBhc3NpZ25tZW50IG9wZXJhdG9yCgkJq2RjLm5hbWW7JiCrZGMubmFtZbs6Om9wZXJhdG9yPShjb25zdCCrZGMubmFtZbsmIHJocykKCQl7CgkJCWlmICh0aGlzID09ICZyaHMpIHsgcmV0dXJuICp0aGlzOyB9OwoJCQmrSUYgZGMuYmFzZSE9bnVsbLurZGMuYmFzZS5uYW1luzo6b3BlcmF0b3I9KHJocyk7q0VORElGuwoJCQmrRk9SIGF0dHIgOiBkYy5hdHRyaWJ1dGVzuwoJCQkJdGhpcy0+q2F0dHIubmFtZbsgPSByaHMuq2F0dHIubmFtZbs7CgkJCatFTkRGT1K7CgkJCXJldHVybiAqdGhpczsKCQl9CgoJCatoZWxwZXJzLm9wZXJhdGlvbnNJbXBsZW1lbnRhdGlvbihkYy5vcGVyYXRpb25zLCBkYy5uYW1lKbsKCgkJq2RjLmdlbmVyYXRlTmFtZXNwYWNlRW5kuwoKCScnJ30KCglkZWYgcHJpdmF0ZSBnZW5lcmF0ZURlZmF1bHRJbml0YWxpemVyTGlzdChEYXRhQ2xhc3MgZGF0YUNsYXNzKXsKCQl2YWwgZXh0ZW5zaW9uIGluaXRIZWxwZXIgPSBpbml0SGVscGVyCgkJdmFyIGluaXRMaXN0ID0gPENoYXJTZXF1ZW5jZT5uZXdBcnJheUxpc3QKCgkJaWYoZGF0YUNsYXNzLmJhc2UgIT0gbnVsbCkgaW5pdExpc3QgKz0gZGF0YUNsYXNzLmJhc2UubmFtZSArICcoKScKCQlpbml0TGlzdCArPSBkYXRhQ2xhc3MuYXR0cmlidXRlcy5tYXBbJycnq25hbWW7KKtpbml0aWFsaXplckxpc3RWYWx1ZbspJycnXQoKCQlpbml0TGlzdC5nZW5lcmF0ZUN0b3JJbml0aWFsaXplckxpc3QKCX0KCglkZWYgcHJpdmF0ZSBnZW5lcmF0ZUNvcHlJbml0YWxpemVyTGlzdChEYXRhQ2xhc3MgZGF0YUNsYXNzKXsKCQl2YWwgZXh0ZW5zaW9uIGluaXRIZWxwZXIgPSBpbml0SGVscGVyCgkJdmFyIGluaXRMaXN0ID0gPENoYXJTZXF1ZW5jZT5uZXdBcnJheUxpc3QKCgkJaWYoZGF0YUNsYXNzLmJhc2UgIT0gbnVsbCkgaW5pdExpc3QgKz0gZGF0YUNsYXNzLmJhc2UubmFtZSArICcocmhzKScKCQlpbml0TGlzdCArPSBkYXRhQ2xhc3MuYXR0cmlidXRlcy5tYXBbJycnq25hbWW7KHJocy6rbmFtZbspJycnXQoKCQlpbml0TGlzdC5nZW5lcmF0ZUN0b3JJbml0aWFsaXplckxpc3QKCX0KCglkZWYgcHJpdmF0ZSBnZW5lcmF0ZUZpZWxkSW5pdGlhbGl6ZXJMaXN0KERhdGFDbGFzcyBkYXRhQ2xhc3MpewoJCXZhbCBleHRlbnNpb24gaW5pdEhlbHBlciA9IGluaXRIZWxwZXIKCQl2YXIgaW5pdExpc3QgPSA8Q2hhclNlcXVlbmNlPm5ld0FycmF5TGlzdAoKCQlpZihkYXRhQ2xhc3MuYmFzZSAhPSBudWxsKQoJCQlpbml0TGlzdCArPSAnJyerZGF0YUNsYXNzLmJhc2UubmFtZbsoq2RhdGFDbGFzcy5iYXNlLmFsbEF0dHJpYnV0ZXMubWFwW25hbWVdLmpvaW4oJywgJym7KScnJwoJCWluaXRMaXN0ICs9IGRhdGFDbGFzcy5hdHRyaWJ1dGVzLm1hcFsnJyerbmFtZbsoq25hbWW7KScnJ10KCgkJaW5pdExpc3QuZ2VuZXJhdGVDdG9ySW5pdGlhbGl6ZXJMaXN0Cgl9CgovLwlkZWYgcGFyYW1MaXN0KERhdGFDbGFzcyBfZGMpIHsKLy8JCXZhciByZXN1bHQgPSAiIgovLwkJdmFyIGRjID0gX2RjCi8vCQl3aGlsZSAoZGMhPW51bGwpIHsKLy8JCQlyZXN1bHQgPSBkYy5hdHRyaWJ1dGVzLnBhcmFtTGlzdC50b1N0cmluZyArIHJlc3VsdAovLwkJCWRjID0gZGMuYmFzZQovLwkJCWlmIChkYyE9bnVsbCkKLy8JCQkJcmVzdWx0ID0gIiwgIityZXN1bHQKLy8JCX0KLy8JCXJldHVybiByZXN1bHQKLy8JfQoKLy8JZGVmIHBhcmFtTGlzdChMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcykgewovLwkJJycnq0ZPUiBhOiBhdHRyaWJ1dGVzIFNFUEFSQVRPUiAiLCAiu6thLm5hbWW7X6tFTkRGT1K7JycnCi8vCX0KLy8KLy8JZGVmIGFyZ0xpc3QoRGF0YUNsYXNzIF9kYykgewovLwkJdmFyIHJlc3VsdCA9ICIiCi8vCQl2YXIgZGMgPSBfZGMKLy8JCXdoaWxlIChkYyE9bnVsbCkgewovLwkJCXJlc3VsdCA9IGRjLmF0dHJpYnV0ZXMuYXJnTGlzdENvbnN0cnVjdG9yLnRvU3RyaW5nICsgcmVzdWx0Ci8vCQkJZGMgPSBkYy5iYXNlCi8vCQkJaWYgKGRjIT1udWxsKQovLwkJCQlyZXN1bHQgPSAiLCAiK3Jlc3VsdAovLwkJfQovLwkJcmV0dXJuIHJlc3VsdAovLwl9Ci8vCi8vCWRlZiBhcmdMaXN0Q29uc3RydWN0b3IoTGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKLy8JCScnJ6tGT1IgYSA6IGF0dHJpYnV0ZXMgU0VQQVJBVE9SICIsICK7q2EudHlwZS50eXBlLnR5cGVOYW1lu6tJRiBhLnNpemU+MbtbXatFTkRJRrsgq2EubmFtZbtfq0VOREZPUrsnJycKLy8JfQoKCWRlZiBkZWVwQ29weShEYXRhQ2xhc3MgX2RjKSB7CgkJdmFyIHJlc3VsdCA9ICIiCgkJdmFyIGRjID0gX2RjCgkJd2hpbGUgKGRjIT1udWxsKSB7CgkJCXJlc3VsdCA9IGRlZXBDb3B5KGRjLmF0dHJpYnV0ZXMpLnRvU3RyaW5nICsgcmVzdWx0CgkJCWRjID0gZGMuYmFzZQoJCX0KCQlyZXR1cm4gcmVzdWx0Cgl9CgoJZGVmIGRlZXBDb3B5KExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzKSB7CgkJJycnCgkJq0ZPUiBhIDogYXR0cmlidXRlc7sKCQkJq0lGIGEudHlwZS50eXBlIGluc3RhbmNlb2YgQ29tcGxleFR5cGW7CgkJCQlpZiAoq2EubmFtZbshPW51bGwpIHsKCQkJCQmrSUYgYS5zaXplPT0wuwoJCQkJCQljb3B5LqthLm5hbWW7ID0gq2EubmFtZbsuZGVlcENvcHkoKTsKCQkJCQmrRUxTRbsKCQkJCQkJZm9yIChpbnQgaT0wO2k8q2EubmFtZbsubGVuZ3RoO2krKyl7CgkJCQkJCQljb3B5LqthLm5hbWW7W2ldID0gq2EubmFtZbtbaV0uZGVlcENvcHkoKTsKCQkJCQkJfQoJCQkJCatFTkRJRrsKCQkJCX0KCQkJq0VMU0W7CgkJCQmrSUYgYS5zaXplPT0wuwoJCQkJCWNvcHkuq2EubmFtZbsgPSCrYS5uYW1luzsKCQkJCatFTFNFuwoJCQkJCWZvciAoaW50IGk9MDtpPKthLm5hbWW7Lmxlbmd0aDtpKyspewoJCQkJCQljb3B5LqthLm5hbWW7W2ldID0gq2EubmFtZbtbaV07CgkJCQkJfQoJCQkJq0VORElGuwoJCQmrRU5ESUa7CgkJq0VOREZPUrsKCQknJycKCX0KCn0K