LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDExIERyYWVnZXIgTWVkaWNhbCBHbWJIIChodHRwOi8vd3d3LmRyYWVnZXIuY29tKS4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLwogKgogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogKgogKiBDT05UUklCVVRPUlM6CiAqIAkJUGV0ZXIgS2FybGl0c2NoZWsgKGluaXRpYWwgY29udHJpYnV0aW9uKQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC5nZW4KCmltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3QKaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbgppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZXRtYXAudXRpbC5FVE1hcFV0aWwKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5Sb290CmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uU3ViU3lzdGVtSW5zdGFuY2UKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5TeXN0ZW1JbnN0YW5jZQppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAuTWFpbgppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5mc20uYmFzZS5GaWxlU3lzdGVtSGVscGVycwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5iYXNlLmlvLklHZW5lcmF0b3JGaWxlSU8KaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuZ2VuZXJpYy5Sb29tRXh0ZW5zaW9ucwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAuc2V0dXAuR2VuZXJhdG9yT3B0aW9uc0hlbHBlcgoKQFNpbmdsZXRvbgpjbGFzcyBOb2RlUnVubmVyR2VuIHsKCglASW5qZWN0IGV4dGVuc2lvbiBSb29tRXh0ZW5zaW9ucyByb29tRXh0CglASW5qZWN0IGV4dGVuc2lvbiBDcHBFeHRlbnNpb25zCglASW5qZWN0IGV4dGVuc2lvbiBGaWxlU3lzdGVtSGVscGVycwoJQEluamVjdCBleHRlbnNpb24gR2VuZXJhdG9yT3B0aW9uc0hlbHBlcgoKCUBJbmplY3QgSUdlbmVyYXRvckZpbGVJTyBmaWxlSU8KCglkZWYgZG9HZW5lcmF0ZShSb290IHJvb3QpIHsKCQlmb3IgKG5yIDogRVRNYXBVdGlsOjpnZXROb2RlUmVmcygpKSB7CgkJCWZvciAoaW5zdHBhdGggOiBFVE1hcFV0aWw6OmdldFN1YlN5c3RlbUluc3RhbmNlUGF0aHMobnIpKSB7CgkJCQl2YWwgc3NpID0gcm9vdC5nZXRJbnN0YW5jZShpbnN0cGF0aCkgYXMgU3ViU3lzdGVtSW5zdGFuY2UKCQkJCWlmIChzc2khPW51bGwgJiYgc3NpLnN1YlN5c3RlbUNsYXNzLnZhbGlkR2VuZXJhdGlvbkxvY2F0aW9uKSB7CgkJCQkJdmFsIGZpbGVwYXRoID0gc3NpLnN1YlN5c3RlbUNsYXNzLmdldFBhdGgKCQkJCQlmaWxlSU8uZ2VuZXJhdGVGaWxlKCJnZW5lcmF0aW5nIFN1YlN5c3RlbVJ1bm5lciBkZWNsYXJhdGlvbiIsIGZpbGVwYXRoICsgbnIuZ2V0Q3BwQ2xhc3NOYW1lKHNzaSkrIlJ1bm5lci5oIiwgcm9vdC5nZW5lcmF0ZUhlYWRlckZpbGUoc3NpKSkKCQkJCQlmaWxlSU8uZ2VuZXJhdGVGaWxlKCJnZW5lcmF0aW5nIFN1YlN5c3RlbVJ1bm5lciBpbXBsZW1lbnRhdGlvbiIsIGZpbGVwYXRoICsgbnIuZ2V0Q3BwQ2xhc3NOYW1lKHNzaSkrIlJ1bm5lci5jcHAiLCByb290LmdlbmVyYXRlU291cmNlRmlsZShzc2kpKQoJCQkJfQoJCQl9CgkJfQoJfQoKCWRlZiBnZW5lcmF0ZUhlYWRlckZpbGUoUm9vdCByb290LCBTdWJTeXN0ZW1JbnN0YW5jZSBzc2MpIHsKCQl2YWwgY2MgPSBzc2Muc3ViU3lzdGVtQ2xhc3MKCQl2YWwgbnIgPSBFVE1hcFV0aWw6OmdldE5vZGVSZWYoc3NjKQoJCXZhbCBjbHNuYW1lID0gbnIuZ2V0Q3BwQ2xhc3NOYW1lKHNzYykKCQknJycKCQkJLyoqCgkJCSAqIEBhdXRob3IgZ2VuZXJhdGVkIGJ5IGVUcmljZQoJCQkgKgoJCQkgKiB0aGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBtYWluIGZ1bmN0aW9uIHJ1bm5pbmcgY29tcG9uZW50IKtzc2MubmFtZbsKCQkJICogaXQgaW5zdGFudGlhdGVzIKtzc2MubmFtZbsgYW5kIHN0YXJ0cyBhbmQgZW5kcyB0aGUgbGlmZWN5Y2xlCgkJCSAqLwoKCQkJq2dlbmVyYXRlSW5jbHVkZUd1YXJkQmVnaW4oY2MsICdSdW5uZXInKbsKCgkJCatjYy5nZW5lcmF0ZU5hbWVzcGFjZUJlZ2luuwoKCQkJI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvU3ViU3lzdGVtUnVubmVyQmFzZS5oIgoKCQkJY2xhc3Mgq2Nsc25hbWUrIlJ1bm5lciK7IDogcHVibGljIGV0UnVudGltZTo6U3ViU3lzdGVtUnVubmVyQmFzZSB7CgoJCQl9OwoKCQkJq2NjLmdlbmVyYXRlTmFtZXNwYWNlRW5kuwoKCQkJq2dlbmVyYXRlSW5jbHVkZUd1YXJkRW5kKGNjLCAnUnVubmVyJym7CgkJJycnCgl9CgoJZGVmIGdlbmVyYXRlU291cmNlRmlsZShSb290IHJvb3QsIFN1YlN5c3RlbUluc3RhbmNlIHNzYykgewoJCXZhbCBjYyA9IHNzYy5zdWJTeXN0ZW1DbGFzcwoJCXZhbCBuciA9IEVUTWFwVXRpbDo6Z2V0Tm9kZVJlZihzc2MpCgkJdmFsIGNsc25hbWUgPSBuci5nZXRDcHBDbGFzc05hbWUoc3NjKQoJCScnJwoJCQkvKioKCQkJICogQGF1dGhvciBnZW5lcmF0ZWQgYnkgZVRyaWNlCgkJCSAqCgkJCSAqIHRoaXMgY2xhc3MgY29udGFpbnMgdGhlIG1haW4gZnVuY3Rpb24gcnVubmluZyBjb21wb25lbnQgq3NzYy5uYW1luwoJCQkgKiBpdCBpbnN0YW50aWF0ZXMgq3NzYy5uYW1luyBhbmQgc3RhcnRzIGFuZCBlbmRzIHRoZSBsaWZlY3ljbGUKCQkJICovCgoKCQkJI2luY2x1ZGUgIqtjbHNuYW1lu1J1bm5lci5oIgoKCQkJI2luY2x1ZGUgIqtjbHNuYW1luy5oIgoJCQkjaW5jbHVkZSAiY29tbW9uL21vZGVsYmFzZS9SVFN5c3RlbS5oIgoJCQkjaW5jbHVkZSAiY29tbW9uL2NvbnRhaW5lcnMvU3RyaW5nLmgiCgkJCSNpbmNsdWRlICJjb21tb24vY29udGFpbmVycy9WZWN0b3IuaCIKCQkJI2luY2x1ZGUgImNvbW1vbi9jb250YWluZXJzL1NldC5oIgoJCQkjaW5jbHVkZSAiY29tbW9uL2NvbnRhaW5lcnMvTWFwLmgiCgoJCQl1c2luZyBuYW1lc3BhY2UgZXRSdW50aW1lOwoKCQkJq2NjLmdlbmVyYXRlTmFtZXNwYWNlQmVnaW67CgoJCQkvKioKCQkJICogq01haW4uZ2V0U2V0dGluZ3MubWFpbk1ldGhvZE5hbWW7IGZ1bmN0aW9uCgkJCSAqIGNyZWF0ZXMgY29tcG9uZW50cyBhbmQgc3RhcnRzIGFuZCBzdG9wcyB0aGUgbGlmZWN5Y2xlCgkJCSAqLwoJCQlpbnQgq01haW4uZ2V0U2V0dGluZ3MubWFpbk1ldGhvZE5hbWW7KGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKCQkJCS8vIGluc3RhbnRpYXRlIHRoZSBtYWluIGNvbXBvbmVudAoJCQkJUlRTeXN0ZW0qIHN5cyA9IKtJRiBzc2MuZUNvbnRhaW5lciBpbnN0YW5jZW9mIFN5c3RlbUluc3RhbmNlu25ldyBSVFN5c3RlbSgiqyhzc2MuZUNvbnRhaW5lciBhcyBTeXN0ZW1JbnN0YW5jZSkubmFtZbsiKatFTFNFuzCrRU5ESUa7OwoJCQkJq2Nsc25hbWW7KiBtYWluX2NvbXBvbmVudCA9IG5ldyCrY2xzbmFtZbsoc3lzLCAiq3NzYy5uYW1luyIpOwoKCQkJCatjbHNuYW1lu1J1bm5lcjo6cnVuKCptYWluX2NvbXBvbmVudCwgYXJnYywgYXJndik7Cgqrq6sJCQkJLy8gVE9ETyBKSCBjcmFzaAoJCQkJLy9kZWxldGUgc3lzOwoJCQkJCgkJCQlwcmludGYoIlN0cmluZyBhbGxvY2F0aW9ucyAlZCBhbmQgZGVhbGxvY2F0aW9ucyAlZFxuIiwgZXRSdW50aW1lOjpTdHJpbmc6OmdldE5BbGxvY2F0aW9ucygpLCBldFJ1bnRpbWU6OlN0cmluZzo6Z2V0TkRlYWxsb2NhdGlvbnMoKSk7CgkJCQlwcmludGYoIlN0cmluZyBjcmVhdGlvbnMgJWQgYW5kIGRlc3RydWN0aW9ucyAlZFxuIiwgZXRSdW50aW1lOjpTdHJpbmc6OmdldE5DcmVhdGVkKCksIGV0UnVudGltZTo6U3RyaW5nOjpnZXRORGVzdHJveWVkKCkpOwoJCQkJcHJpbnRmKCJWZWN0b3IgYWxsb2NhdGlvbnMgJWQgYW5kIGRlYWxsb2NhdGlvbnMgJWRcbiIsIGV0UnVudGltZTo6VmVjdG9yU3RhdHM6OmdldE5BbGxvY2F0aW9ucygpLCBldFJ1bnRpbWU6OlZlY3RvclN0YXRzOjpnZXRORGVhbGxvY2F0aW9ucygpKTsKCQkJCXByaW50ZigiVmVjdG9yIGNyZWF0aW9ucyAlZCBhbmQgZGVzdHJ1Y3Rpb25zICVkXG4iLCBldFJ1bnRpbWU6OlZlY3RvclN0YXRzOjpnZXROQ3JlYXRlZCgpLCBldFJ1bnRpbWU6OlZlY3RvclN0YXRzOjpnZXRORGVzdHJveWVkKCkpOwoJCQkJcHJpbnRmKCJTZXQgY3JlYXRpb25zICVkIGFuZCBkZXN0cnVjdGlvbnMgJWRcbiIsIGV0UnVudGltZTo6U2V0U3RhdHM6OmdldE5DcmVhdGVkKCksIGV0UnVudGltZTo6U2V0U3RhdHM6OmdldE5EZXN0cm95ZWQoKSk7CgkJCQlwcmludGYoIk1hcCBjcmVhdGlvbnMgJWQgYW5kIGRlc3RydWN0aW9ucyAlZFxuIiwgZXRSdW50aW1lOjpNYXBTdGF0czo6Z2V0TkNyZWF0ZWQoKSwgZXRSdW50aW1lOjpNYXBTdGF0czo6Z2V0TkRlc3Ryb3llZCgpKTsKCQkJCWZmbHVzaChzdGRvdXQpOwoKCQkJCXJldHVybiAwOwoJCQl9CgoJCQmrY2MuZ2VuZXJhdGVOYW1lc3BhY2VFbmS7CgoJCScnJwoJfQp9