LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIExpY2Vuc2VkIE1hdGVyaWFscyAtIFByb3BlcnR5IG9mIElCTQ0KICogqSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMjAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKiBVLlMuIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUNCiAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiANCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50YXNrczsNCg0KaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQppbXBvcnQgamF2YS51dGlsLkxpc3Q7DQppbXBvcnQgamF2YS51dGlsLk1hcDsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXJNYW5hZ2VyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuTG9jYXRpb25LaW5kOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLkphdmFTY3JpcHRQbHVnaW47DQppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkudGV4dC5JSmF2YVNjcmlwdFBhcnRpdGlvbnM7DQppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuSUZpbGVUYXNrU2Nhbm5lcjsNCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuVGFza1RhZzsNCg0KcHVibGljIGNsYXNzIEpTRmlsZVRhc2tTY2FubmVyIGltcGxlbWVudHMgSUZpbGVUYXNrU2Nhbm5lciB7DQoJLyoqDQoJICogUHJvdmlkZXMgdGFzayB0YWcgc3VwcG9ydCBmb3Igc3RhbmRhbG9uZSAqLmpzIGZpbGVzDQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9UWVBFX1RBU0sgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50YXNrIjsgLy8kTk9OLU5MUy0xJA0KDQoJLyoNCgkgKiAobm9uLUphdmFkb2MpDQoJICogDQoJICogQHNlZQ0KCSAqIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5JRmlsZVRhc2tTY2FubmVyIw0KCSAqIGdldE1hcmtlclR5cGUoKQ0KCSAqLw0KCXB1YmxpYyBTdHJpbmcgZ2V0TWFya2VyVHlwZSgpIHsNCgkJcmV0dXJuIE1BUktFUl9UWVBFX1RBU0s7DQoJfQ0KDQoJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gY3JlYXRlSW5pdGlhbE1hcmtlckF0dHJpYnV0ZXMoU3RyaW5nIHRleHQsIGludCBkb2N1bWVudExpbmUsIGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCwgaW50IHByaW9yaXR5KSB7DQoJCU1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPD4oNik7DQoJCS8vIG1hcmtlciBsaW5lIG51bWJlcnMgYXJlIDEtYmFzZWQNCgkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgSW50ZWdlci52YWx1ZU9mKGRvY3VtZW50TGluZSArIDEpKTsNCgkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5UQVNLLCBnZXRNYXJrZXJUeXBlKCkpOw0KCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIEludGVnZXIudmFsdWVPZihzdGFydE9mZnNldCkpOw0KCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBJbnRlZ2VyLnZhbHVlT2Yoc3RhcnRPZmZzZXQgKyBsZW5ndGgpKTsNCgkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5NRVNTQUdFLCB0ZXh0KTsNCgkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5VU0VSX0VESVRBQkxFLCBCb29sZWFuLkZBTFNFKTsNCg0KCQlzd2l0Y2ggKHByaW9yaXR5KSB7DQoJCQljYXNlIElNYXJrZXIuUFJJT1JJVFlfSElHSCA6IHsNCgkJCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX0hJR0gpKTsNCgkJCX0NCgkJCQlicmVhazsNCgkJCWNhc2UgSU1hcmtlci5QUklPUklUWV9MT1cgOiB7DQoJCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9MT1cpKTsNCgkJCX0NCgkJCQlicmVhazsNCgkJCWRlZmF1bHQgOiB7DQoJCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9OT1JNQUwpKTsNCgkJCX0NCgkJfQ0KDQoJCXJldHVybiBhdHRyaWJ1dGVzOw0KCX0NCg0KCS8qDQoJICogKG5vbi1KYXZhZG9jKQ0KCSAqIA0KCSAqIEBzZWUNCgkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuSUZpbGVUYXNrU2Nhbm5lciMNCgkgKiBzY2FuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlLA0KCSAqIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5UYXNrVGFnW10sDQoJICogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpDQoJICovDQoJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD5bXSBzY2FuKElGaWxlIGZpbGUsIFRhc2tUYWdbXSB0YXNrVGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQoJCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gbmV3TWFya2VycyA9IG5ldyBBcnJheUxpc3Q8PigpOw0KCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIHRleHRGaWxlQnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOw0KCQlTdWJNb25pdG9yIGxvY2FsTW9uaXRvciA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCAzKTsNCgkJdHJ5IHsNCgkJCXRleHRGaWxlQnVmZmVyTWFuYWdlci5jb25uZWN0KGZpbGUuZ2V0RnVsbFBhdGgoKSwgTG9jYXRpb25LaW5kLklGSUxFLCBsb2NhbE1vbml0b3IubmV3Q2hpbGQoMSkpOw0KCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEZpbGVCdWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKGZpbGUuZ2V0RnVsbFBhdGgoKSwgTG9jYXRpb25LaW5kLklGSUxFKS5nZXREb2N1bWVudCgpOw0KCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBKYXZhU2NyaXB0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhVGV4dFRvb2xzKCkuY3JlYXRlRG9jdW1lbnRQYXJ0aXRpb25lcigpOw0KCQkJRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZmluZGVyID0gbmV3IEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKGRvY3VtZW50KTsNCgkJCXBhcnRpdGlvbmVyLmNvbm5lY3QoZG9jdW1lbnQpOw0KCQkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucyA9IHBhcnRpdGlvbmVyLmNvbXB1dGVQYXJ0aXRpb25pbmcoMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOw0KCQkJU3ViTW9uaXRvciBwYXJ0aXRpb25Nb25pdG9yID0gbG9jYWxNb25pdG9yLm5ld0NoaWxkKDEpOw0KCQkJcGFydGl0aW9uTW9uaXRvci5iZWdpblRhc2soIiIsIHBhcnRpdGlvbnMubGVuZ3RoKTsNCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7IGkrKykgew0KCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGFza1RhZ3MubGVuZ3RoOyBqKyspIHsNCgkJCQkJc3dpdGNoIChwYXJ0aXRpb25zW2ldLmdldFR5cGUoKSkgew0KCQkJCQkJY2FzZSBJSmF2YVNjcmlwdFBhcnRpdGlvbnMuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UIDogew0KCQkJCQkJCUlSZWdpb24gbGluZU1hdGNoID0gZmluZGVyLmZpbmQocGFydGl0aW9uc1tpXS5nZXRPZmZzZXQoKSwgdGFza1RhZ3Nbal0uZ2V0VGFnKCksIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7DQoJCQkJCQkJaWYgKGxpbmVNYXRjaCAhPSBudWxsKSB7DQoJCQkJCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChsaW5lTWF0Y2guZ2V0T2Zmc2V0KCkpOw0KCQkJCQkJCQlpbnQgc3RhcnQgPSBsaW5lTWF0Y2guZ2V0T2Zmc2V0KCk7DQoJCQkJCQkJCWludCBsZW5ndGhUb0VuZE9mTGluZSA9IGxpbmVJbmZvLmdldExlbmd0aCgpIC0gKGxpbmVNYXRjaC5nZXRPZmZzZXQoKSAtIGxpbmVJbmZvLmdldE9mZnNldCgpKTsNCgkJCQkJCQkJU3RyaW5nIHRleHQgPSBkb2N1bWVudC5nZXQoc3RhcnQsIGxlbmd0aFRvRW5kT2ZMaW5lKS50cmltKCk7DQoJCQkJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlc0Zvck5ld1Rhc2tNYXJrZXIgPSBjcmVhdGVJbml0aWFsTWFya2VyQXR0cmlidXRlcyh0ZXh0LCBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQobGluZU1hdGNoLmdldE9mZnNldCgpKSwgc3RhcnQsIHRleHQubGVuZ3RoKCksIHRhc2tUYWdzW2pdLmdldFByaW9yaXR5KCkpOw0KCQkJCQkJCQluZXdNYXJrZXJzLmFkZChhdHRyaWJ1dGVzRm9yTmV3VGFza01hcmtlcik7DQoJCQkJCQkJfQ0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQkJY2FzZSBJSmF2YVNjcmlwdFBhcnRpdGlvbnMuSkFWQV9ET0MgOg0KCQkJCQkJY2FzZSBJSmF2YVNjcmlwdFBhcnRpdGlvbnMuSkFWQV9NVUxUSV9MSU5FX0NPTU1FTlQgOiB7DQoJCQkJCQkJSVJlZ2lvbiB0YWdNYXRjaCA9IGZpbmRlci5maW5kKHBhcnRpdGlvbnNbaV0uZ2V0T2Zmc2V0KCksIHRhc2tUYWdzW2pdLmdldFRhZygpLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOw0KCQkJCQkJCXdoaWxlICh0YWdNYXRjaCAhPSBudWxsICYmIHRhZ01hdGNoLmdldE9mZnNldCgpICsgdGFnTWF0Y2guZ2V0TGVuZ3RoKCkgPCBwYXJ0aXRpb25zW2ldLmdldE9mZnNldCgpICsgcGFydGl0aW9uc1tpXS5nZXRMZW5ndGgoKSkgew0KCQkJCQkJCQlpbnQgc3RhcnQgPSB0YWdNYXRjaC5nZXRPZmZzZXQoKTsNCgkJCQkJCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHRhZ01hdGNoLmdldE9mZnNldCgpKTsNCgkJCQkJCQkJaW50IGxlbmd0aFRvRW5kT2ZMaW5lID0gbGluZUluZm8uZ2V0TGVuZ3RoKCkgLSAodGFnTWF0Y2guZ2V0T2Zmc2V0KCkgLSBsaW5lSW5mby5nZXRPZmZzZXQoKSk7DQoJCQkJCQkJCVN0cmluZyB0ZXh0ID0gZG9jdW1lbnQuZ2V0KHN0YXJ0LCBsZW5ndGhUb0VuZE9mTGluZSkudHJpbSgpOw0KCQkJCQkJCQlpbnQgbGluZU51bWJlciA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldCh0YWdNYXRjaC5nZXRPZmZzZXQoKSk7DQoJCQkJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlc0Zvck5ld1Rhc2tNYXJrZXIgPSBjcmVhdGVJbml0aWFsTWFya2VyQXR0cmlidXRlcyh0ZXh0LCBsaW5lTnVtYmVyLCBzdGFydCwgdGV4dC5sZW5ndGgoKSwgdGFza1RhZ3Nbal0uZ2V0UHJpb3JpdHkoKSk7DQoJCQkJCQkJCW5ld01hcmtlcnMuYWRkKGF0dHJpYnV0ZXNGb3JOZXdUYXNrTWFya2VyKTsNCg0KCQkJCQkJCQl0YWdNYXRjaCA9IGZpbmRlci5maW5kKGxpbmVJbmZvLmdldE9mZnNldCgpICsgbGluZUluZm8uZ2V0TGVuZ3RoKCksIHRhc2tUYWdzW2pdLmdldFRhZygpLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOw0KCQkJCQkJCX0NCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCgkJCQkJCWRlZmF1bHQgOg0KCQkJCQl9DQoJCQkJfQ0KCQkJCXBhcnRpdGlvbk1vbml0b3Iud29ya2VkKDEpOw0KCQkJfQ0KCQkJcGFydGl0aW9uZXIuZGlzY29ubmVjdCgpOw0KCQl9DQoJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCgkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7DQoJCX0NCgkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCgkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7DQoJCX0NCgkJZmluYWxseSB7DQoJCQl0cnkgew0KCQkJCXRleHRGaWxlQnVmZmVyTWFuYWdlci5kaXNjb25uZWN0KGZpbGUuZ2V0RnVsbFBhdGgoKSwgTG9jYXRpb25LaW5kLklGSUxFLCBsb2NhbE1vbml0b3IubmV3Q2hpbGQoMSkpOw0KCQkJfQ0KCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBkaXNjb25uZWN0aW5nIGZpbGUgYnVmZmVyIiwgZSk7IC8vJE5PTi1OTFMtMSQNCgkJCX0NCgkJCWxvY2FsTW9uaXRvci5kb25lKCk7DQoJCX0NCgkJcmV0dXJuIG5ld01hcmtlcnMudG9BcnJheShuZXcgTWFwW25ld01hcmtlcnMuc2l6ZSgpXSk7DQoJfQ0KDQoJLyoNCgkgKiAobm9uLUphdmFkb2MpDQoJICogDQoJICogQHNlZQ0KCSAqIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5JRmlsZVRhc2tTY2FubmVyIw0KCSAqIHNodXRkb3duKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQ0KCSAqLw0KCXB1YmxpYyB2b2lkIHNodXRkb3duKElQcm9qZWN0IHByb2plY3QpIHsNCgl9DQoNCgkvKg0KCSAqIChub24tSmF2YWRvYykNCgkgKiANCgkgKiBAc2VlDQoJICogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLklGaWxlVGFza1NjYW5uZXIjDQoJICogc3RhcnR1cChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkNCgkgKi8NCglwdWJsaWMgdm9pZCBzdGFydHVwKElQcm9qZWN0IHByb2plY3QpIHsNCgl9DQoNCn0NCg==