LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwovKioKICogUnVudGltZSB0eXBlIGNvbnRlbnQgcHJvdmlkZXIuCiAqLwpwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewoJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX0ZMQVQgPSAwOwoKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAicm9vdCI7CgkKCXByb3RlY3RlZCBieXRlIHN0eWxlOwoJCglwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb247Cglwcm90ZWN0ZWQgaW50IGluaXRpYWxTZWxlY3Rpb25PcmRlcjsKCQoJcHVibGljIGNsYXNzIFRyZWVFbGVtZW50IHsKCQlTdHJpbmcgdGV4dDsKCQlMaXN0IGNvbnRlbnRzOwoJfQoKCXByb3RlY3RlZCBPYmplY3RbXSBlbGVtZW50czsKCXByb3RlY3RlZCBNYXAgZWxlbWVudFRvUGFyZW50TWFwID0gbmV3IEhhc2hNYXAoMik7Cglwcm90ZWN0ZWQgTWFwIHRleHRNYXAgPSBuZXcgSGFzaE1hcCgyKTsKCgkvKioKCSAqIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyKGJ5dGUgc3R5bGUpIHsKCQlzdXBlcigpOwoJCXRoaXMuc3R5bGUgPSBzdHlsZTsKCQkKCQlmaWxsVHJlZSgpOwoJfQoJCglwdWJsaWMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyKGJ5dGUgc3R5bGUsIGJvb2xlYW4gaW5pdCkgewoJCXN1cGVyKCk7CgkJdGhpcy5zdHlsZSA9IHN0eWxlOwoJfQoJCglwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaWxsVHJlZSgpOwoKCXByb3RlY3RlZCB2b2lkIGNsZWFuKCkgewoJCWVsZW1lbnRzID0gbnVsbDsKCQllbGVtZW50VG9QYXJlbnRNYXAgPSBuZXcgSGFzaE1hcCgyKTsKCQl0ZXh0TWFwID0gbmV3IEhhc2hNYXAoMik7CgkJCgkJaW5pdGlhbFNlbGVjdGlvbiA9IG51bGw7CgkJaW5pdGlhbFNlbGVjdGlvbk9yZGVyID0gLTEwMDA7Cgl9CgoJcHJvdGVjdGVkIFRyZWVFbGVtZW50IGdldE9yQ3JlYXRlKExpc3QgbGlzdCwgU3RyaW5nIHRleHQpIHsKCQl0cnkgewoJCQlPYmplY3Qgb2JqID0gdGV4dE1hcC5nZXQodGV4dCk7CgkJCWlmIChvYmogIT0gbnVsbCkKCQkJCXJldHVybiAoVHJlZUVsZW1lbnQpIG9iajsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgkJCgkJVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5ldyBUcmVlRWxlbWVudCgpOwoJCWVsZW1lbnQudGV4dCA9IHRleHQ7CgkJZWxlbWVudC5jb250ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKCQl0ZXh0TWFwLnB1dCh0ZXh0LCBlbGVtZW50KTsKCQlsaXN0LmFkZChlbGVtZW50KTsKCQlyZXR1cm4gZWxlbWVudDsKCX0KCQoJcHJvdGVjdGVkIFRyZWVFbGVtZW50IGdldE9yQ3JlYXRlKExpc3QgbGlzdCwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCkgewoJCXRyeSB7CgkJCU9iamVjdCBvYmogPSB0ZXh0TWFwLmdldChpZCk7CgkJCWlmIChvYmogIT0gbnVsbCkKCQkJCXJldHVybiAoVHJlZUVsZW1lbnQpIG9iajsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgkJCgkJVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5ldyBUcmVlRWxlbWVudCgpOwoJCWVsZW1lbnQudGV4dCA9IHRleHQ7CgkJZWxlbWVudC5jb250ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKCQl0ZXh0TWFwLnB1dChpZCwgZWxlbWVudCk7CgkJbGlzdC5hZGQoZWxlbWVudCk7CgkJcmV0dXJuIGVsZW1lbnQ7Cgl9CgoJcHJvdGVjdGVkIFRyZWVFbGVtZW50IGdldEJ5VGV4dChTdHJpbmcgdGV4dCkgewoJCXRyeSB7CgkJCXJldHVybiAoVHJlZUVsZW1lbnQpIHRleHRNYXAuZ2V0KHRleHQpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCQoJcHJvdGVjdGVkIFRyZWVFbGVtZW50IGdldFBhcmVudEltcGwoT2JqZWN0IG9iaikgewoJCXRyeSB7CgkJCXJldHVybiAoVHJlZUVsZW1lbnQpIGVsZW1lbnRUb1BhcmVudE1hcC5nZXQob2JqKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBEaXNwb3NlcyBvZiB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuICAKCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSB2aWV3ZXIgd2hlbiBpdCBpcyBkaXNwb3NlZC4KCSAqLwoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgCgkgKiB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuIAoJICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLgoJICogVGhlIHJlc3VsdCBpcyBub3QgbW9kaWZpZWQgYnkgdGhlIHZpZXdlci4KCSAqCgkgKiBAcGFyYW0gaW5wdXRFbGVtZW50IHRoZSBpbnB1dCBlbGVtZW50CgkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKCSAqLwoJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7CgkJcmV0dXJuIGVsZW1lbnRzOwoJfQoKCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewoJCWlmIChzdHlsZSA9PSBTVFlMRV9GTEFUKQoJCQlyZXR1cm4gbnVsbDsKCQllbHNlIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmVlRWxlbWVudCkpCgkJCXJldHVybiBudWxsOwoJCQoJCVRyZWVFbGVtZW50IHJ0ZSA9IChUcmVlRWxlbWVudCkgZWxlbWVudDsKCQlyZXR1cm4gcnRlLmNvbnRlbnRzLnRvQXJyYXkoKTsKCX0KCglwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewoJCWlmIChzdHlsZSA9PSBTVFlMRV9GTEFUKQoJCQlyZXR1cm4gbnVsbDsKCQkvL2Vsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmVlRWxlbWVudCkKCQkvLwlyZXR1cm4gbnVsbDsKCgkJcmV0dXJuIGdldFBhcmVudEltcGwoZWxlbWVudCk7Cgl9CgoJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKCQlpZiAoc3R5bGUgPT0gU1RZTEVfRkxBVCkKCQkJcmV0dXJuIGZhbHNlOwoJCS8vZWxzZSBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgVHJlZUVsZW1lbnQpKQoJCS8vCXJldHVybiBmYWxzZTsKCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwoJCXJldHVybiBjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDA7CgoJCS8vcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQKCSAqIGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGVsZW1lbnQuCgkgKiA8cD4KCSAqIEEgdHlwaWNhbCB1c2UgZm9yIHRoaXMgbWV0aG9kIGlzIHJlZ2lzdGVyaW5nIHRoZSBjb250ZW50IHByb3ZpZGVyIGFzIGEgbGlzdGVuZXIKCSAqIHRvIGNoYW5nZXMgb24gdGhlIG5ldyBpbnB1dCAodXNpbmcgbW9kZWwtc3BlY2lmaWMgbWVhbnMpLCBhbmQgZGVyZWdpc3RlcmluZyB0aGUgdmlld2VyIAoJICogZnJvbSB0aGUgb2xkIGlucHV0LiBJbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgdGhlIGNvbnRlbnQgcHJvdmlkZXIKCSAqIHByb3BhZ2F0ZXMgdGhlIGNoYW5nZXMgdG8gdGhlIHZpZXdlci4KCSAqIDwvcD4KCSAqCgkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKCSAqIEBwYXJhbSBvbGRJbnB1dCB0aGUgb2xkIGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIKCSAqICAgZGlkIG5vdCBwcmV2aW91c2x5IGhhdmUgYW4gaW5wdXQKCSAqIEBwYXJhbSBuZXdJbnB1dCB0aGUgbmV3IGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIKCSAqICAgZG9lcyBub3QgaGF2ZSBhbiBpbnB1dAoJICovCglwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgkKCXB1YmxpYyBPYmplY3QgZ2V0SW5pdGlhbFNlbGVjdGlvbigpIHsKCQlyZXR1cm4gaW5pdGlhbFNlbGVjdGlvbjsKCX0KfQ==