LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7CgovKioKICogQGF1dGhvciBvbGl2aWVydAogKi8KcHVibGljIGNsYXNzIEVuY29kaW5nVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKCgoJcHVibGljIEVuY29kaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKCQlzdXBlcihuYW1lKTsKCX0KCQoJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewoJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBTdWl0ZShFbmNvZGluZ1Rlc3RzLmNsYXNzLmdldE5hbWUoKSk7CgkJc3VpdGUuYWRkVGVzdChuZXcgRW5jb2RpbmdUZXN0cygidGVzdENyZWF0ZUNvbXBpbGF0aW9uVW5pdEFuZEltcG9ydENvbnRhaW5lciIpKTsKCQlyZXR1cm4gc3VpdGU7Cgl9CgoKCQoJLyoqCgkgKiBDaGVjayB0aGF0IHRoZSBjb21waWxhdGlvbiB1bml0IGlzIHNhdmVkIHdpdGggdGhlIHByb3BlciBlbmNvZGluZy4KCSAqLwoJcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBpbGF0aW9uVW5pdEFuZEltcG9ydENvbnRhaW5lcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewoJCVN0cmluZyBzYXZlZEVuY29kaW5nID0gbnVsbDsKCQl0cnkgewoJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwoJCQkKCQkJc2F2ZWRFbmNvZGluZyA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhSZXNvdXJjZXNQbHVnaW4uUFJFRl9FTkNPRElORyk7CgkJCXByZWZlcmVuY2VzLnNldFZhbHVlKFJlc291cmNlc1BsdWdpbi5QUkVGX0VOQ09ESU5HLCAiVVRGLTgiKTsKCQkJCgkJCVJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKCgkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsgIiIgfSwgIiIpOwoJCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiUCIsICIiLCAiIik7CgkJCUlDb21waWxhdGlvblVuaXQgY3U9IHBrZy5jcmVhdGVDb21waWxhdGlvblVuaXQoIkEuamF2YSIsIAoJCQkJKCJwdWJsaWMgY2xhc3MgQSB7XHJcbiIgKwoJCQkJIglwdWJsaWMgc3RhdGljIG1haW4oU3RyaW5nW10gYXJncykge1xyXG4iICsKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIulcIik7XHJcbiIgKwoJCQkJIgl9XHJcbiIgKwoJCQkJIn0iKSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwoJCQlhc3NlcnRDcmVhdGlvbihjdSk7CgkJCWN1LnJlbmFtZSgiQi5qYXZhIiwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CgkJCWN1ID0gcGtnLmdldENvbXBpbGF0aW9uVW5pdCgiQi5qYXZhIik7CgkJCWN1LnJlbmFtZSgiQS5qYXZhIiwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CgkJCWN1ID0gcGtnLmdldENvbXBpbGF0aW9uVW5pdCgiQS5qYXZhIik7CgkJCWJ5dGVbXSB0YWIgPSBuZXcgYnl0ZVs5MF07CgkJCXRhYlswXT0xMTI7CgkJCXRhYlsxXT0xMTc7CgkJCXRhYlsyXT05ODsKCQkJdGFiWzNdPTEwODsKCQkJdGFiWzRdPTEwNTsKCQkJdGFiWzVdPTk5OwoJCQl0YWJbNl09MzI7CgkJCXRhYls3XT05OTsKCQkJdGFiWzhdPTEwODsKCQkJdGFiWzldPTk3OwoJCQl0YWJbMTBdPTExNTsKCQkJdGFiWzExXT0xMTU7CgkJCXRhYlsxMl09MzI7CgkJCXRhYlsxM109NjU7CgkJCXRhYlsxNF09MzI7CgkJCXRhYlsxNV09MTIzOwoJCQl0YWJbMTZdPTEzOwoJCQl0YWJbMTddPTEwOwoJCQl0YWJbMThdPTk7CgkJCXRhYlsxOV09MTEyOwoJCQl0YWJbMjBdPTExNzsKCQkJdGFiWzIxXT05ODsKCQkJdGFiWzIyXT0xMDg7CgkJCXRhYlsyM109MTA1OwoJCQl0YWJbMjRdPTk5OwoJCQl0YWJbMjVdPTMyOwoJCQl0YWJbMjZdPTExNTsKCQkJdGFiWzI3XT0xMTY7CgkJCXRhYlsyOF09OTc7CgkJCXRhYlsyOV09MTE2OwoJCQl0YWJbMzBdPTEwNTsKCQkJdGFiWzMxXT05OTsKCQkJdGFiWzMyXT0zMjsKCQkJdGFiWzMzXT0xMDk7CgkJCXRhYlszNF09OTc7CgkJCXRhYlszNV09MTA1OwoJCQl0YWJbMzZdPTExMDsKCQkJdGFiWzM3XT00MDsKCQkJdGFiWzM4XT04MzsKCQkJdGFiWzM5XT0xMTY7CgkJCXRhYls0MF09MTE0OwoJCQl0YWJbNDFdPTEwNTsKCQkJdGFiWzQyXT0xMTA7CgkJCXRhYls0M109MTAzOwoJCQl0YWJbNDRdPTkxOwoJCQl0YWJbNDVdPTkzOwoJCQl0YWJbNDZdPTMyOwoJCQl0YWJbNDddPTk3OwoJCQl0YWJbNDhdPTExNDsKCQkJdGFiWzQ5XT0xMDM7CgkJCXRhYls1MF09MTE1OwoJCQl0YWJbNTFdPTQxOwoJCQl0YWJbNTJdPTMyOwoJCQl0YWJbNTNdPTEyMzsKCQkJdGFiWzU0XT0xMzsKCQkJdGFiWzU1XT0xMDsKCQkJdGFiWzU2XT05OwoJCQl0YWJbNTddPTk7CgkJCXRhYls1OF09ODM7CgkJCXRhYls1OV09MTIxOwoJCQl0YWJbNjBdPTExNTsKCQkJdGFiWzYxXT0xMTY7CgkJCXRhYls2Ml09MTAxOwoJCQl0YWJbNjNdPTEwOTsKCQkJdGFiWzY0XT00NjsKCQkJdGFiWzY1XT0xMTE7CgkJCXRhYls2Nl09MTE3OwoJCQl0YWJbNjddPTExNjsKCQkJdGFiWzY4XT00NjsKCQkJdGFiWzY5XT0xMTI7CgkJCXRhYls3MF09MTE0OwoJCQl0YWJbNzFdPTEwNTsKCQkJdGFiWzcyXT0xMTA7CgkJCXRhYls3M109MTE2OwoJCQl0YWJbNzRdPTEwODsKCQkJdGFiWzc1XT0xMTA7CgkJCXRhYls3Nl09NDA7CgkJCXRhYls3N109MzQ7CgkJCXRhYls3OF09LTYxOwoJCQl0YWJbNzldPS04NzsKCQkJdGFiWzgwXT0zNDsKCQkJdGFiWzgxXT00MTsKCQkJdGFiWzgyXT01OTsKCQkJdGFiWzgzXT0xMzsKCQkJdGFiWzg0XT0xMDsKCQkJdGFiWzg1XT05OwoJCQl0YWJbODZdPTEyNTsKCQkJdGFiWzg3XT0xMzsKCQkJdGFiWzg4XT0xMDsKCQkJdGFiWzg5XT0xMjU7CgkJCWJ5dGVbXSBlbmNvZGVkQ29udGVudHMgPSBVdGlsLmdldFJlc291cmNlQ29udGVudHNBc0J5dGVBcnJheShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoY3UuZ2V0UGF0aCgpKSk7CgkJCWFzc2VydFRydWUoIndyb25nIHNpemUgb2YgZW5jb2RlZCBzdHJpbmciLCB0YWIubGVuZ3RoID09IGVuY29kZWRDb250ZW50cy5sZW5ndGgpOwoJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGFiLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CgkJCQlhc3NlcnRUcnVlKCJ3cm9uZyBzaXplIG9mIGVuY29kZWQgY2hhcmFjdGVyIGF0IiArIGksIHRhYltpXSA9PSBlbmNvZGVkQ29udGVudHNbaV0pOwoJCQl9CgkJfSBmaW5hbGx5IHsKCQkJZGVsZXRlUHJvamVjdCgiUCIpOwoJCQkKCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKCQkJCgkJCXByZWZlcmVuY2VzLnNldFZhbHVlKFJlc291cmNlc1BsdWdpbi5QUkVGX0VOQ09ESU5HLCBzYXZlZEVuY29kaW5nKTsKCQkJCgkJCVJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKCQl9Cgl9CQp9Cg==