LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU7CgppbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvclBsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci8qKgogKiBCYXNlIGNsYXNzIGZvciBvYnRhaW5pbmcgcmVmZXJlbmNlcyB0byBtb25pdG9yIG1vZGVscy4gVGhpcyBjbGFzcyBhbHNvIHByb3ZpZGUgbWV0aG9kcwogKiB0byBkbyBvcGVyYXRpb25zIG9uIGEgbW9uaXRvci4KICogCiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBjbGFzcyBNb25pdG9yQ29yZSB7CgkvKioKCSAqIFByb3RvY29sIGFkYXB0ZXIgaWQgKHZhbHVlICJUQ1BJUCIpIGZvciBUQ1AvSVAuIFByb3ZpZGVkIGhlcmUgZm9yIGNvbnZlbmllbmNlOwoJICogb3RoZXIgcHJvdG9jb2wgYWRhcHRlcnMgbWF5IGJlIGF2YWlsYWJsZS4KCSAqIAoJICogQHNlZSAjZmluZFByb3RvY29sQWRhcHRlcihTdHJpbmcpCgkgKi8KCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRDUElQX1BST1RPQ09MX0lEID0gIlRDUElQIjsKCgkvKioKCSAqIFByb3RvY29sIGFkYXB0ZXIgaWQgKHZhbHVlICJIVFRQIikgZm9yIEhUVFAuIFByb3ZpZGVkIGhlcmUgZm9yIGNvbnZlbmllbmNlOwoJICogb3RoZXIgcHJvdG9jb2wgYWRhcHRlcnMgbWF5IGJlIGF2YWlsYWJsZS4KCSAqIAoJICogQHNlZSAjZmluZFByb3RvY29sQWRhcHRlcihTdHJpbmcpCgkgKi8KCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUVFBfUFJPVE9DT0xfSUQgPSAiSFRUUCI7CgoJcHJpdmF0ZSBzdGF0aWMgTW9uaXRvck1hbmFnZXIgbWFuYWdlciA9IE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7CgkKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwoJCgkvKioKCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIG1vbml0b3IgaW5zdGFuY2VzLiBUaGUgbGlzdCB3aWxsIG5vdCBjb250YWluIGFueQoJICogd29ya2luZyBjb3BpZXMuCgkgKiA8cD4KCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCgkgKiA8L3A+CgkgKiAKCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb25pdG9yIGluc3RhbmNlcyB7QGxpbmsgSU1vbml0b3J9CgkgKi8KCXB1YmxpYyBzdGF0aWMgSU1vbml0b3JbXSBnZXRNb25pdG9ycygpIHsKCQlMaXN0IGxpc3QgPSBtYW5hZ2VyLmdldE1vbml0b3JzKCk7CgkJSU1vbml0b3JbXSBtID0gbmV3IElNb25pdG9yW2xpc3Quc2l6ZSgpXTsKCQlsaXN0LnRvQXJyYXkobSk7CgkJcmV0dXJuIG07Cgl9CgkKCS8qKgoJICogQ3JlYXRlIGEgbmV3IG1vbml0b3IuIFRoZSBtb25pdG9yIHdpbGwgbm90IGV4aXN0IGZvciB1c2UgdW50aWwKCSAqIHRoZSBzYXZlKCkgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KCSAqIAoJICogQHJldHVybiBhIHdvcmtpbmcgY29weSBvZiB0aGUgY3JlYXRlZCBtb25pdG9yCgkgKi8KCXB1YmxpYyBzdGF0aWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVNb25pdG9yKCkgewoJCXJldHVybiBtYW5hZ2VyLmNyZWF0ZU1vbml0b3IoKTsKCX0KCQoJLyoqCgkgKiBTdGFydCB0aGUgZ2l2ZW4gbW9uaXRvciBsaXN0ZW5pbmcgb24gaXQncyBjbGllbnQgcG9ydC4KCSAqIFRoZSBtb25pdG9yIG11c3Qgbm90IGJlIG51bGwuCgkgKiAKCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRvIGJlIHN0YXJ0ZWQKCSAqIEB0aHJvd3MgRXhjZXB0aW9uIHRocm93biBpZiB0aGUgbW9uaXRvciBmYWlscyB0byBzdGFydCBiZWNhdXNlIHRoZSBwb3J0CgkgKiAgICBpcyBpbiB1c2Ugb3IgYW5vdGhlciBwcm9ibGVtIG9jY3VycwoJICovCglwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewoJCWlmIChtb25pdG9yID09IG51bGwpCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKCQltYW5hZ2VyLnN0YXJ0TW9uaXRvcihtb25pdG9yKTsKCX0KCQoJLyoqCgkgKiBTdG9wIHRoZSBnaXZlbiBtb25pdG9yIGFuZCByZW1vdmVzIGFsbCByZXNvdXJjZXMuCgkgKiBUaGUgbW9uaXRvciBtdXN0IG5vdCBiZSBudWxsLgoJICogCgkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0byBiZSBzdG9wcGVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wTW9uaXRvcihJTW9uaXRvciBtb25pdG9yKSB7CgkJaWYgKG1vbml0b3IgPT0gbnVsbCkKCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwoJCW1hbmFnZXIuc3RvcE1vbml0b3IobW9uaXRvcik7Cgl9CgkKCS8qKgoJICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcHJvdG9jb2wgYWRhcHRlciBpbnN0YW5jZXMuCgkgKiA8cD4KCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCgkgKiA8L3A+CgkgKiAKCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBwcm90b2NvbCBhZGFwdGVyIGluc3RhbmNlcyB7QGxpbmsgSVByb3RvY29sQWRhdGVyfQoJICovCglwdWJsaWMgc3RhdGljIElQcm90b2NvbEFkYXB0ZXJbXSBnZXRQcm90b2NvbEFkYXB0ZXJzKCkgewoJCXJldHVybiBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvdG9jb2xBZGFwdGVycygpOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIHByb3RvY29sIGFkYXB0ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CgkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgoJICogcHJvdG9jb2wgYWRhcHRlciAoe0BsaW5rICNnZXRQcm90b2NvbEFkYXB0ZXJzKCl9KSBmb3IgdGhlIG9uZSB3aXRoIGEKCSAqIG1hdGNoaW5nIGlkICh7QGxpbmsgSVByb3RvY29sQWRhdGVyI2dldElkKCl9KS4gVGhlIGlkIG1heSBub3QgYmUgbnVsbC4KCSAqCgkgKiBAcGFyYW0gdGhlIHByb3RvY29sIGFkYXB0ZXIgaWQKCSAqIEByZXR1cm4gdGhlIHByb3RvY29sIGFkYXB0ZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCgkgKiAgIGlzIG5vIHByb3RvY29sIGFkYXB0ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQKCSAqLwoJcHVibGljIHN0YXRpYyBJUHJvdG9jb2xBZGFwdGVyIGZpbmRQcm90b2NvbEFkYXB0ZXIoU3RyaW5nIGlkKSB7CgkJcmV0dXJuIE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm90b2NvbEFkYXB0ZXIoaWQpOwoJfQoJCgkvKioKCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIGNvbnRlbnQgZmlsdGVycy4KCSAqIDxwPgoJICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KCSAqIDwvcD4KCSAqIAoJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGNvbnRlbnQgZmlsdGVyIGluc3RhbmNlcyB7QGxpbmsgSUNvbnRlbnRGaWx0ZXJ9CgkgKi8KCXB1YmxpYyBzdGF0aWMgSUNvbnRlbnRGaWx0ZXJbXSBnZXRDb250ZW50RmlsdGVycygpIHsKCQlyZXR1cm4gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRGaWx0ZXJzKCk7Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0aGUgY29udGVudCBmaWx0ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CgkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgoJICogY29udGVudCBmaWx0ZXJzICh7QGxpbmsgI2dldENvbnRlbnRGaWx0ZXJzKCl9KSBmb3IgdGhlIG9uZSB3aXRoIGEKCSAqIG1hdGNoaW5nIGlkICh7QGxpbmsgSUNvbnRlbnRGaWx0ZXIjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgoJICoKCSAqIEBwYXJhbSB0aGUgY29udGVudCBmaWx0ZXIgaWQKCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZmlsdGVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZQoJICogICBpcyBubyBjb250ZW50IGZpbHRlciB3aXRoIHRoZSBnaXZlbiBpZAoJICovCglwdWJsaWMgc3RhdGljIElDb250ZW50RmlsdGVyIGZpbmRDb250ZW50RmlsdGVyKFN0cmluZyBpZCkgewoJCXJldHVybiBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudEZpbHRlcihpZCk7Cgl9CgkKCS8qKgoJICogQWRkIGEgbW9uaXRvciBsaXN0ZW5lci4KCSAqIE9uY2UgcmVnaXN0ZXJlZCwgYSBsaXN0ZW5lciBzdGFydHMgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbiBvZiAKCSAqIGNoYW5nZXMgdG8gdGhlIG1vbml0b3JzLiBUaGUgbGlzdGVuZXIgY29udGludWVzIHRvIHJlY2VpdmUKCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KCSAqCgkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIG1vbml0b3IgbGlzdGVuZXIKCSAqIEBzZWUgI3JlbW92ZU1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyKQoJICovCglwdWJsaWMgc3RhdGljIHZvaWQgYWRkTW9uaXRvckxpc3RlbmVyKElNb25pdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKCQltYW5hZ2VyLmFkZE1vbml0b3JMaXN0ZW5lcihsaXN0ZW5lcik7Cgl9CgoJLyoqCgkgKiBSZW1vdmVzIHRoZSBnaXZlbiBtb25pdG9yIGxpc3RlbmVyLiBIYXMgbm8KCSAqIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCgkgKiAKCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKCSAqIEBzZWUgI2FkZE1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyKQoJICovCglwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTW9uaXRvckxpc3RlbmVyKElNb25pdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKCQltYW5hZ2VyLnJlbW92ZU1vbml0b3JMaXN0ZW5lcihsaXN0ZW5lcik7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biByZXF1ZXN0IGluc3RhbmNlcy4KCSAqIDxwPgoJICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KCSAqIDwvcD4KCSAqIAoJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJlcXVlc3QgaW5zdGFuY2VzIHtAbGluayBJUmVxdWVzdH0KCSAqLwoJcHVibGljIHN0YXRpYyBJUmVxdWVzdFtdIGdldFJlcXVlc3RzKCkgewoJCUxpc3QgbGlzdCA9IG1hbmFnZXIuZ2V0UmVxdWVzdHMoKTsKCQlJUmVxdWVzdFtdIHIgPSBuZXcgSVJlcXVlc3RbbGlzdC5zaXplKCldOwoJCWxpc3QudG9BcnJheShyKTsKCQlyZXR1cm4gcjsKCX0KCQoJLyoqCgkgKiBSZW1vdmUgYWxsIHJlcXVlc3RzLiBUaGlzIG1ldGhvZCBjbGVhcnMgYWxsIHJlcXVlc3RzIGFuZCB0aGVpciBkYXRhCgkgKiBmcm9tIHRoZSBidWZmZXIgYW5kIG5vdGlmaWVzIHRoZSByZXF1ZXN0IGxpc3RlbmVycy4KCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFJlcXVlc3RzKCkgewoJCW1hbmFnZXIucmVtb3ZlQWxsUmVxdWVzdHMoKTsKCX0KCQoJLyoqCgkgKiBBZGQgYSByZXF1ZXN0IGxpc3RlbmVyLgoJICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIAoJICogY2hhbmdlcyB0byB0aGUgcmVxdWVzdHMuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQoJICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZW1vdmVkLgoJICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgoJICoKCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgcmVxdWVzdCBsaXN0ZW5lcgoJICogQHNlZSAjcmVtb3ZlUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcikgewoJCW1hbmFnZXIuYWRkUmVxdWVzdExpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCgkvKioKCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHJlcXVlc3QgbGlzdGVuZXIuIEhhcyBubwoJICogZWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KCSAqIAoJICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgoJICogQHNlZSAjYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcikgewoJCW1hbmFnZXIucmVtb3ZlUmVxdWVzdExpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCQoJLyoqCgkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGFyc2UgdGhlIGdpdmVuIGJ5dGVzIGludG8gU3RyaW5nIGZvcm0uIFRoZSBieXRlcwoJICogYXJlIHBhcnNlZCBpbnRvIGEgbGluZSBkZWxpbWl0ZWQgc3RyaW5nLiBUaGUgYnl0ZSBhcnJheSBtdXN0IG5vdCBiZSBudWxsLgoJICogCgkgKiBAcGFyYW0gYiBhIGJ5dGUgYXJyYXkKCSAqIEByZXR1cm4gdGhlIHN0cmluZyBhZnRlciB0aGUgY29udmVyc2lvbgoJICovCglwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZShieXRlW10gYikgewoJCWlmIChiID09IG51bGwpCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKCgkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpOwoJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihiaW4pKTsKCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgkJdHJ5IHsKCQkJU3RyaW5nIHMgPSBici5yZWFkTGluZSgpOwoJCQkKCQkJd2hpbGUgKHMgIT0gbnVsbCkgewoJCQkJc2IuYXBwZW5kKHMpOwoJCQkJcyA9IGJyLnJlYWRMaW5lKCk7CgkJCQlpZiAocyAhPSBudWxsKQoJCQkJCXNiLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHBhcnNpbmcgaW5wdXQiLCBlKTsKCQl9CgkJCgkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cgl9CgoJLyoqCgkgKiBDcmVhdGUgYW5kIHJldHVybiBhbiBuZXcgSVJlc2VuZFJlcXVlc3QgZnJvbSB0aGUgc3BlY2lmaWVkIHJlcXVlc3QuCgkgKiBUaGUgcmVxdWVzdCBtYXkgbm90IGJlIG51bGwuCgkgKiAKCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRoYXQgaXMgdG8gYmUgcmVzZW50CgkgKiBAcmV0dXJuIGEgbmV3IElSZXNlbmRSZXF1ZXN0IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcmVxdWVzdAoJICovCglwdWJsaWMgc3RhdGljIElSZXNlbmRSZXF1ZXN0IGNyZWF0ZVJlc2VuZFJlcXVlc3QoSVJlcXVlc3QgcmVxdWVzdCkgewoJCWlmIChyZXF1ZXN0ID09IG51bGwpCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKCQlyZXR1cm4gbmV3IFJlc2VuZEhUVFBSZXF1ZXN0KHJlcXVlc3QpOwoJfQp9