LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKg0KICovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmltcGw7DQoNCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5BcmdQYWNrYWdlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGVkQ2hhbGxlbmdlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5DbGFpbTsNCg0KLyoqDQogKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2VydGVkIENoYWxsZW5nZTwvYj48L2VtPicuDQogKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCiAqIDxwPg0KICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQogKiA8dWw+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuaW1wbC5Bc3NlcnRlZENoYWxsZW5nZUltcGwjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmltcGwuQXNzZXJ0ZWRDaGFsbGVuZ2VJbXBsI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59PC9saT4NCiAqIDwvdWw+DQogKiA8L3A+DQogKg0KICogQGdlbmVyYXRlZA0KICovDQpwdWJsaWMgY2xhc3MgQXNzZXJ0ZWRDaGFsbGVuZ2VJbXBsIGV4dGVuZHMgQXNzZXJ0ZWRSZWxhdGlvbnNoaXBJbXBsIGltcGxlbWVudHMgQXNzZXJ0ZWRDaGFsbGVuZ2Ugew0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXByb3RlY3RlZCBBc3NlcnRlZENoYWxsZW5nZUltcGwoKSB7DQoJCXN1cGVyKCk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQoJCXJldHVybiBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0NIQUxMRU5HRTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCglwdWJsaWMgRUxpc3Q8Q2xhaW0+IGdldFNvdXJjZSgpIHsNCgkJcmV0dXJuIChFTGlzdDxDbGFpbT4pZUR5bmFtaWNHZXQoQXJnUGFja2FnZS5BU1NFUlRFRF9DSEFMTEVOR0VfX1NPVVJDRSwgQXJnUGFja2FnZS5MaXRlcmFscy5BU1NFUlRFRF9DSEFMTEVOR0VfX1NPVVJDRSwgdHJ1ZSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQoJcHVibGljIEVMaXN0PEFzc2VydGlvbj4gZ2V0VGFyZ2V0KCkgew0KCQlyZXR1cm4gKEVMaXN0PEFzc2VydGlvbj4pZUR5bmFtaWNHZXQoQXJnUGFja2FnZS5BU1NFUlRFRF9DSEFMTEVOR0VfX1RBUkdFVCwgQXJnUGFja2FnZS5MaXRlcmFscy5BU1NFUlRFRF9DSEFMTEVOR0VfX1RBUkdFVCwgdHJ1ZSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0NIQUxMRU5HRV9fU09VUkNFOg0KCQkJCXJldHVybiBnZXRTb3VyY2UoKTsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9DSEFMTEVOR0VfX1RBUkdFVDoNCgkJCQlyZXR1cm4gZ2V0VGFyZ2V0KCk7DQoJCX0NCgkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQoJQE92ZXJyaWRlDQoJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCgkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9DSEFMTEVOR0VfX1NPVVJDRToNCgkJCQlnZXRTb3VyY2UoKS5jbGVhcigpOw0KCQkJCWdldFNvdXJjZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2xhaW0+KW5ld1ZhbHVlKTsNCgkJCQlyZXR1cm47DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfQ0hBTExFTkdFX19UQVJHRVQ6DQoJCQkJZ2V0VGFyZ2V0KCkuY2xlYXIoKTsNCgkJCQlnZXRUYXJnZXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFzc2VydGlvbj4pbmV3VmFsdWUpOw0KCQkJCXJldHVybjsNCgkJfQ0KCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQoJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfQ0hBTExFTkdFX19TT1VSQ0U6DQoJCQkJZ2V0U291cmNlKCkuY2xlYXIoKTsNCgkJCQlyZXR1cm47DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfQ0hBTExFTkdFX19UQVJHRVQ6DQoJCQkJZ2V0VGFyZ2V0KCkuY2xlYXIoKTsNCgkJCQlyZXR1cm47DQoJCX0NCgkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCgkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9DSEFMTEVOR0VfX1NPVVJDRToNCgkJCQlyZXR1cm4gIWdldFNvdXJjZSgpLmlzRW1wdHkoKTsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9DSEFMTEVOR0VfX1RBUkdFVDoNCgkJCQlyZXR1cm4gIWdldFRhcmdldCgpLmlzRW1wdHkoKTsNCgkJfQ0KCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQoJfQ0KDQp9IC8vQXNzZXJ0ZWRDaGFsbGVuZ2VJbXBsDQo=