LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXI7CgppbXBvcnQgamF2YS5pby5GaWxlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLyoqCiAqCiAqLwpwdWJsaWMgY2xhc3MgV2ViQnJvd3NlclZpZXdEcm9wQWRhcHRlciBleHRlbmRzIERyb3BUYXJnZXRBZGFwdGVyIHsKICAgLyoqCiAgICAqIFRoZSB2aWV3IHRvIHdoaWNoIHRoaXMgZHJvcCBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLgogICAgKi8KICAgcHJpdmF0ZSBCcm93c2VyVmlld2VyIHZpZXc7CgogICAvKioKICAgICogVGhlIGN1cnJlbnQgb3BlcmF0aW9uLgogICAgKi8KICAgcHJpdmF0ZSBpbnQgY3VycmVudE9wZXJhdGlvbiA9IERORC5EUk9QX05PTkU7CgogICAvKioKICAgICogVGhlIGxhc3QgdmFsaWQgb3BlcmF0aW9uLgogICAgKi8KICAgcHJpdmF0ZSBpbnQgbGFzdFZhbGlkT3BlcmF0aW9uID0gRE5ELkRST1BfTk9ORTsKICAgCiAgIHByb3RlY3RlZCBXZWJCcm93c2VyVmlld0Ryb3BBZGFwdGVyKEJyb3dzZXJWaWV3ZXIgdmlldykgewoJCXRoaXMudmlldyA9IHZpZXc7Cgl9CgogICAvKiAobm9uLUphdmFkb2MpCiAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEcm9wVGFyZ2V0QWRhcHRlci4KICAgICogVGhlIG1vdXNlIGhhcyBtb3ZlZCBvdmVyIHRoZSBkcm9wIHRhcmdldC4gIElmIHRoZQogICAgKiB0YXJnZXQgaXRlbSBoYXMgY2hhbmdlZCwgbm90aWZ5IHRoZSBhY3Rpb24gYW5kIGNoZWNrCiAgICAqIHRoYXQgaXQgaXMgc3RpbGwgZW5hYmxlZC4KICAgICovCiAgIHByaXZhdGUgdm9pZCBkb0Ryb3BWYWxpZGF0aW9uKERyb3BUYXJnZXRFdmVudCBldmVudCkgewogICAgICAgLy91cGRhdGUgbGFzdCB2YWxpZCBvcGVyYXRpb24KICAgICAgIGlmIChldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTk9ORSkKICAgICAgICAgICBsYXN0VmFsaWRPcGVyYXRpb24gPSBldmVudC5kZXRhaWw7CiAgICAgICAKICAgICAgIC8vdmFsaWQgZHJvcCBhbmQgc2V0IGV2ZW50IGRldGFpbCBhY2NvcmRpbmdseQogICAgICAgaWYgKHZhbGlkYXRlRHJvcChldmVudC5kZXRhaWwsIGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpCiAgICAgICAgICAgY3VycmVudE9wZXJhdGlvbiA9IGxhc3RWYWxpZE9wZXJhdGlvbjsKICAgICAgIGVsc2UKICAgICAgICAgICBjdXJyZW50T3BlcmF0aW9uID0gRE5ELkRST1BfTk9ORTsKICAgICAgIAogICAgICAgZXZlbnQuZGV0YWlsID0gY3VycmVudE9wZXJhdGlvbjsKICAgfQoKICAgLyogKG5vbi1KYXZhZG9jKQogICAgKiBNZXRob2QgZGVjbGFyZWQgb24gRHJvcFRhcmdldEFkYXB0ZXIuCiAgICAqIFRoZSBkcm9wIG9wZXJhdGlvbiBoYXMgY2hhbmdlZCwgc2VlIGlmIHRoZSBhY3Rpb24KICAgICogc2hvdWxkIHN0aWxsIGJlIGVuYWJsZWQuCiAgICAqLwogICBwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKICAgICAgIGRvRHJvcFZhbGlkYXRpb24oZXZlbnQpOwogICB9CgogICAvKiAobm9uLUphdmFkb2MpCiAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEcm9wVGFyZ2V0QWRhcHRlci4KICAgICogVGhlIG1vdXNlIGhhcyBtb3ZlZCBvdmVyIHRoZSBkcm9wIHRhcmdldC4gIElmIHRoZQogICAgKiB0YXJnZXQgaXRlbSBoYXMgY2hhbmdlZCwgbm90aWZ5IHRoZSBhY3Rpb24gYW5kIGNoZWNrCiAgICAqIHRoYXQgaXQgaXMgc3RpbGwgZW5hYmxlZC4KICAgICovCiAgIHB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewogICAgICAgLy9zZXQgdGhlIGxvY2F0aW9uIGZlZWRiYWNrCiAgIAkgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwoKICAgICAgIC8vc2VlIGlmIGFueXRoaW5nIGhhcyByZWFsbHkgY2hhbmdlZCBiZWZvcmUgZG9pbmcgdmFsaWRhdGlvbi4KICAgICAgIGRvRHJvcFZhbGlkYXRpb24oZXZlbnQpOwogICB9CgogICAvKiAobm9uLUphdmFkb2MpCiAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEcm9wVGFyZ2V0QWRhcHRlci4KICAgICogVGhlIHVzZXIgaGFzIGRyb3BwZWQgc29tZXRoaW5nIG9uIHRoZSBkZXNrdG9wIHZpZXdlci4KICAgICovCiAgIHB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7CiAgICAgICAvL3BlcmZvcm0gdGhlIGRyb3AgYmVoYXZpb3VyCiAgICAgICBpZiAoIXBlcmZvcm1Ecm9wKGV2ZW50LmRhdGEpKQogICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7CiAgICAgICAKICAgICAgIGN1cnJlbnRPcGVyYXRpb24gPSBldmVudC5kZXRhaWw7CiAgIH0KCiAgIC8qIChub24tSmF2YWRvYykKICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIERyb3BUYXJnZXRBZGFwdGVyLgogICAgKiBMYXN0IGNoYW5jZSBmb3IgdGhlIGFjdGlvbiB0byBkaXNhYmxlIGl0c2VsZgogICAgKi8KICAgcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKICAgICAgIGlmICghdmFsaWRhdGVEcm9wKGV2ZW50LmRldGFpbCwgZXZlbnQuY3VycmVudERhdGFUeXBlKSkKICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwogICB9CgoJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewoJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKCiAgICAgICBkb0Ryb3BWYWxpZGF0aW9uKGV2ZW50KTsKCX0KCgkvKioKICAgICogUGVyZm9ybXMgYW55IHdvcmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBkcm9wLgogICAgKiA8cD4KICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGRyb3AgYmVoYXZpb3IuCiAgICAqIDwvcD4KICAgICoKICAgICogQHBhcmFtIGRhdGEgdGhlIGRyb3AgZGF0YQogICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkcm9wIHdhcyBzdWNjZXNzZnVsLCBhbmQgCiAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogICAgKi8KCXByb3RlY3RlZCBib29sZWFuIHBlcmZvcm1Ecm9wKE9iamVjdCBkYXRhKSB7CgkJaWYgKGRhdGEgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewoJCQlTdHJpbmdbXSBzID0gKFN0cmluZ1tdKSBkYXRhOwoJCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoID09IDApCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJRmlsZSBmID0gbmV3IEZpbGUoc1swXSk7CgkJCXRyeSB7CgkJCQl2aWV3LnNldFVSTChmLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQkvLyBUT0RPCgkJCX0KCQl9CgkJCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCiAgICAqIFZhbGlkYXRlcyBkcm9wcGluZyBvbiB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgc29tZSAKICAgICogYXNwZWN0IG9mIHRoZSBkcm9wIG9wZXJhdGlvbiBjaGFuZ2VzLgogICAgKiA8cD4KICAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkZWZpbmUgd2hpY2ggZHJvcHMgbWFrZSBzZW5zZS4KICAgICogPC9wPgogICAgKiAKICAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRoYXQgdGhlIG1vdXNlIGlzIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyLCBvcgogICAgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtb3VzZSBpcyBob3ZlcmluZyBvdmVyIGVtcHR5IHNwYWNlCiAgICAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIGN1cnJlbnQgZHJhZyBvcGVyYXRpb24gKGNvcHksIG1vdmUsIGV0Yy4pCiAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIGN1cnJlbnQgdHJhbnNmZXIgdHlwZQogICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkcm9wIGlzIHZhbGlkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+CiAgICAqICAgb3RoZXJ3aXNlCiAgICAqLwoJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVEcm9wKGludCBvcGVyYXRpb24sIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpCgkJCXJldHVybiB0cnVlOwoJCS8qaWYgKFJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkKCQkJcmV0dXJuIHRydWU7CgkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkKCQkJcmV0dXJuIHRydWU7Ki8KCQkKCQlyZXR1cm4gZmFsc2U7Cgl9Cn0=