LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IFN1biBNaWNyb3N5c3RlbXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAogKiAKICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAogKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAogKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgTGluZGEgRGVNaWNoaWVsIC1KYXZhIFBlcnNpc3RlbmNlIDIuMCAtIFByb3Bvc2VkIEZpbmFsIERyYWZ0LCBWZXJzaW9uIDIuMCAoQXVndXN0IDMxLCAyMDA5KQogKiAgICAgU3BlY2lmaWNhdGlvbiBhdmFpbGFibGUgZnJvbSBodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTMxNwogKgogKiBKYXZhKFRNKSBQZXJzaXN0ZW5jZSBBUEksIFZlcnNpb24gMi4wIC0gRUFSTFkgQUNDRVNTCiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYW4gZWFybHktZHJhZnQgc3BlY2lmaWNhdGlvbiBkZXZlbG9wZWQgdW5kZXIgdGhlIAogKiBKYXZhIENvbW11bml0eSBQcm9jZXNzIChKQ1ApLiAgVGhlIGNvZGUgaXMgdW50ZXN0ZWQgYW5kIHByZXN1bWVkIG5vdCB0byBiZSBhICAKICogY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiBvZiBKU1IgMzE3OiBKYXZhKFRNKSBQZXJzaXN0ZW5jZSBBUEksIFZlcnNpb24gMi4wLiAgIAogKiBXZSBlbmNvdXJhZ2UgeW91IHRvIG1pZ3JhdGUgdG8gYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEphdmEoVE0pIFBlcnNpc3RlbmNlIAogKiBBUEksIFZlcnNpb24gMi4wIFNwZWNpZmljYXRpb24gdGhhdCBoYXMgYmVlbiB0ZXN0ZWQgYW5kIHZlcmlmaWVkIHRvIGJlIGNvbXBhdGlibGUgCiAqIGFzIHNvb24gYXMgc3VjaCBhbiBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUsIGFuZCB3ZSBlbmNvdXJhZ2UgeW91IHRvIHJldGFpbiAKICogdGhpcyBub3RpY2UgaW4gYW55IGltcGxlbWVudGF0aW9uIG9mIEphdmEoVE0pIFBlcnNpc3RlbmNlIEFQSSwgVmVyc2lvbiAyLjAgCiAqIFNwZWNpZmljYXRpb24gdGhhdCB5b3UgZGlzdHJpYnV0ZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBqYXZheC5wZXJzaXN0ZW5jZTsKCmltcG9ydCBqYXZhLnV0aWwuU2V0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLm1ldGFtb2RlbC5NZXRhbW9kZWw7CmltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5jcml0ZXJpYS5RdWVyeUJ1aWxkZXI7CmltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5jcml0ZXJpYS5Dcml0ZXJpYVF1ZXJ5OwoKLyoqCiAqIEludGVyZmFjZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQuCiAqCiAqIDxwPiBBbiA8Y29kZT5FbnRpdHlNYW5hZ2VyPC9jb2RlPiBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggCiAqIGEgcGVyc2lzdGVuY2UgY29udGV4dC4gQSBwZXJzaXN0ZW5jZSBjb250ZXh0IGlzIGEgc2V0IG9mIGVudGl0eSAKICogaW5zdGFuY2VzIGluIHdoaWNoIGZvciBhbnkgcGVyc2lzdGVudCBlbnRpdHkgaWRlbnRpdHkgdGhlcmUgaXMgCiAqIGEgdW5pcXVlIGVudGl0eSBpbnN0YW5jZS4gV2l0aGluIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LCB0aGUgCiAqIGVudGl0eSBpbnN0YW5jZXMgYW5kIHRoZWlyIGxpZmVjeWNsZSBhcmUgbWFuYWdlZC4gVGhpcyBpbnRlcmZhY2UgCiAqIGRlZmluZXMgdGhlIG1ldGhvZHMgdGhhdCBhcmUgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSAKICogcGVyc2lzdGVuY2UgY29udGV4dC4gVGhlIDxjb2RlPkVudGl0eU1hbmFnZXI8L2NvZGU+IEFQSSBpcyB1c2VkIAogKiB0byBjcmVhdGUgYW5kIHJlbW92ZSBwZXJzaXN0ZW50IGVudGl0eSBpbnN0YW5jZXMsIHRvIGZpbmQgZW50aXRpZXMgCiAqIGJ5IHRoZWlyIHByaW1hcnkga2V5LCBhbmQgdG8gcXVlcnkgb3ZlciBlbnRpdGllcy4KICoKICogPHA+IFRoZSBzZXQgb2YgZW50aXRpZXMgdGhhdCBjYW4gYmUgbWFuYWdlZCBieSBhIGdpdmVuIAogKiA8Y29kZT5FbnRpdHlNYW5hZ2VyPC9jb2RlPiBpbnN0YW5jZSBpcyBkZWZpbmVkIGJ5IGEgcGVyc2lzdGVuY2UgCiAqIHVuaXQuIEEgcGVyc2lzdGVuY2UgdW5pdCBkZWZpbmVzIHRoZSBzZXQgb2YgYWxsIGNsYXNzZXMgdGhhdCBhcmUgCiAqIHJlbGF0ZWQgb3IgZ3JvdXBlZCBieSB0aGUgYXBwbGljYXRpb24sIGFuZCB3aGljaCBtdXN0IGJlIAogKiBjb2xvY2F0ZWQgaW4gdGhlaXIgbWFwcGluZyB0byBhIHNpbmdsZSBkYXRhYmFzZS4KICoKICogQHNlZSBRdWVyeQogKiBAc2VlIFR5cGVkUXVlcnkKICogQHNlZSBDcml0ZXJpYVF1ZXJ5CiAqIEBzZWUgUGVyc2lzdGVuY2VDb250ZXh0CiAqIAogKiBAc2luY2UgSmF2YSBQZXJzaXN0ZW5jZSAxLjAKICovCnB1YmxpYyBpbnRlcmZhY2UgRW50aXR5TWFuYWdlciB7CgogICAgLyoqCiAgICAgKiBNYWtlIGFuIGluc3RhbmNlIG1hbmFnZWQgYW5kIHBlcnNpc3RlbnQuCiAgICAgKiBAcGFyYW0gZW50aXR5ICBlbnRpdHkgaW5zdGFuY2UKICAgICAqIEB0aHJvd3MgRW50aXR5RXhpc3RzRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgYWxyZWFkeSBleGlzdHMuCiAgICAgKiAoSWYgdGhlIGVudGl0eSBhbHJlYWR5IGV4aXN0cywgdGhlIDxjb2RlPkVudGl0eUV4aXN0c0V4Y2VwdGlvbjwvY29kZT4gbWF5IAogICAgICogYmUgdGhyb3duIHdoZW4gdGhlIHBlcnNpc3Qgb3BlcmF0aW9uIGlzIGludm9rZWQsIG9yIHRoZQogICAgICogPGNvZGU+RW50aXR5RXhpc3RzRXhjZXB0aW9uPC9jb2RlPiBvciBhbm90aGVyIDxjb2RlPlBlcnNpc3RlbmNlRXhjZXB0aW9uPC9jb2RlPiBtYXkgYmUgCiAgICAgKiB0aHJvd24gYXQgZmx1c2ggb3IgY29tbWl0IHRpbWUuKSAKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QgYW4KICAgICAqICAgICAgICAgZW50aXR5CiAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgaW52b2tlZCBvbiBhCiAgICAgKiAgICAgICAgIGNvbnRhaW5lci1tYW5hZ2VkIGVudGl0eSBtYW5hZ2VyIG9mIHR5cGUgCiAgICAgKiAgICAgICAgIDxjb2RlPlBlcnNpc3RlbmNlQ29udGV4dFR5cGUuVFJBTlNBQ1RJT048L2NvZGU+IGFuZCB0aGVyZSBpcyAKICAgICAqICAgICAgICAgbm8gdHJhbnNhY3Rpb24uCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHBlcnNpc3QoT2JqZWN0IGVudGl0eSk7CiAgICAKICAgIC8qKgogICAgICogTWVyZ2UgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBlbnRpdHkgaW50byB0aGUKICAgICAqIGN1cnJlbnQgcGVyc2lzdGVuY2UgY29udGV4dC4KICAgICAqIEBwYXJhbSBlbnRpdHkgIGVudGl0eSBpbnN0YW5jZQogICAgICogQHJldHVybiB0aGUgbWFuYWdlZCBpbnN0YW5jZSB0aGF0IHRoZSBzdGF0ZSB3YXMgbWVyZ2VkIHRvCiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbnN0YW5jZSBpcyBub3QgYW4KICAgICAqICAgICAgICAgZW50aXR5IG9yIGlzIGEgcmVtb3ZlZCBlbnRpdHkKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbiBpZiBpbnZva2VkIG9uIGEKICAgICAqICAgICAgICAgY29udGFpbmVyLW1hbmFnZWQgZW50aXR5IG1hbmFnZXIgb2YgdHlwZSAKICAgICAqICAgICAgICAgPGNvZGU+UGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTjwvY29kZT4gYW5kIHRoZXJlIGlzIAogICAgICogICAgICAgICBubyB0cmFuc2FjdGlvbi4KICAgICAqLyAgICAKICAgIHB1YmxpYyA8VD4gVCBtZXJnZShUIGVudGl0eSk7CiAgICAKICAgIC8qKgogICAgICogUmVtb3ZlIHRoZSBlbnRpdHkgaW5zdGFuY2UuCiAgICAgKiBAcGFyYW0gZW50aXR5CiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFuY2UgaXMgbm90IGFuCiAgICAgKiAgICAgICAgIGVudGl0eSBvciBpcyBhIGRldGFjaGVkIGVudGl0eQogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIGludm9rZWQgb24gYQogICAgICogICAgICAgICBjb250YWluZXItbWFuYWdlZCBlbnRpdHkgbWFuYWdlciBvZiB0eXBlIAogICAgICogICAgICAgICA8Y29kZT5QZXJzaXN0ZW5jZUNvbnRleHRUeXBlLlRSQU5TQUNUSU9OPC9jb2RlPiBhbmQgdGhlcmUgaXMgCiAgICAgKiAgICAgICAgIG5vIHRyYW5zYWN0aW9uLgogICAgICovICAgIAogICAgcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBlbnRpdHkpOwogICAgCiAgICAvKioKICAgICAqIEZpbmQgYnkgcHJpbWFyeSBrZXkuCiAgICAgKiBTZWFyY2ggZm9yIGFuIGVudGl0eSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBwcmltYXJ5IGtleS4KICAgICAqIElmIHRoZSBlbnRpdHkgaW5zdGFuY2UgaXMgY29udGFpbmVkIGluIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0CiAgICAgKiBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZXJlLgogICAgICogQHBhcmFtIGVudGl0eUNsYXNzCiAgICAgKiBAcGFyYW0gcHJpbWFyeUtleQogICAgICogQHJldHVybiB0aGUgZm91bmQgZW50aXR5IGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIGVudGl0eSBkb2VzCiAgICAgKiAgICAgICAgIG5vdCBleGlzdAogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGRvZXMKICAgICAqICAgICAgICAgbm90IGRlbm90ZSBhbiBlbnRpdHkgdHlwZSBvciB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIAogICAgICogICAgICAgICBpcyBub3QgYSB2YWxpZCB0eXBlIGZvciB0aGF0IGVudGl0eZJzIHByaW1hcnkga2V5IG9yCiAgICAgKiAgICAgICAgIGlzIG51bGwKICAgICAqLwogICAgcHVibGljIDxUPiBUIGZpbmQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIE9iamVjdCBwcmltYXJ5S2V5KTsKICAgIAogICAgLyoqCiAgICAgKiBGaW5kIGJ5IHByaW1hcnkga2V5LCB1c2luZyB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuIAogICAgICogU2VhcmNoIGZvciBhbiBlbnRpdHkgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgcHJpbWFyeSBrZXkuIAogICAgICogSWYgdGhlIGVudGl0eSBpbnN0YW5jZSBpcyBjb250YWluZWQgaW4gdGhlIHBlcnNpc3RlbmNlIAogICAgICogY29udGV4dCBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZXJlLiAKICAgICAqIElmIGEgdmVuZG9yLXNwZWNpZmljIHByb3BlcnR5IG9yIGhpbnQgaXMgbm90IHJlY29nbml6ZWQsIAogICAgICogaXQgaXMgc2lsZW50bHkgaWdub3JlZC4gCiAgICAgKiBAcGFyYW0gZW50aXR5Q2xhc3MgCiAgICAgKiBAcGFyYW0gcHJpbWFyeUtleSAKICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICBzdGFuZGFyZCBhbmQgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMgCiAgICAgKiBAcmV0dXJuIHRoZSBmb3VuZCBlbnRpdHkgaW5zdGFuY2Ugb3IgbnVsbCBpZiB0aGUgZW50aXR5IGRvZXMKICAgICAqICAgICAgICAgbm90IGV4aXN0IAogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGRvZXMgCiAgICAgKiAgICAgICAgIG5vdCBkZW5vdGUgYW4gZW50aXR5IHR5cGUgb3IgdGhlIHNlY29uZCBhcmd1bWVudCBpcwogICAgICogICAgICAgICBpcyBub3QgYSB2YWxpZCB0eXBlIGZvciB0aGF0IGVudGl0eZJzIHByaW1hcnkga2V5IG9yIAogICAgICogICAgICAgICBpcyBudWxsIAogICAgICogQHNpbmNlIEphdmEgUGVyc2lzdGVuY2UgMi4wCiAgICAgKi8gCiAgICBwdWJsaWMgPFQ+IFQgZmluZChDbGFzczxUPiBlbnRpdHlDbGFzcywgT2JqZWN0IHByaW1hcnlLZXksIAogICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsgCiAgICAKICAgIC8qKgogICAgICogRmluZCBieSBwcmltYXJ5IGtleSBhbmQgbG9jay4KICAgICAqIFNlYXJjaCBmb3IgYW4gZW50aXR5IG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIHByaW1hcnkga2V5CiAgICAgKiBhbmQgbG9jayBpdCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNwZWNpZmllZCBsb2NrIHR5cGUuCiAgICAgKiBJZiB0aGUgZW50aXR5IGluc3RhbmNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UgY29udGV4dAogICAgICogaXQgaXMgcmV0dXJuZWQgZnJvbSB0aGVyZSwgYW5kIHRoZSBlZmZlY3Qgb2YgdGhpcyBtZXRob2QgaXMKICAgICAqIHRoZSBzYW1lIGFzIGlmIHRoZSBsb2NrIG1ldGhvZCBoYWQgYmVlbiBjYWxsZWQgb24gdGhlIGVudGl0eS4KICAgICAqIDxwPiBJZiB0aGUgZW50aXR5IGlzIGZvdW5kIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCBhbmQgdGhlCiAgICAgKiBsb2NrIG1vZGUgdHlwZSBpcyBwZXNzaW1pc3RpYyBhbmQgdGhlIGVudGl0eSBoYXMgYSB2ZXJzaW9uCiAgICAgKiBhdHRyaWJ1dGUsIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBtdXN0IHBlcmZvcm0gb3B0aW1pc3RpYwogICAgICogdmVyc2lvbiBjaGVja3Mgd2hlbiBvYnRhaW5pbmcgdGhlIGRhdGFiYXNlIGxvY2suICBJZiB0aGVzZSAKICAgICAqIGNoZWNrcyBmYWlsLCB0aGUgPGNvZGU+T3B0aW1pc3RpY0xvY2tFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgogICAgICogPHA+SWYgdGhlIGxvY2sgbW9kZSB0eXBlIGlzIHBlc3NpbWlzdGljIGFuZCB0aGUgZW50aXR5IGluc3RhbmNlCiAgICAgKiBpcyBmb3VuZCBidXQgY2Fubm90IGJlIGxvY2tlZDoKICAgICAqIDx1bD4KICAgICAqIDxsaT4gdGhlIDxjb2RlPlBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCiAgICAgKiAgICBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIHRyYW5zYWN0aW9uLWxldmVsIHJvbGxiYWNrCiAgICAgKiA8bGk+IHRoZSA8Y29kZT5Mb2NrVGltZW91dEV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCiAgICAgKiAgICBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIG9ubHkgc3RhdGVtZW50LWxldmVsIHJvbGxiYWNrCiAgICAgKiA8L3VsPgogICAgICogQHBhcmFtIGVudGl0eUNsYXNzCiAgICAgKiBAcGFyYW0gcHJpbWFyeUtleQogICAgICogQHBhcmFtIGxvY2tNb2RlCiAgICAgKiBAcmV0dXJuIHRoZSBmb3VuZCBlbnRpdHkgaW5zdGFuY2Ugb3IgbnVsbCBpZiB0aGUgZW50aXR5IGRvZXMKICAgICAqICAgICAgICAgbm90IGV4aXN0CiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmlyc3QgYXJndW1lbnQgZG9lcwogICAgICogICAgICAgICBub3QgZGVub3RlIGFuIGVudGl0eSB0eXBlIG9yIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgCiAgICAgKiAgICAgICAgIG5vdCBhIHZhbGlkIHR5cGUgZm9yIHRoYXQgZW50aXR5J3MgcHJpbWFyeSBrZXkgb3IgCiAgICAgKiAgICAgICAgIGlzIG51bGwKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyAKICAgICAqICAgICAgICAgdHJhbnNhY3Rpb24gYW5kIGEgbG9jayBtb2RlIG90aGVyIHRoYW4gTk9ORSBpcwogICAgICogICAgICAgICBzcGVjaWZpZWQKICAgICAqIEB0aHJvd3MgT3B0aW1pc3RpY0xvY2tFeGNlcHRpb24gaWYgdGhlIG9wdGltaXN0aWMgdmVyc2lvbiAKICAgICAqICAgICAgICAgY2hlY2sgZmFpbHMKICAgICAqIEB0aHJvd3MgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgCiAgICAgKiAgICAgICAgIGZhaWxzIGFuZCB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2sKICAgICAqIEB0aHJvd3MgTG9ja1RpbWVvdXRFeGNlcHRpb24gaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyBhbmQKICAgICAqICAgICAgICAgb25seSB0aGUgc3RhdGVtZW50IGlzIHJvbGxlZCBiYWNrCiAgICAgKiBAdGhyb3dzIFBlcnNpc3RlbmNlRXhjZXB0aW9uIGlmIGFuIHVuc3VwcG9ydGVkIGxvY2sgY2FsbCAKICAgICAqICAgICAgICAgaXMgbWFkZQogICAgICogQHNpbmNlIEphdmEgUGVyc2lzdGVuY2UgMi4wCiAgICAgKi8KICAgIHB1YmxpYyA8VD4gVCBmaW5kKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBPYmplY3QgcHJpbWFyeUtleSwKICAgICAgICAgICAgICAgICAgICAgIExvY2tNb2RlVHlwZSBsb2NrTW9kZSk7CgogICAgLyoqCiAgICAgKiBGaW5kIGJ5IHByaW1hcnkga2V5IGFuZCBsb2NrLCB1c2luZyB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuIAogICAgICogU2VhcmNoIGZvciBhbiBlbnRpdHkgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgcHJpbWFyeSBrZXkKICAgICAqIGFuZCBsb2NrIGl0IHdpdGggcmVzcGVjdCB0byB0aGUgc3BlY2lmaWVkIGxvY2sgdHlwZS4KICAgICAqIElmIHRoZSBlbnRpdHkgaW5zdGFuY2UgaXMgY29udGFpbmVkIGluIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0CiAgICAgKiBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZXJlLiAgCiAgICAgKiA8cD4gSWYgdGhlIGVudGl0eSBpcyBmb3VuZAogICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IGFuZCB0aGUgbG9jayBtb2RlIHR5cGUKICAgICAqIGlzIHBlc3NpbWlzdGljIGFuZCB0aGUgZW50aXR5IGhhcyBhIHZlcnNpb24gYXR0cmlidXRlLCB0aGUKICAgICAqIHBlcnNpc3RlbmNlIHByb3ZpZGVyIG11c3QgcGVyZm9ybSBvcHRpbWlzdGljIHZlcnNpb24gY2hlY2tzCiAgICAgKiB3aGVuIG9idGFpbmluZyB0aGUgZGF0YWJhc2UgbG9jay4gIElmIHRoZXNlIGNoZWNrcyBmYWlsLAogICAgICogdGhlIDxjb2RlPk9wdGltaXN0aWNMb2NrRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KICAgICAqIDxwPklmIHRoZSBsb2NrIG1vZGUgdHlwZSBpcyBwZXNzaW1pc3RpYyBhbmQgdGhlIGVudGl0eSBpbnN0YW5jZQogICAgICogaXMgZm91bmQgYnV0IGNhbm5vdCBiZSBsb2NrZWQ6CiAgICAgKiA8dWw+CiAgICAgKiA8bGk+IHRoZSA8Y29kZT5QZXNzaW1pc3RpY0xvY2tFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZQogICAgICogICAgbG9ja2luZyBmYWlsdXJlIGNhdXNlcyB0cmFuc2FjdGlvbi1sZXZlbCByb2xsYmFjawogICAgICogPGxpPiB0aGUgPGNvZGU+TG9ja1RpbWVvdXRFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZQogICAgICogICAgbG9ja2luZyBmYWlsdXJlIGNhdXNlcyBvbmx5IHN0YXRlbWVudC1sZXZlbCByb2xsYmFjawogICAgICogPC91bD4KICAgICAqIDxwPklmIGEgdmVuZG9yLXNwZWNpZmljIHByb3BlcnR5IG9yIGhpbnQgaXMgbm90IHJlY29nbml6ZWQsIAogICAgICogaXQgaXMgc2lsZW50bHkgaWdub3JlZC4gIAogICAgICogPHA+UG9ydGFibGUgYXBwbGljYXRpb25zIHNob3VsZCBub3QgcmVseSBvbiB0aGUgc3RhbmRhcmQgdGltZW91dAogICAgICogaGludC4gRGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBpbiB1c2UgYW5kIHRoZSBsb2NraW5nCiAgICAgKiBtZWNoYW5pc21zIHVzZWQgYnkgdGhlIHByb3ZpZGVyLCB0aGUgaGludCBtYXkgb3IgbWF5IG5vdAogICAgICogYmUgb2JzZXJ2ZWQuCiAgICAgKiBAcGFyYW0gZW50aXR5Q2xhc3MKICAgICAqIEBwYXJhbSBwcmltYXJ5S2V5CiAgICAgKiBAcGFyYW0gbG9ja01vZGUKICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICBzdGFuZGFyZCBhbmQgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMKICAgICAqICAgICAgICBhbmQgaGludHMKICAgICAqIEByZXR1cm4gdGhlIGZvdW5kIGVudGl0eSBpbnN0YW5jZSBvciBudWxsIGlmIHRoZSBlbnRpdHkgZG9lcwogICAgICogICAgICAgICBub3QgZXhpc3QKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBkb2VzCiAgICAgKiAgICAgICAgIG5vdCBkZW5vdGUgYW4gZW50aXR5IHR5cGUgb3IgdGhlIHNlY29uZCBhcmd1bWVudCBpcyAKICAgICAqICAgICAgICAgbm90IGEgdmFsaWQgdHlwZSBmb3IgdGhhdCBlbnRpdHkncyBwcmltYXJ5IGtleSBvciAKICAgICAqICAgICAgICAgaXMgbnVsbAogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIAogICAgICogICAgICAgICB0cmFuc2FjdGlvbiBhbmQgYSBsb2NrIG1vZGUgb3RoZXIgdGhhbiA8Y29kZT5OT05FPC9jb2RlPiBpcyAKICAgICAqICAgICAgICAgc3BlY2lmaWVkCiAgICAgKiBAdGhyb3dzIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uIGlmIHRoZSBvcHRpbWlzdGljIHZlcnNpb24gCiAgICAgKiAgICAgICAgIGNoZWNrIGZhaWxzCiAgICAgKiBAdGhyb3dzIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbiBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIAogICAgICogICAgICAgICBmYWlscyBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrCiAgICAgKiBAdGhyb3dzIExvY2tUaW1lb3V0RXhjZXB0aW9uIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMgYW5kCiAgICAgKiAgICAgICAgIG9ubHkgdGhlIHN0YXRlbWVudCBpcyByb2xsZWQgYmFjawogICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiBpZiBhbiB1bnN1cHBvcnRlZCBsb2NrIGNhbGwgCiAgICAgKiAgICAgICAgIGlzIG1hZGUKICAgICAqIEBzaW5jZSBKYXZhIFBlcnNpc3RlbmNlIDIuMAogICAgICovCiAgICBwdWJsaWMgPFQ+IFQgZmluZChDbGFzczxUPiBlbnRpdHlDbGFzcywgT2JqZWN0IHByaW1hcnlLZXksCiAgICAgICAgICAgICAgICAgICAgICBMb2NrTW9kZVR5cGUgbG9ja01vZGUsIAogICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKCiAgICAvKioKICAgICAqIEdldCBhbiBpbnN0YW5jZSwgd2hvc2Ugc3RhdGUgbWF5IGJlIGxhemlseSBmZXRjaGVkLgogICAgICogSWYgdGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YWJhc2UsCiAgICAgKiB0aGUgPGNvZGU+RW50aXR5Tm90Rm91bmRFeGNlcHRpb248L2NvZGU+IGlzIHRocm93biB3aGVuIHRoZSBpbnN0YW5jZSAKICAgICAqIHN0YXRlIGlzIGZpcnN0IGFjY2Vzc2VkLiAoVGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgaXMgCiAgICAgKiBwZXJtaXR0ZWQgdG8gdGhyb3cgdGhlIDxjb2RlPkVudGl0eU5vdEZvdW5kRXhjZXB0aW9uPC9jb2RlPiB3aGVuIAogICAgICogPGNvZGU+Z2V0UmVmZXJlbmNlPC9jb2RlPiBpcyBjYWxsZWQuKQogICAgICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgZXhwZWN0IHRoYXQgdGhlIGluc3RhbmNlIHN0YXRlIHdpbGwKICAgICAqIGJlIGF2YWlsYWJsZSB1cG9uIGRldGFjaG1lbnQsIHVubGVzcyBpdCB3YXMgYWNjZXNzZWQgYnkgdGhlCiAgICAgKiBhcHBsaWNhdGlvbiB3aGlsZSB0aGUgZW50aXR5IG1hbmFnZXIgd2FzIG9wZW4uCiAgICAgKiBAcGFyYW0gZW50aXR5Q2xhc3MKICAgICAqIEBwYXJhbSBwcmltYXJ5S2V5CiAgICAgKiBAcmV0dXJuIHRoZSBmb3VuZCBlbnRpdHkgaW5zdGFuY2UKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBkb2VzCiAgICAgKiAgICAgICAgIG5vdCBkZW5vdGUgYW4gZW50aXR5IHR5cGUgb3IgdGhlIHNlY29uZCBhcmd1bWVudCBpcwogICAgICogICAgICAgICBub3QgYSB2YWxpZCB0eXBlIGZvciB0aGF0IGVudGl0eZJzIHByaW1hcnkga2V5IG9yCiAgICAgKiAgICAgICAgIGlzIG51bGwKICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGVudGl0eSBzdGF0ZSAKICAgICAqICAgICAgICAgY2Fubm90IGJlIGFjY2Vzc2VkCiAgICAgKi8KICAgIHB1YmxpYyA8VD4gVCBnZXRSZWZlcmVuY2UoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByaW1hcnlLZXkpOwoKICAgIC8qKgogICAgICogU3luY2hyb25pemUgdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQgdG8gdGhlCiAgICAgKiB1bmRlcmx5aW5nIGRhdGFiYXNlLgogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIHRoZXJlIGlzCiAgICAgKiAgICAgICAgIG5vIHRyYW5zYWN0aW9uCiAgICAgKiBAdGhyb3dzIFBlcnNpc3RlbmNlRXhjZXB0aW9uIGlmIHRoZSBmbHVzaCBmYWlscwogICAgICovCiAgICBwdWJsaWMgdm9pZCBmbHVzaCgpOwoKICAgIC8qKgogICAgICogU2V0IHRoZSBmbHVzaCBtb2RlIHRoYXQgYXBwbGllcyB0byBhbGwgb2JqZWN0cyBjb250YWluZWQKICAgICAqIGluIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LiAKICAgICAqIEBwYXJhbSBmbHVzaE1vZGUKICAgICAqLwogICAgcHVibGljIHZvaWQgc2V0Rmx1c2hNb2RlKEZsdXNoTW9kZVR5cGUgZmx1c2hNb2RlKTsKCiAgICAvKioKICAgICAqIEdldCB0aGUgZmx1c2ggbW9kZSB0aGF0IGFwcGxpZXMgdG8gYWxsIG9iamVjdHMgY29udGFpbmVkCiAgICAgKiBpbiB0aGUgcGVyc2lzdGVuY2UgY29udGV4dC4gCiAgICAgKiBAcmV0dXJuIGZsdXNoTW9kZQogICAgICovCiAgICBwdWJsaWMgRmx1c2hNb2RlVHlwZSBnZXRGbHVzaE1vZGUoKTsKCiAgICAvKioKICAgICAqIExvY2sgYW4gZW50aXR5IGluc3RhbmNlIHRoYXQgaXMgY29udGFpbmVkIGluIHRoZSBwZXJzaXN0ZW5jZQogICAgICogY29udGV4dCB3aXRoIHRoZSBzcGVjaWZpZWQgbG9jayBtb2RlIHR5cGUuCiAgICAgKiA8cD5JZiBhIHBlc3NpbWlzdGljIGxvY2sgbW9kZSB0eXBlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGVudGl0eQogICAgICogY29udGFpbnMgYSB2ZXJzaW9uIGF0dHJpYnV0ZSwgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIG11c3QgCiAgICAgKiBhbHNvIHBlcmZvcm0gb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrcyB3aGVuIG9idGFpbmluZyB0aGUgCiAgICAgKiBkYXRhYmFzZSBsb2NrLiAgSWYgdGhlc2UgY2hlY2tzIGZhaWwsIHRoZSAKICAgICAqIDxjb2RlPk9wdGltaXN0aWNMb2NrRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KICAgICAqIDxwPklmIHRoZSBsb2NrIG1vZGUgdHlwZSBpcyBwZXNzaW1pc3RpYyBhbmQgdGhlIGVudGl0eSBpbnN0YW5jZQogICAgICogaXMgZm91bmQgYnV0IGNhbm5vdCBiZSBsb2NrZWQ6CiAgICAgKiA8dWw+CiAgICAgKiA8bGk+IHRoZSA8Y29kZT5QZXNzaW1pc3RpY0xvY2tFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZQogICAgICogICAgbG9ja2luZyBmYWlsdXJlIGNhdXNlcyB0cmFuc2FjdGlvbi1sZXZlbCByb2xsYmFjawogICAgICogPGxpPiB0aGUgPGNvZGU+TG9ja1RpbWVvdXRFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZQogICAgICogICAgbG9ja2luZyBmYWlsdXJlIGNhdXNlcyBvbmx5IHN0YXRlbWVudC1sZXZlbCByb2xsYmFjawogICAgICogPC91bD4KICAgICAqIEBwYXJhbSBlbnRpdHkKICAgICAqIEBwYXJhbSBsb2NrTW9kZQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluc3RhbmNlIGlzIG5vdCBhbgogICAgICogICAgICAgICBlbnRpdHkgb3IgaXMgYSBkZXRhY2hlZCBlbnRpdHkKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyAKICAgICAqICAgICAgICAgdHJhbnNhY3Rpb24KICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBleGlzdCAKICAgICAqICAgICAgICAgaW4gdGhlIGRhdGFiYXNlIHdoZW4gcGVzc2ltaXN0aWMgbG9ja2luZyBpcyAKICAgICAqICAgICAgICAgcGVyZm9ybWVkCiAgICAgKiBAdGhyb3dzIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uIGlmIHRoZSBvcHRpbWlzdGljIHZlcnNpb24gCiAgICAgKiAgICAgICAgIGNoZWNrIGZhaWxzCiAgICAgKiBAdGhyb3dzIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbiBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIGZhaWxzIAogICAgICogICAgICAgICBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrCiAgICAgKiBAdGhyb3dzIExvY2tUaW1lb3V0RXhjZXB0aW9uIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMgYW5kCiAgICAgKiAgICAgICAgIG9ubHkgdGhlIHN0YXRlbWVudCBpcyByb2xsZWQgYmFjawogICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiBpZiBhbiB1bnN1cHBvcnRlZCBsb2NrIGNhbGwgCiAgICAgKiAgICAgICAgIGlzIG1hZGUKICAgICAqLwogICAgcHVibGljIHZvaWQgbG9jayhPYmplY3QgZW50aXR5LCBMb2NrTW9kZVR5cGUgbG9ja01vZGUpOwoKICAgIC8qKgogICAgICogTG9jayBhbiBlbnRpdHkgaW5zdGFuY2UgdGhhdCBpcyBjb250YWluZWQgaW4gdGhlIHBlcnNpc3RlbmNlCiAgICAgKiBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCBsb2NrIG1vZGUgdHlwZSBhbmQgd2l0aCBzcGVjaWZpZWQKICAgICAqIHByb3BlcnRpZXMuCiAgICAgKiA8cD5JZiBhIHBlc3NpbWlzdGljIGxvY2sgbW9kZSB0eXBlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGVudGl0eQogICAgICogY29udGFpbnMgYSB2ZXJzaW9uIGF0dHJpYnV0ZSwgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIG11c3QgCiAgICAgKiBhbHNvIHBlcmZvcm0gb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrcyB3aGVuIG9idGFpbmluZyB0aGUgCiAgICAgKiBkYXRhYmFzZSBsb2NrLiAgSWYgdGhlc2UgY2hlY2tzIGZhaWwsIHRoZSAKICAgICAqIDxjb2RlPk9wdGltaXN0aWNMb2NrRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KICAgICAqIDxwPklmIHRoZSBsb2NrIG1vZGUgdHlwZSBpcyBwZXNzaW1pc3RpYyBhbmQgdGhlIGVudGl0eSBpbnN0YW5jZQogICAgICogaXMgZm91bmQgYnV0IGNhbm5vdCBiZSBsb2NrZWQ6CiAgICAgKiA8dWw+CiAgICAgKiA8bGk+IHRoZSA8Y29kZT5QZXNzaW1pc3RpY0xvY2tFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZQogICAgICogICAgbG9ja2luZyBmYWlsdXJlIGNhdXNlcyB0cmFuc2FjdGlvbi1sZXZlbCByb2xsYmFjawogICAgICogPGxpPiB0aGUgPGNvZGU+TG9ja1RpbWVvdXRFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZQogICAgICogICAgbG9ja2luZyBmYWlsdXJlIGNhdXNlcyBvbmx5IHN0YXRlbWVudC1sZXZlbCByb2xsYmFjawogICAgICogPC91bD4KICAgICAqIDxwPklmIGEgdmVuZG9yLXNwZWNpZmljIHByb3BlcnR5IG9yIGhpbnQgaXMgbm90IHJlY29nbml6ZWQsIAogICAgICogaXQgaXMgc2lsZW50bHkgaWdub3JlZC4gIAogICAgICogPHA+UG9ydGFibGUgYXBwbGljYXRpb25zIHNob3VsZCBub3QgcmVseSBvbiB0aGUgc3RhbmRhcmQgdGltZW91dAogICAgICogaGludC4gRGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBpbiB1c2UgYW5kIHRoZSBsb2NraW5nCiAgICAgKiBtZWNoYW5pc21zIHVzZWQgYnkgdGhlIHByb3ZpZGVyLCB0aGUgaGludCBtYXkgb3IgbWF5IG5vdAogICAgICogYmUgb2JzZXJ2ZWQuCiAgICAgKiBAcGFyYW0gZW50aXR5CiAgICAgKiBAcGFyYW0gbG9ja01vZGUKICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICBzdGFuZGFyZCBhbmQgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMKICAgICAqICAgICAgICBhbmQgaGludHMKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QgYW4KICAgICAqICAgICAgICAgZW50aXR5IG9yIGlzIGEgZGV0YWNoZWQgZW50aXR5CiAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gCiAgICAgKiAgICAgICAgIHRyYW5zYWN0aW9uCiAgICAgKiBAdGhyb3dzIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgZXhpc3QgCiAgICAgKiAgICAgICAgIGluIHRoZSBkYXRhYmFzZSB3aGVuIHBlc3NpbWlzdGljIGxvY2tpbmcgaXMgCiAgICAgKiAgICAgICAgIHBlcmZvcm1lZAogICAgICogQHRocm93cyBPcHRpbWlzdGljTG9ja0V4Y2VwdGlvbiBpZiB0aGUgb3B0aW1pc3RpYyB2ZXJzaW9uIAogICAgICogICAgICAgICBjaGVjayBmYWlscwogICAgICogQHRocm93cyBQZXNzaW1pc3RpY0xvY2tFeGNlcHRpb24gaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyAKICAgICAqICAgICAgICAgYW5kIHRoZSB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjawogICAgICogQHRocm93cyBMb2NrVGltZW91dEV4Y2VwdGlvbiBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIGZhaWxzIGFuZAogICAgICogICAgICAgICBvbmx5IHRoZSBzdGF0ZW1lbnQgaXMgcm9sbGVkIGJhY2sKICAgICAqIEB0aHJvd3MgUGVyc2lzdGVuY2VFeGNlcHRpb24gaWYgYW4gdW5zdXBwb3J0ZWQgbG9jayBjYWxsIAogICAgICogICAgICAgICBpcyBtYWRlCiAgICAgKiBAc2luY2UgSmF2YSBQZXJzaXN0ZW5jZSAyLjAKICAgICAqLwogICAgcHVibGljIHZvaWQgbG9jayhPYmplY3QgZW50aXR5LCBMb2NrTW9kZVR5cGUgbG9ja01vZGUsCiAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyk7CgogICAgLyoqCiAgICAgKiBSZWZyZXNoIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UsIAogICAgICogb3ZlcndyaXRpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBlbnRpdHksIGlmIGFueS4gCiAgICAgKiBAcGFyYW0gZW50aXR5CiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFuY2UgaXMgbm90CiAgICAgKiAgICAgICAgIGFuIGVudGl0eSBvciB0aGUgZW50aXR5IGlzIG5vdCBtYW5hZ2VkCiAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgaW52b2tlZCBvbiBhCiAgICAgKiAgICAgICAgIGNvbnRhaW5lci1tYW5hZ2VkIGVudGl0eSBtYW5hZ2VyIG9mIHR5cGUgCiAgICAgKiAgICAgICAgIDxjb2RlPlBlcnNpc3RlbmNlQ29udGV4dFR5cGUuVFJBTlNBQ1RJT048L2NvZGU+IGFuZCB0aGVyZSBpcyAKICAgICAqICAgICAgICAgbm8gdHJhbnNhY3Rpb24uCiAgICAgKiBAdGhyb3dzIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgbm8gbG9uZ2VyCiAgICAgKiAgICAgICAgIGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UKICAgICAqLyAgICAKICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IGVudGl0eSk7CgogICAgLyoqCiAgICAgKiBSZWZyZXNoIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UsIHVzaW5nIAogICAgICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzLCBhbmQgb3ZlcndyaXRpbmcgY2hhbmdlcyBtYWRlIHRvCiAgICAgKiB0aGUgZW50aXR5LCBpZiBhbnkuIAogICAgICogSWYgYSB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydHkgb3IgaGludCBpcyBub3QgcmVjb2duaXplZCwgCiAgICAgKiBpdCBpcyBzaWxlbnRseSBpZ25vcmVkLiAKICAgICAqIEBwYXJhbSBlbnRpdHkgCiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAgc3RhbmRhcmQgYW5kIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzIAogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluc3RhbmNlIGlzIG5vdCAKICAgICAqICAgICAgICAgYW4gZW50aXR5IG9yIHRoZSBlbnRpdHkgaXMgbm90IG1hbmFnZWQgCiAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgaW52b2tlZCBvbiBhIAogICAgICogICAgICAgICBjb250YWluZXItbWFuYWdlZCBlbnRpdHkgbWFuYWdlciBvZiB0eXBlCiAgICAgKiAgICAgICAgIDxjb2RlPlBlcnNpc3RlbmNlQ29udGV4dFR5cGUuVFJBTlNBQ1RJT048L2NvZGU+IGFuZCB0aGVyZSBpcwogICAgICogICAgICAgICBubyB0cmFuc2FjdGlvbi4gCiAgICAgKiBAdGhyb3dzIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgbm8gbG9uZ2VyIAogICAgICogICAgICAgICBleGlzdHMgaW4gdGhlIGRhdGFiYXNlIAogICAgICogQHNpbmNlIEphdmEgUGVyc2lzdGVuY2UgMi4wCiAgICAgKi8gICAgIAogICAgcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3QgZW50aXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsgCgogICAgLyoqCiAgICAgKiBSZWZyZXNoIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UsIAogICAgICogb3ZlcndyaXRpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBlbnRpdHksIGlmIGFueSwgYW5kIAogICAgICogbG9jayBpdCB3aXRoIHJlc3BlY3QgdG8gZ2l2ZW4gbG9jayBtb2RlIHR5cGUuCiAgICAgKiA8cD5JZiB0aGUgbG9jayBtb2RlIHR5cGUgaXMgcGVzc2ltaXN0aWMgYW5kIHRoZSBlbnRpdHkgaW5zdGFuY2UKICAgICAqIGlzIGZvdW5kIGJ1dCBjYW5ub3QgYmUgbG9ja2VkOgogICAgICogPHVsPgogICAgICogPGxpPiB0aGUgPGNvZGU+UGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93biBpZiB0aGUgZGF0YWJhc2UKICAgICAqICAgIGxvY2tpbmcgZmFpbHVyZSBjYXVzZXMgdHJhbnNhY3Rpb24tbGV2ZWwgcm9sbGJhY2sKICAgICAqIDxsaT4gdGhlIDxjb2RlPkxvY2tUaW1lb3V0RXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93biBpZiB0aGUKICAgICAqICAgIGRhdGFiYXNlIGxvY2tpbmcgZmFpbHVyZSBjYXVzZXMgb25seSBzdGF0ZW1lbnQtbGV2ZWwgCiAgICAgKiAgICByb2xsYmFjay4KICAgICAqIDwvdWw+CiAgICAgKiBAcGFyYW0gZW50aXR5CiAgICAgKiBAcGFyYW0gbG9ja01vZGUKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QKICAgICAqICAgICAgICAgYW4gZW50aXR5IG9yIHRoZSBlbnRpdHkgaXMgbm90IG1hbmFnZWQKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyAKICAgICAqICAgICAgICAgdHJhbnNhY3Rpb24gYW5kIGlmIGludm9rZWQgb24gYSBjb250YWluZXItbWFuYWdlZAogICAgICogICAgICAgICA8Y29kZT5FbnRpdHlNYW5hZ2VyPC9jb2RlPiBpbnN0YW5jZSB3aXRoCiAgICAgKiAgICAgICAgIDxjb2RlPlBlcnNpc3RlbmNlQ29udGV4dFR5cGUuVFJBTlNBQ1RJT048L2NvZGU+IG9yIHdpdGggYSBsb2NrIG1vZGUgCiAgICAgKiAgICAgICAgIG90aGVyIHRoYW4gPGNvZGU+Tk9ORTwvY29kZT4uCiAgICAgKiBAdGhyb3dzIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgbm8gbG9uZ2VyIGV4aXN0cwogICAgICogICAgICAgICBpbiB0aGUgZGF0YWJhc2UKICAgICAqIEB0aHJvd3MgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMKICAgICAqICAgICAgICAgYW5kIHRoZSB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjawogICAgICogQHRocm93cyBMb2NrVGltZW91dEV4Y2VwdGlvbiBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIGZhaWxzIGFuZAogICAgICogICAgICAgICBvbmx5IHRoZSBzdGF0ZW1lbnQgaXMgcm9sbGVkIGJhY2sKICAgICAqIEB0aHJvd3MgUGVyc2lzdGVuY2VFeGNlcHRpb24gaWYgYW4gdW5zdXBwb3J0ZWQgbG9jayBjYWxsCiAgICAgKiAgICAgICAgIGlzIG1hZGUKICAgICAqIEBzaW5jZSBKYXZhIFBlcnNpc3RlbmNlIDIuMAogICAgICovCiAgICBwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBlbnRpdHksIExvY2tNb2RlVHlwZSBsb2NrTW9kZSk7CgogICAgLyoqCiAgICAgKiBSZWZyZXNoIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UsIAogICAgICogb3ZlcndyaXRpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBlbnRpdHksIGlmIGFueSwgYW5kIAogICAgICogbG9jayBpdCB3aXRoIHJlc3BlY3QgdG8gZ2l2ZW4gbG9jayBtb2RlIHR5cGUgYW5kIHdpdGgKICAgICAqIHNwZWNpZmllZCBwcm9wZXJ0aWVzLgogICAgICogPHA+SWYgdGhlIGxvY2sgbW9kZSB0eXBlIGlzIHBlc3NpbWlzdGljIGFuZCB0aGUgZW50aXR5IGluc3RhbmNlCiAgICAgKiBpcyBmb3VuZCBidXQgY2Fubm90IGJlIGxvY2tlZDoKICAgICAqIDx1bD4KICAgICAqIDxsaT4gdGhlIDxjb2RlPlBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCiAgICAgKiAgICBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIHRyYW5zYWN0aW9uLWxldmVsIHJvbGxiYWNrCiAgICAgKiA8bGk+IHRoZSA8Y29kZT5Mb2NrVGltZW91dEV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCiAgICAgKiAgICBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIG9ubHkgc3RhdGVtZW50LWxldmVsIHJvbGxiYWNrCiAgICAgKiA8L3VsPgogICAgICogPHA+SWYgYSB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydHkgb3IgaGludCBpcyBub3QgcmVjb2duaXplZCwgCiAgICAgKiAgICBpdCBpcyBzaWxlbnRseSBpZ25vcmVkLiAgCiAgICAgKiA8cD5Qb3J0YWJsZSBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCByZWx5IG9uIHRoZSBzdGFuZGFyZCB0aW1lb3V0CiAgICAgKiBoaW50LiBEZXBlbmRpbmcgb24gdGhlIGRhdGFiYXNlIGluIHVzZSBhbmQgdGhlIGxvY2tpbmcKICAgICAqIG1lY2hhbmlzbXMgdXNlZCBieSB0aGUgcHJvdmlkZXIsIHRoZSBoaW50IG1heSBvciBtYXkgbm90CiAgICAgKiBiZSBvYnNlcnZlZC4KICAgICAqIEBwYXJhbSBlbnRpdHkKICAgICAqIEBwYXJhbSBsb2NrTW9kZQogICAgICogQHBhcmFtIHByb3BlcnRpZXMgIHN0YW5kYXJkIGFuZCB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcwogICAgICogICAgICAgIGFuZCBoaW50cwogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluc3RhbmNlIGlzIG5vdAogICAgICogICAgICAgICBhbiBlbnRpdHkgb3IgdGhlIGVudGl0eSBpcyBub3QgbWFuYWdlZAogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIAogICAgICogICAgICAgICB0cmFuc2FjdGlvbiBhbmQgaWYgaW52b2tlZCBvbiBhIGNvbnRhaW5lci1tYW5hZ2VkCiAgICAgKiAgICAgICAgIDxjb2RlPkVudGl0eU1hbmFnZXI8L2NvZGU+IGluc3RhbmNlIHdpdGgKICAgICAqICAgICAgICAgPGNvZGU+UGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTjwvY29kZT4gb3Igd2l0aCBhIGxvY2sgbW9kZSAKICAgICAqICAgICAgICAgb3RoZXIgdGhhbiA8Y29kZT5OT05FPC9jb2RlPi4KICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGVudGl0eSBubyBsb25nZXIgZXhpc3RzCiAgICAgKiAgICAgICAgIGluIHRoZSBkYXRhYmFzZQogICAgICogQHRocm93cyBQZXNzaW1pc3RpY0xvY2tFeGNlcHRpb24gaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscwogICAgICogICAgICAgICBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrCiAgICAgKiBAdGhyb3dzIExvY2tUaW1lb3V0RXhjZXB0aW9uIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMgYW5kCiAgICAgKiAgICAgICAgIG9ubHkgdGhlIHN0YXRlbWVudCBpcyByb2xsZWQgYmFjawogICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiBpZiBhbiB1bnN1cHBvcnRlZCBsb2NrIGNhbGwKICAgICAqICAgICAgICAgaXMgbWFkZQogICAgICogQHNpbmNlIEphdmEgUGVyc2lzdGVuY2UgMi4wCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IGVudGl0eSwgTG9ja01vZGVUeXBlIGxvY2tNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOwogICAgCiAgICAvKioKICAgICAqIENsZWFyIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LCBjYXVzaW5nIGFsbCBtYW5hZ2VkCiAgICAgKiBlbnRpdGllcyB0byBiZWNvbWUgZGV0YWNoZWQuIENoYW5nZXMgbWFkZSB0byBlbnRpdGllcyB0aGF0CiAgICAgKiBoYXZlIG5vdCBiZWVuIGZsdXNoZWQgdG8gdGhlIGRhdGFiYXNlIHdpbGwgbm90IGJlCiAgICAgKiBwZXJzaXN0ZWQuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7CgogICAgLyoqCiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudGl0eSBmcm9tIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LCBjYXVzaW5nCiAgICAgKiBhIG1hbmFnZWQgZW50aXR5IHRvIGJlY29tZSBkZXRhY2hlZC4gIFVuZmx1c2hlZCBjaGFuZ2VzIG1hZGUgCiAgICAgKiB0byB0aGUgZW50aXR5IGlmIGFueSAoaW5jbHVkaW5nIHJlbW92YWwgb2YgdGhlIGVudGl0eSksIAogICAgICogd2lsbCBub3QgYmUgc3luY2hyb25pemVkIHRvIHRoZSBkYXRhYmFzZS4gIEVudGl0aWVzIHdoaWNoIAogICAgICogcHJldmlvdXNseSByZWZlcmVuY2VkIHRoZSBkZXRhY2hlZCBlbnRpdHkgd2lsbCBjb250aW51ZSB0bwogICAgICogcmVmZXJlbmNlIGl0LgogICAgICogQHBhcmFtIGVudGl0eSAKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QgYW4gCiAgICAgKiAgICAgICAgIGVudGl0eSAKICAgICAqIEBzaW5jZSBKYXZhIFBlcnNpc3RlbmNlIDIuMAogICAgICovCiAgICBwdWJsaWMgdm9pZCBkZXRhY2goT2JqZWN0IGVudGl0eSk7IAoKICAgIC8qKgogICAgICogQ2hlY2sgaWYgdGhlIGluc3RhbmNlIGlzIGEgbWFuYWdlZCBlbnRpdHkgaW5zdGFuY2UgYmVsb25naW5nCiAgICAgKiB0byB0aGUgY3VycmVudCBwZXJzaXN0ZW5jZSBjb250ZXh0LgogICAgICogQHBhcmFtIGVudGl0eQogICAgICogQHJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgZW50aXR5IGlzIGluIHBlcnNpc3RlbmNlIGNvbnRleHQKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vdCBhbiBlbnRpdHkKICAgICAqLyAgICAKICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBlbnRpdHkpOwoKICAgIC8qKgogICAgICogR2V0IHRoZSBjdXJyZW50IGxvY2sgbW9kZSBmb3IgdGhlIGVudGl0eSBpbnN0YW5jZS4KICAgICAqIEBwYXJhbSBlbnRpdHkKICAgICAqIEByZXR1cm4gbG9jayBtb2RlCiAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gCiAgICAgKiAgICAgICAgIHRyYW5zYWN0aW9uCiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFuY2UgaXMgbm90IGEKICAgICAqICAgICAgICAgbWFuYWdlZCBlbnRpdHkgYW5kIGEgdHJhbnNhY3Rpb24gaXMgYWN0aXZlCiAgICAgKiBAc2luY2UgSmF2YSBQZXJzaXN0ZW5jZSAyLjAKICAgICAqLwogICAgcHVibGljIExvY2tNb2RlVHlwZSBnZXRMb2NrTW9kZShPYmplY3QgZW50aXR5KTsKCiAgICAvKiogCiAgICAgKiBTZXQgYW4gZW50aXR5IG1hbmFnZXIgcHJvcGVydHkuIAogICAgICogSWYgYSB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydHkgaXMgbm90IHJlY29nbml6ZWQsIGl0IGlzCiAgICAgKiBzaWxlbnRseSBpZ25vcmVkLiAKICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgCiAgICAgKiBAcGFyYW0gdmFsdWUgCiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIAogICAgICogICAgICAgICBub3QgdmFsaWQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAKICAgICAqIEBzaW5jZSBKYXZhIFBlcnNpc3RlbmNlIDIuMAogICAgICovIAogICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKTsKCiAgICAvKioKICAgICAqIEdldCB0aGUgcHJvcGVydGllcyBhbmQgYXNzb2NpYXRlZCB2YWx1ZXMgdGhhdCBhcmUgaW4gZWZmZWN0IAogICAgICogZm9yIHRoZSBlbnRpdHkgbWFuYWdlci4gQ2hhbmdpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYXAgZG9lcyAKICAgICAqIG5vdCBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gaW4gZWZmZWN0LgogICAgICogQHJldHVybiBtYXAgb2YgcHJvcGVydGllcyBpbiBlZmZlY3QgZm9yIGVudGl0eSBtYW5hZ2VyCiAgICAgKiBAc2luY2UgSmF2YSBQZXJzaXN0ZW5jZSAyLjAKICAgICAqLwogICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcygpOwoKICAgIC8qKgogICAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBzdXBwb3J0ZWQgZm9yIHVzZSAKICAgICAqIHdpdGggdGhlIGVudGl0eSBtYW5hZ2VyLgogICAgICogVGhlc2UgY29ycmVzcG9uZCB0byBwcm9wZXJ0aWVzIGFuZCBoaW50cyB0aGF0IG1heSBiZSBwYXNzZWQgCiAgICAgKiB0byB0aGUgbWV0aG9kcyBvZiB0aGUgPGNvZGU+RW50aXR5TWFuYWdlcjwvY29kZT4gaW50ZXJmYWNlIHRoYXQgdGFrZSBhIAogICAgICogcHJvcGVydGllcyBhcmd1bWVudCBvciB1c2VkIHdpdGggdGhlIDxjb2RlPlBlcnNpc3RlbmNlQ29udGV4dDwvY29kZT4gCiAgICAgKiBhbm5vdGF0aW9uLiBUaGVzZSBwcm9wZXJ0aWVzIGluY2x1ZGUgYWxsIHN0YW5kYXJkIGVudGl0eQogICAgICogbWFuYWdlciBoaW50cyBhbmQgcHJvcGVydGllcyBhcyB3ZWxsIGFzIHZlbmRvci1zcGVjaWZpYyBvbmVzCiAgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIHByb3ZpZGVyLiBUaGVzZSBwcm9wZXJ0aWVzIG1heSBvciBtYXkgbm90IAogICAgICogY3VycmVudGx5IGJlIGluIGVmZmVjdC4KICAgICAqIEByZXR1cm4gcHJvcGVydHkgbmFtZXMKICAgICAqIEBzaW5jZSBKYXZhIFBlcnNpc3RlbmNlIDIuMAogICAgICovCiAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U3VwcG9ydGVkUHJvcGVydGllcygpOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIDxjb2RlPlF1ZXJ5PC9jb2RlPiBmb3IgZXhlY3V0aW5nIGEKICAgICAqIEphdmEgUGVyc2lzdGVuY2UgcXVlcnkgbGFuZ3VhZ2Ugc3RhdGVtZW50LgogICAgICogQHBhcmFtIHFsU3RyaW5nIGEgSmF2YSBQZXJzaXN0ZW5jZSBxdWVyeSBzdHJpbmcKICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IHN0cmluZyBpcwogICAgICogICAgICAgICBmb3VuZCB0byBiZSBpbnZhbGlkCiAgICAgKi8KICAgIHB1YmxpYyBRdWVyeSBjcmVhdGVRdWVyeShTdHJpbmcgcWxTdHJpbmcpOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIDxjb2RlPlR5cGVkUXVlcnk8L2NvZGU+IGZvciBleGVjdXRpbmcgYQogICAgICogY3JpdGVyaWEgcXVlcnkuCiAgICAgKiBAcGFyYW0gY3JpdGVyaWFRdWVyeSAgYSBjcml0ZXJpYSBxdWVyeSBvYmplY3QKICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNyaXRlcmlhIHF1ZXJ5IGlzCiAgICAgKiAgICAgICAgIGZvdW5kIHRvIGJlIGludmFsaWQKICAgICAqIEBzaW5jZSBKYXZhIFBlcnNpc3RlbmNlIDIuMAogICAgICovCiAgICBwdWJsaWMgPFQ+IFR5cGVkUXVlcnk8VD4gY3JlYXRlUXVlcnkoQ3JpdGVyaWFRdWVyeTxUPiBjcml0ZXJpYVF1ZXJ5KTsgCgogICAgLyoqCiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+VHlwZWRRdWVyeTwvY29kZT4gZm9yIGV4ZWN1dGluZyBhCiAgICAgKiBKYXZhIFBlcnNpc3RlbmNlIHF1ZXJ5IGxhbmd1YWdlIHN0YXRlbWVudC4KICAgICAqIFRoZSBzZWxlY3QgbGlzdCBvZiB0aGUgcXVlcnkgbXVzdCBjb250YWluIG9ubHkgYSBzaW5nbGUKICAgICAqIGl0ZW0sIHdoaWNoIG11c3QgYmUgYXNzaWduYWJsZSB0byB0aGUgdHlwZSBzcGVjaWZpZWQgYnkKICAgICAqIHRoZSA8Y29kZT5yZXN1bHRDbGFzczwvY29kZT4gYXJndW1lbnQuCiAgICAgKiBAcGFyYW0gcWxTdHJpbmcgYSBKYXZhIFBlcnNpc3RlbmNlIHF1ZXJ5IHN0cmluZwogICAgICogQHBhcmFtIHJlc3VsdENsYXNzIHRoZSB0eXBlIG9mIHRoZSBxdWVyeSByZXN1bHQKICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IHN0cmluZyBpcyBmb3VuZAogICAgICogICAgICAgICB0byBiZSBpbnZhbGlkIG9yIGlmIHRoZSBxdWVyeSByZXN1bHQgaXMgZm91bmQgdG8KICAgICAqICAgICAgICAgbm90IGJlIGFzc2lnbmFibGUgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgogICAgICogQHNpbmNlIEphdmEgUGVyc2lzdGVuY2UgMi4wCiAgICAgKi8KICAgIHB1YmxpYyA8VD4gVHlwZWRRdWVyeTxUPiBjcmVhdGVRdWVyeShTdHJpbmcgcWxTdHJpbmcsIENsYXNzPFQ+IHJlc3VsdENsYXNzKTsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5RdWVyeTwvY29kZT4gZm9yIGV4ZWN1dGluZyBhIG5hbWVkIHF1ZXJ5CiAgICAgKiAoaW4gdGhlIEphdmEgUGVyc2lzdGVuY2UgcXVlcnkgbGFuZ3VhZ2Ugb3IgaW4gbmF0aXZlIFNRTCkuCiAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIHF1ZXJ5IGRlZmluZWQgaW4gbWV0YWRhdGEKICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSBxdWVyeSBoYXMgbm90IGJlZW4KICAgICAqICAgICAgICAgZGVmaW5lZCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIGlmIHRoZSBxdWVyeSBzdHJpbmcgaXMKICAgICAqICAgICAgICAgZm91bmQgdG8gYmUgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgUXVlcnkgY3JlYXRlTmFtZWRRdWVyeShTdHJpbmcgbmFtZSk7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+VHlwZWRRdWVyeTwvY29kZT4gZm9yIGV4ZWN1dGluZyBhCiAgICAgKiBKYXZhIFBlcnNpc3RlbmNlIHF1ZXJ5IGxhbmd1YWdlIG5hbWVkIHF1ZXJ5LgogICAgICogVGhlIHNlbGVjdCBsaXN0IG9mIHRoZSBxdWVyeSBtdXN0IGNvbnRhaW4gb25seSBhIHNpbmdsZQogICAgICogaXRlbSwgd2hpY2ggbXVzdCBiZSBhc3NpZ25hYmxlIHRvIHRoZSB0eXBlIHNwZWNpZmllZCBieQogICAgICogdGhlIDxjb2RlPnJlc3VsdENsYXNzPC9jb2RlPiBhcmd1bWVudC4KICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgcXVlcnkgZGVmaW5lZCBpbiBtZXRhZGF0YQogICAgICogQHBhcmFtIHJlc3VsdENsYXNzIHRoZSB0eXBlIG9mIHRoZSBxdWVyeSByZXN1bHQKICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSBxdWVyeSBoYXMgbm90IGJlZW4KICAgICAqICAgICAgICAgZGVmaW5lZCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIGlmIHRoZSBxdWVyeSBzdHJpbmcgaXMKICAgICAqICAgICAgICAgZm91bmQgdG8gYmUgaW52YWxpZCBvciBpZiB0aGUgcXVlcnkgcmVzdWx0IGlzIGZvdW5kIHRvCiAgICAgKiAgICAgICAgIG5vdCBiZSBhc3NpZ25hYmxlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAqIEBzaW5jZSBKYXZhIFBlcnNpc3RlbmNlIDIuMAogICAgICovCiAgICBwdWJsaWMgPFQ+IFR5cGVkUXVlcnk8VD4gY3JlYXRlTmFtZWRRdWVyeShTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gcmVzdWx0Q2xhc3MpOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIDxjb2RlPlF1ZXJ5PC9jb2RlPiBmb3IgZXhlY3V0aW5nCiAgICAgKiBhIG5hdGl2ZSBTUUwgc3RhdGVtZW50LCBlLmcuLCBmb3IgdXBkYXRlIG9yIGRlbGV0ZS4KICAgICAqIEBwYXJhbSBzcWxTdHJpbmcgYSBuYXRpdmUgU1FMIHF1ZXJ5IHN0cmluZwogICAgICogQHJldHVybiB0aGUgbmV3IHF1ZXJ5IGluc3RhbmNlCiAgICAgKi8KICAgIHB1YmxpYyBRdWVyeSBjcmVhdGVOYXRpdmVRdWVyeShTdHJpbmcgc3FsU3RyaW5nKTsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5RdWVyeTwvY29kZT4gZm9yIGV4ZWN1dGluZwogICAgICogYSBuYXRpdmUgU1FMIHF1ZXJ5LgogICAgICogQHBhcmFtIHNxbFN0cmluZyBhIG5hdGl2ZSBTUUwgcXVlcnkgc3RyaW5nCiAgICAgKiBAcGFyYW0gcmVzdWx0Q2xhc3MgdGhlIGNsYXNzIG9mIHRoZSByZXN1bHRpbmcgaW5zdGFuY2UocykKICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQogICAgICovCiAgICBwdWJsaWMgUXVlcnkgY3JlYXRlTmF0aXZlUXVlcnkoU3RyaW5nIHNxbFN0cmluZywgQ2xhc3MgcmVzdWx0Q2xhc3MpOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIDxjb2RlPlF1ZXJ5PC9jb2RlPiBmb3IgZXhlY3V0aW5nCiAgICAgKiBhIG5hdGl2ZSBTUUwgcXVlcnkuCiAgICAgKiBAcGFyYW0gc3FsU3RyaW5nIGEgbmF0aXZlIFNRTCBxdWVyeSBzdHJpbmcKICAgICAqIEBwYXJhbSByZXN1bHRTZXRNYXBwaW5nIHRoZSBuYW1lIG9mIHRoZSByZXN1bHQgc2V0IG1hcHBpbmcKICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQogICAgICovCiAgICBwdWJsaWMgUXVlcnkgY3JlYXRlTmF0aXZlUXVlcnkoU3RyaW5nIHNxbFN0cmluZywgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcpOwoKICAgIC8qKgogICAgICogSW5kaWNhdGUgdG8gdGhlIGVudGl0eSBtYW5hZ2VyIHRoYXQgYSBKVEEgdHJhbnNhY3Rpb24gaXMKICAgICAqIGFjdGl2ZS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbiBhIEpUQSBhcHBsaWNhdGlvbiAKICAgICAqIG1hbmFnZWQgZW50aXR5IG1hbmFnZXIgdGhhdCB3YXMgY3JlYXRlZCBvdXRzaWRlIHRoZSBzY29wZQogICAgICogb2YgdGhlIGFjdGl2ZSB0cmFuc2FjdGlvbiB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgY3VycmVudAogICAgICogSlRBIHRyYW5zYWN0aW9uLgogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIHRoZXJlIGlzCiAgICAgKiAgICAgICAgIG5vIHRyYW5zYWN0aW9uLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBqb2luVHJhbnNhY3Rpb24oKTsKCiAgICAvKioKICAgICAqIFJldHVybiBhbiBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRvIGFsbG93IGFjY2VzcyB0byB0aGUKICAgICAqIHByb3ZpZGVyLXNwZWNpZmljIEFQSS4gICBJZiB0aGUgcHJvdmlkZXIncyA8Y29kZT5FbnRpdHlNYW5hZ2VyPC9jb2RlPgogICAgICogaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGNsYXNzLCB0aGUKICAgICAqIDxjb2RlPlBlcnNpc3RlbmNlRXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uCiAgICAgKiBAcGFyYW0gY2xzICB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCB0byBiZSByZXR1cm5lZC4gIFRoaXMgaXMKICAgICAqIG5vcm1hbGx5IGVpdGhlciB0aGUgdW5kZXJseWluZyA8Y29kZT5FbnRpdHlNYW5hZ2VyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbgogICAgICogY2xhc3Mgb3IgYW4gaW50ZXJmYWNlIHRoYXQgaXQgaW1wbGVtZW50cy4KICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcwogICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3QgCiAgICAgKiAgICAgICAgIHN1cHBvcnQgdGhlIGNhbGwuIAogICAgICogQHNpbmNlIEphdmEgUGVyc2lzdGVuY2UgMi4wCiAgICAgKi8KICAgIHB1YmxpYyA8VD4gVCB1bndyYXAoQ2xhc3M8VD4gY2xzKTsgCgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgcHJvdmlkZXIgb2JqZWN0IGZvciB0aGUgPGNvZGU+RW50aXR5TWFuYWdlcjwvY29kZT4sCiAgICAgKiBpZiBhdmFpbGFibGUuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgaW1wbGVtZW50YXRpb24KICAgICAqIHNwZWNpZmljLiBUaGUgdW53cmFwIG1ldGhvZCBpcyB0byBiZSBwcmVmZXJyZWQgZm9yIG5ldyAKICAgICAqIGFwcGxpY2F0aW9ucy4KICAgICAqIEByZXR1cm4gdW5kZXJseWluZyBwcm92aWRlciBvYmplY3QgZm9yIEVudGl0eU1hbmFnZXIKICAgICAqLwogICAgcHVibGljIE9iamVjdCBnZXREZWxlZ2F0ZSgpOwoKICAgIC8qKgogICAgICogQ2xvc2UgYW4gYXBwbGljYXRpb24tbWFuYWdlZCBlbnRpdHkgbWFuYWdlci4gCiAgICAgKiBBZnRlciB0aGUgY2xvc2UgbWV0aG9kIGhhcyBiZWVuIGludm9rZWQsIGFsbCBtZXRob2RzCiAgICAgKiBvbiB0aGUgPGNvZGU+RW50aXR5TWFuYWdlcjwvY29kZT4gaW5zdGFuY2UgYW5kIGFueSAKICAgICAqIDxjb2RlPlF1ZXJ5PC9jb2RlPiBhbmQgPGNvZGU+VHlwZWRRdWVyeTwvY29kZT4KICAgICAqIG9iamVjdHMgb2J0YWluZWQgZnJvbSBpdCB3aWxsIHRocm93IHRoZSA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+CiAgICAgKiBleGNlcHQgZm9yIDxjb2RlPmdldFByb3BlcnRpZXM8L2NvZGU+LCA8Y29kZT5nZXRTdXBwb3J0ZWRQcm9wZXJ0aWVzPC9jb2RlPiwKICAgICAqIDxjb2RlPmdldFRyYW5zYWN0aW9uPC9jb2RlPiwgYW5kIDxjb2RlPmlzT3BlbjwvY29kZT4gKHdoaWNoIHdpbGwgcmV0dXJuIGZhbHNlKS4KICAgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBlbnRpdHkgbWFuYWdlciBpcwogICAgICogYXNzb2NpYXRlZCB3aXRoIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiwgdGhlIHBlcnNpc3RlbmNlCiAgICAgKiBjb250ZXh0IHJlbWFpbnMgbWFuYWdlZCB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gY29tcGxldGVzLiAKICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgbWFuYWdlcgogICAgICogICAgICAgICBpcyBjb250YWluZXItbWFuYWdlZC4KICAgICAqLwogICAgcHVibGljIHZvaWQgY2xvc2UoKTsKCiAgICAvKioKICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBlbnRpdHkgbWFuYWdlciBpcyBvcGVuLiAKICAgICAqIEByZXR1cm4gdHJ1ZSB1bnRpbCB0aGUgZW50aXR5IG1hbmFnZXIgaGFzIGJlZW4gY2xvc2VkLgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKTsKCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UtbGV2ZWwgPGNvZGU+RW50aXR5VHJhbnNhY3Rpb248L2NvZGU+IG9iamVjdC4gCiAgICAgKiBUaGUgPGNvZGU+RW50aXR5VHJhbnNhY3Rpb248L2NvZGU+IGluc3RhbmNlIG1heSBiZSB1c2VkIHNlcmlhbGx5IHRvIAogICAgICogYmVnaW4gYW5kIGNvbW1pdCBtdWx0aXBsZSB0cmFuc2FjdGlvbnMuCiAgICAgKiBAcmV0dXJuIEVudGl0eVRyYW5zYWN0aW9uIGluc3RhbmNlCiAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBpbnZva2VkIG9uIGEgSlRBCiAgICAgKiAgICAgICAgIGVudGl0eSBtYW5hZ2VyLgogICAgICovCiAgICBwdWJsaWMgRW50aXR5VHJhbnNhY3Rpb24gZ2V0VHJhbnNhY3Rpb24oKTsKCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgZW50aXR5IG1hbmFnZXIgZmFjdG9yeSBmb3IgdGhlIGVudGl0eSBtYW5hZ2VyLgogICAgICogQHJldHVybiBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGVudGl0eSBtYW5hZ2VyIGhhcyAKICAgICAqICAgICAgICAgYmVlbiBjbG9zZWQuCiAgICAgKiBAc2luY2UgSmF2YSBQZXJzaXN0ZW5jZSAyLjAKICAgICAqLwogICAgcHVibGljIEVudGl0eU1hbmFnZXJGYWN0b3J5IGdldEVudGl0eU1hbmFnZXJGYWN0b3J5KCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+UXVlcnlCdWlsZGVyPC9jb2RlPiBmb3IgdGhlIGNyZWF0aW9uIG9mCiAgICAgKiA8Y29kZT5Dcml0ZXJpYVF1ZXJ5PC9jb2RlPiBvYmplY3RzLgogICAgICogQHJldHVybiBRdWVyeUJ1aWxkZXIgaW5zdGFuY2UKICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgbWFuYWdlciBoYXMKICAgICAqICAgICAgICAgYmVlbiBjbG9zZWQuCiAgICAgKiBAc2luY2UgSmF2YSBQZXJzaXN0ZW5jZSAyLjAKICAgICAqLwogICAgcHVibGljIFF1ZXJ5QnVpbGRlciBnZXRRdWVyeUJ1aWxkZXIoKTsKCiAgICAvKioKICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5NZXRhbW9kZWw8L2NvZGU+IGludGVyZmFjZSBmb3IgYWNjZXNzIHRvIHRoZQogICAgICogbWV0YW1vZGVsIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgogICAgICogQHJldHVybiBNZXRhbW9kZWwgaW5zdGFuY2UKICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgbWFuYWdlciBoYXMKICAgICAqICAgICAgICAgYmVlbiBjbG9zZWQuCiAgICAgKiBAc2luY2UgSmF2YSBQZXJzaXN0ZW5jZSAyLjAKICAgICAqLwogICAgcHVibGljIE1ldGFtb2RlbCBnZXRNZXRhbW9kZWwoKTsKfQo=