LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU7CgppbXBvcnQgamF2YS51dGlsLkRhdGU7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci8qKgogKiBSZXByZXNlbnRzIGEgcmVxdWVzdCB0aGF0IGhhcyBiZWVuIG1hZGUgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBhIHNlcnZlci4KICogVGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIHJlcXVlc3RzIGlzIGF2YWlsYWJsZSB2aWEge0BsaW5rIE1vbml0b3JDb3JlLmdldFJlcXVlc3RzKCl9LgogKiAKICogQHNpbmNlIDEuMAogKi8KcHVibGljIGludGVyZmFjZSBJUmVxdWVzdCBleHRlbmRzIElBZGFwdGFibGUgewoJLyoqCgkgKiBSZXF1ZXN0IGNvbnRlbnQgdHlwZSAodmFsdWUgMSkgZm9yIHRoZSB0cmFuc3BvcnQgKGhlYWRlcikgb2YgYSByZXF1ZXN0CgkgKiBvciByZXNwb25zZS4KCSAqIAoJICogQHNlZSAjZ2V0UmVxdWVzdChpbnQpCgkgKiBAc2VlICNnZXRSZXNwb25zZShpbnQpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUE9SVCA9IDE7CgkKCS8qKgoJICogUmVxdWVzdCBjb250ZW50IHR5cGUgKHZhbHVlIDIpIGZvciB0aGUgY29udGVudCAoYm9keSkgb2YgYSByZXF1ZXN0CgkgKiBvciByZXNwb25zZS4KCSAqIAoJICogQHNlZSAjZ2V0UmVxdWVzdChpbnQpCgkgKiBAc2VlICNnZXRSZXNwb25zZShpbnQpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlQgPSAyOwoJCgkvKioKCSAqIFJlcXVlc3QgY29udGVudCB0eXBlICh2YWx1ZSAzKSBmb3IgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgcmVxdWVzdAoJICogb3IgcmVzcG9uc2UuCgkgKiAKCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQoJICogQHNlZSAjZ2V0UmVzcG9uc2UoaW50KQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTEwgPSAzOwoKCS8qKgoJICogUmV0dXJuIHRoZSBwcm90b2NvbCBhZGFwdGVyIG9mIHRoZSByZXF1ZXN0LgoJICogCgkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuSVByb3RvY29sQWRhcHRlcgoJICovCglwdWJsaWMgSVByb3RvY29sQWRhcHRlciBnZXRQcm90b2NvbEFkYXB0ZXIoKTsKCgkvKioKCSAqIFJldHVybiB0aGUgZGF0ZS90aW1lIG9mIHRoaXMgcmVxdWVzdC4KCSAqCgkgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXAKCSAqLwoJcHVibGljIERhdGUgZ2V0RGF0ZSgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgbG9jYWwgKGNsaWVudCkgcG9ydC4KCSAqCgkgKiBAcmV0dXJuIHRoZSBsb2NhbCBwb3J0IG51bWJlcgoJICovCglwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgcmVtb3RlIChzZXJ2ZXIpIGhvc3QuCgkgKgoJICogQHJldHVybiB0aGUgcmVtb3RlIGhvc3QKCSAqLwoJcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSByZW1vdGUgKHNlcnZlcikgcG9ydC4KCSAqCgkgKiBAcmV0dXJuIHRoZSByZW1vdGUgcG9ydCBudW1iZXIKCSAqLwoJcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSByZXF1ZXN0IGFzIGEgYnl0ZSBhcnJheS4KCSAqCgkgKiBAcGFyYW0gdHlwZSB0aGUgY29udGVudCB0eXBlIChJUmVxdWVzdC5YKQoJICogQHJldHVybiB0aGUgcmVxdWVzdCBjb250ZW50CgkgKi8KCXB1YmxpYyBieXRlW10gZ2V0UmVxdWVzdChpbnQgdHlwZSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSByZXNwb25zZSBhcyBhIGJ5dGUgYXJyYXkuCgkgKgoJICogQHBhcmFtIHR5cGUgdGhlIGNvbnRlbnQgdHlwZSAoSVJlcXVlc3QuWCkKCSAqIEByZXR1cm4gdGhlIHJlc3BvbnNlIGNvbnRlbnQKCSAqLwoJcHVibGljIGJ5dGVbXSBnZXRSZXNwb25zZShpbnQgdHlwZSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSByZXNwb25zZSB0aW1lIGluIG1pbGxpc2Vjb25kcy4KCSAqCgkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIncyByZXNwb25zZSB0aW1lCgkgKi8KCXB1YmxpYyBsb25nIGdldFJlc3BvbnNlVGltZSgpOwoKCS8qKgoJICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGlzIHJlcXVlc3QuCgkgKgoJICogQHJldHVybiB0aGUgbGFiZWwKCSAqLwoJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOwoKCS8qKgoJICogQWRkIGEgcHJvcGVydHkgdG8gdGhlIHJlcXVlc3QuCgkgKiAKCSAqIEBwYXJhbSBrZXkgdGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgYWRkZWQKCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIGFkZGVkCgkgKi8KCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7CgoJLyoqCgkgKiBHZXQgYSBzdHJpbmcgcHJvcGVydHkgd2l0aCBhIGdpdmVuIGtleSBmcm9tIHRoZSByZXF1ZXN0LgoJICogCgkgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIHByb3BlcnR5CgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eQoJICovCglwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBrZXkpOwoKCS8qKgoJICogR2V0IGEgaW50ZWdlciBwcm9wZXJ0eSB3aXRoIGEgZ2l2ZW4ga2V5IGZyb20gdGhlIHJlcXVlc3QuCgkgKiAKCSAqIEBwYXJhbSBrZXkgdGhlIGtleSBvZiB0aGUgcHJvcGVydHkKCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHByb3BlcnR5CgkgKi8KCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXJQcm9wZXJ0eShTdHJpbmcga2V5KTsKCgkvKioKCSAqIEdldCBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBrZXkgZnJvbSB0aGUgcmVxdWVzdC4KCSAqIAoJICogQHBhcmFtIGtleSB0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eQoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgcHJvcGVydHkKCSAqLwoJcHVibGljIE9iamVjdCBnZXRPYmplY3RQcm9wZXJ0eShTdHJpbmcga2V5KTsKCgkvKioKCSAqIEhvb2sgdG8gYWxsb3cgb3RoZXIgcGx1Z2lucyB0aGF0IGltcGxlbWVudCBJUmVxdWVzdCB0byBmaXJlIGEgY2hhbmdlIGV2ZW50LgoJICogQWZ0ZXIgdGhlIGludGVybmFsIHZhbHVlcyBoYXZlIGNoYW5nZWQsIGNhbGwgdGhpcyBtZXRob2QgdG8gaW52b2tlIGEgcmVxdWVzdAoJICogY2hhbmdlIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycy4KCSAqLwoJcHVibGljIHZvaWQgZmlyZUNoYW5nZWRFdmVudCgpOwoKCS8qKgoJICogQWRkIGEgcmVzZW5kIHJlcXVlc3QgdG8gdGhpcyByZXF1ZXN0LgoJICogCgkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVzZW5kIHJlcXVlc3QgdG8gYWRkCgkgKi8KCXB1YmxpYyB2b2lkIGFkZFJlc2VuZFJlcXVlc3QoSVJlcXVlc3QgcmVxdWVzdCk7CgoJLyoqCgkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlc2VuZCByZXF1ZXN0cyBiYXNlZCBvbiB0aGlzIHJlcXVlc3QuIAoJICogCgkgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiByZXNlbmQgcmVxdWVzdHMgYmFzZWQgb24gdGhpcyByZXF1ZXN0CgkgKi8KCXB1YmxpYyBJUmVzZW5kUmVxdWVzdFtdIGdldFJlc2VuZFJlcXVlc3RzKCk7Cn0=