LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwoKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvck1hbmFnZXI7Ci8qKgogKiBNYWluIGNsYXNzIGZvciBjcmVhdGluZyBuZXcgbW9uaXRvcnMgYW5kIGxvY2F0aW5nIGV4aXN0aW5nIG9uZXMuIFRoZSBtZXRob2RzIG9uCiAqIHRoaXMgY2xhc3MgYXJlIHRocmVhZCBzYWZlLgogKiA8cD4KICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLiBJdCBpcyBub3QgaW50ZW5kZWQKICogdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQuCiAqIDwvcD4KICogCiAqIEBwbGFubmVkZm9yIDEuMAogKi8KcHVibGljIGZpbmFsIGNsYXNzIE1vbml0b3JDb3JlIHsKCXByaXZhdGUgc3RhdGljIE1vbml0b3JNYW5hZ2VyIG1hbmFnZXI7CgkKCS8qKgoJICogQ2Fubm90IGNyZWF0ZSBNb25pdG9yQ29yZSAtIHVzZSBzdGF0aWMgbWV0aG9kcy4KCSAqLwoJcHJpdmF0ZSBNb25pdG9yQ29yZSgpIHsKCQkvLyBjYW4ndCBjcmVhdGUKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIGEgbW9uaXRvciBtYW5hZ2VyIGluc3RhbmNlLgoJICogCgkgKiBAcmV0dXJuIHRoZSBtb25pdG9yIG1hbmFnZXIKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgTW9uaXRvck1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKCQlpZiAobWFuYWdlciA9PSBudWxsKQoJCQltYW5hZ2VyID0gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKCQlyZXR1cm4gbWFuYWdlcjsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBrbm93biBtb25pdG9yIGluc3RhbmNlcy4gVGhlIGxpc3Qgd2lsbCBub3QgY29udGFpbiBhbnkKCSAqIHdvcmtpbmcgY29waWVzIGFuZCBpcyBwZXJzaXN0ZWQgYmV0d2VlbiB3b3JrYmVuY2ggc2Vzc2lvbnMuCgkgKiA8cD4KCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbDsgY2xpZW50cyBtYXkgc2FmZWx5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgoJICogPC9wPgoJICogCgkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgbW9uaXRvciBpbnN0YW5jZXMKCSAqLwoJcHVibGljIHN0YXRpYyBJTW9uaXRvcltdIGdldE1vbml0b3JzKCkgewoJCUxpc3QgbGlzdCA9IGdldE1hbmFnZXIoKS5nZXRNb25pdG9ycygpOwoJCUlNb25pdG9yW10gbSA9IG5ldyBJTW9uaXRvcltsaXN0LnNpemUoKV07CgkJbGlzdC50b0FycmF5KG0pOwoJCXJldHVybiBtOwoJfQoKCS8qKgoJICogQ3JlYXRlcyBhIG5ldyBtb25pdG9yIHdvcmtpbmcgY29weS4gQWZ0ZXIgY29uZmlndXJpbmcgcGFyYW1ldGVycyBvbgoJICogdGhlIHdvcmtpbmcgY29weSwgY2FsbGluZyB7QGxpbmsgSU1vbml0b3JXb3JraW5nQ29weSNzYXZlKCl9IGJyaW5ncwoJICogdGhlIG1vbml0b3IgaW50byBleGlzdGVuY2UuCgkgKiA8cD4KCSAqIE5vdGUgdGhhdCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHtAbGluayBJTW9uaXRvciNkZWxldGUoKX0KCSAqIHRvIGRlbGV0ZSB0aGUgbW9uaXRvciBvbmNlIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFdoZW4gbW9uaXRvcnMgYXJlIGNyZWF0ZWQsIHRoZSBsb2NhbCBhbmQgcmVtb3RlIHBvcnQgdmFsdWVzIGRlZmF1bHQgdG8KCSAqIDxjb2RlPjgwPC9jb2RlPiwgYnV0IHRoZXkgZG8gbm90IGhhdmUgYSBwcm90b2NvbCBvciByZW1vdGUgaG9zdCAodmFsdWVzCgkgKiBhcmUgPGNvZGU+bnVsbDwvY29kZT4pLgoJICogPC9wPiAKCSAqIAoJICogQHJldHVybiBhIG1vbml0b3Igd29ya2luZyBjb3B5CgkgKi8KCXB1YmxpYyBzdGF0aWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVNb25pdG9yKCkgewoJCXJldHVybiBnZXRNYW5hZ2VyKCkuY3JlYXRlTW9uaXRvcigpOwoJfQoKCS8qKgoJICogQWRkcyBhIG1vbml0b3IgbGlzdGVuZXIuCgkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgCgkgKiBjaGFuZ2VzIHRvIHRoZSBtb25pdG9ycy4gVGhlIGxpc3RlbmVyIGNvbnRpbnVlcyB0byByZWNlaXZlCgkgKiBub3RpZmljYXRpb25zIHVudGlsIGl0IGlzIHJlbW92ZWQuCgkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCgkgKgoJICogQHBhcmFtIGxpc3RlbmVyIHRoZSBtb25pdG9yIGxpc3RlbmVyCgkgKiBAc2VlICNyZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcikKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyIGxpc3RlbmVyKSB7CgkJaWYgKGxpc3RlbmVyID09IG51bGwpCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKCQlnZXRNYW5hZ2VyKCkuYWRkTW9uaXRvckxpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCgkvKioKCSAqIFJlbW92ZXMgdGhlIGdpdmVuIG1vbml0b3IgbGlzdGVuZXIuIEhhcyBubwoJICogZWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KCSAqIAoJICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgoJICogQHNlZSAjYWRkTW9uaXRvckxpc3RlbmVyKElNb25pdG9yTGlzdGVuZXIpCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewoJCWlmIChsaXN0ZW5lciA9PSBudWxsKQoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CgkJZ2V0TWFuYWdlcigpLnJlbW92ZU1vbml0b3JMaXN0ZW5lcihsaXN0ZW5lcik7Cgl9Cn0=