PCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgoKPGh0bWw+CjxoZWFkPgo8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+IAo8dGl0bGU+SmF2YSBUeXBlcyBHZW5lcmF0ZWQgZnJvbSBTY2hlbWE8L3RpdGxlPgo8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAoKPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+CgoKPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPiAKCjxtZXRhIG5hbWU9ImNvbXBvbmVudCIgY29udGVudD0iIj4KPCEtLSBJbiB0aGUgZGVzY3JpcHRpb24gbWV0YXRhZywgcGxlYXNlIHByb3ZpZGUgYSBCUklFRiBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIC0tPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KPCEtLSBJbiB0aGUgY29tcG9uZW50IG1ldGF0YWcsIHBsZWFzZSBsaXN0IGtleXdvcmRzIHRoYXQgd2lsbCBoZWxwIGEgdXNlciBzZWFyY2ggZm9yIHRoaXMgdG9waWMuIC0tPgo8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iIj4KPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgoKPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Cgo8bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgogCjwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CgoKCjxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0ieW91ciBuYW1lIj4KPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiI+CjxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIj4KPG1ldGEgbmFtZT0iZGF0ZSBsYXN0IG1vZGlmaWVkIiBjb250ZW50PSIxMC8yNS8wMiI+CjwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CjwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+PCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgo8bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgo8YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KPC9oZWFkPgoKPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KPGJvZHk+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgoKPC9zY3JpcHQ+CjwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPgo8aDE+IEphdmEgVHlwZXMgR2VuZXJhdGVkIGZyb20gVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlczwvaDE+CjxkaXYgaWQ9InRvcGljdGV4dCI+IAogIDxwPldoZW4geW91IGNvbXBpbGUgWE1MIHNjaGVtYSwgdGhlIHJlc3VsdGluZyBBUEkgaXMgbWFkZSB1cCBvZiB0d28gY2F0ZWdvcmllcyAKICAgIG9mIHR5cGVzOiBidWlsdC1pbiB0eXBlcyB0aGF0IG1pcnJvciB0aG9zZSBpbiB0aGUgc2NoZW1hIHNwZWNpZmljYXRpb24gYW5kIAogICAgb3RoZXJzIHRoYXQgYXJlIGdlbmVyYXRlZCBmcm9tIHVzZXItZGVyaXZlZCBzY2hlbWEgdHlwZXMuIFRoaXMgdG9waWMgcHJvdmlkZXMgCiAgICBhbiBvdmVydmlldyBvZiB0aGUgSmF2YSB0eXBlcyBnZW5lcmF0ZWQgZm9yIHVzZXItZGVyaXZlZCB0eXBlcywgZGVzY3JpYmluZyAKICAgIHRoZSBtZXRob2RzIHRoZSBKYXZhIHR5cGVzIHByb3ZpZGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGJ1aWx0LWluIHR5cGVzLCAKICAgIHNlZSA8YSBocmVmPSJjb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbCI+WE1MQmVhbnMgU3VwcG9ydCBmb3IgCiAgICBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2E+LiBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1ldGhvZHMgZXhwb3NlZCAKICAgIGJ5IGdlbmVyYXRlZCB0eXBlcywgc2VlIDxhIGhyZWY9ImNvbk1ldGhvZHNGb3JHZW5lcmF0ZWRKYXZhVHlwZXMuaHRtbCI+TWV0aG9kcyAKICAgIGZvciBHZW5lcmF0ZWQgSmF2YSBUeXBlczwvYT4uPC9wPgogIDxwPkluIGdlbmVyYWwsIGFuIEFQSSBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEgaXMgYW4gaW50dWl0aXZlIG1lYW5zIHRvIGFjY2VzcyAKICAgIFhNTCBpbnN0YW5jZXMgYmFzZWQgb24gdGhlIHNjaGVtYS4gWW91J2xsIHByb2JhYmx5IGZpbmQgdGhhdCBmb3IgbW9zdCB1c2VzIAogICAgaXQncyB1bm5lY2Vzc2FyeSB0byBrbm93IHRoZSBydWxlcyBmb3IgZ2VuZXJhdGluZyBpdCBpbiBvcmRlciB0byB1c2UgaXQuIEhvd2V2ZXIsIAogICAgZm9yIHRob3NlIGNhc2VzIHdoZW4gaXQncyB1bmNsZWFyIHdoYXQncyBnb2luZyBvbiBiZWhpbmQgdGhlIHNjZW5lcyAob3IgaWYgCiAgICB5b3UncmUganVzdCBjdXJpb3VzKSwgdGhpcyB0b3BpYyBkZXNjcmliZXMgdGhlIHJ1bGVzLjwvcD4KICA8cCBjbGFzcz0ibm90ZXBhcmEiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIFhNTEJlYW5zIEFQSSBhbHNvIHByb3ZpZGVzIGEgCiAgICB3YXkgZm9yIHlvdSB0byBnZXQgaW5mb3JtYXRpb24gPGVtPmFib3V0IDwvZW0+dGhlIHR5cGUgc3lzdGVtIGl0c2VsZiAmIzgyMTI7IAogICAgaW4gb3RoZXIgd29yZHMsIGFib3V0IHRoZSBBUEkgYW5kIHRoZSB1bmRlcmx5aW5nIHNjaGVtYS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIAogICAgc2VlIDxhIGhyZWY9ImNvbkludHJvVG9UaGVTY2hlbWFUeXBlU3lzdGVtLmh0bWwiPkludHJvZHVjdGlvbiB0byBTY2hlbWEgVHlwZSAKICAgIFNpZ25hdHVyZXM8L2E+LjwvcD4KICA8cD5FYWNoIG9mIHRoZSB0eXBlcyBnZW5lcmF0ZWQgd2hlbiB5b3UgY29tcGlsZSBhIHNjaGVtYSBpcyBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgCiAgICBmb3IgYWNjZXNzIHRvIFhNTCBpbnN0YW5jZXMgY29uZm9ybWluZyB0byB0aGF0IHBhcnQgb2YgdGhlIHNjaGVtYS4gU3RhcnQgYnkgCiAgICB0YWtpbmcgYSBsb29rIGF0IGEgc2ltcGxlIFhNTCBhbmQgc2NoZW1hIGV4YW1wbGUuIFRoZSBmb2xsb3dpbmcgc2NoZW1hIGRlc2NyaWJlcyAKICAgIGFuIFhNTCBkb2N1bWVudCB0byBjb250YWluIGEgc3RvY2sgcHJpY2UgcXVvdGUuPC9wPgogIDxwcmU+Jmx0O3hzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiJmd0OwogICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icHJpY2UtcXVvdGUiJmd0OwogICAgICAgICZsdDt4czpjb21wbGV4VHlwZSZndDsKICAgICAgICAgICAgJmx0O3hzOnNlcXVlbmNlJmd0OwogICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0ic3RvY2stc3ltYm9sIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InN0b2NrLXByaWNlIiB0eXBlPSJ4czpmbG9hdCIvJmd0OwogICAgICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwogICAgICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7CiAgICAmbHQ7L3hzOmVsZW1lbnQmZ3Q7CiZsdDsveHM6c2NoZW1hJmd0Owo8L3ByZT4KICA8cD5UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgWE1MIHRoYXQgY29uZm9ybXMgdG8gdGhpcyBzY2hlbWEuPC9wPgogIDxwcmU+Jmx0O3ByaWNlLXF1b3RlJmd0OwogICAgJmx0O3N0b2NrLXN5bWJvbCZndDtCRUFTJmx0Oy9zdG9jay1zeW1ib2wmZ3Q7CiAgICAmbHQ7c3RvY2stcHJpY2UmZ3Q7NTkuMjEmbHQ7L3N0b2NrLXByaWNlJmd0OwombHQ7L3ByaWNlLXF1b3RlJmd0OzwvcHJlPgogIDxwPldoZW4geW91IGNvbXBpbGUgdGhpcyBzY2hlbWEsIHlvdSBnZXQgdHdvIGdlbmVyYXRlZCBYTUxCZWFucyBpbnRlcmZhY2VzOiAKICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4gUHJpY2VRdW90ZURvY3VtZW50PC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGVEb2N1bWVudC5QcmljZVF1b3RlPC9zcGFuPi48L3A+CiAgPHA+RnJvbSB0aGUgc2NoZW1hIHBvaW50IG9mIHZpZXcsIHRoZSBnZW5lcmF0ZWQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+IAogICAgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIDxlbT5jb21wbGV4IHR5cGU8L2VtPiB5b3Ugc2VlIGluc2lkZSB0aGUgc2NoZW1hJ3MgCiAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2UtcXVvdGU8L3NwYW4+IGVsZW1lbnQgZGVjbGFyYXRpb24uIExvb2tpbmcgYXQgCiAgICB0aGUgWE1MIGluc3RhbmNlLCB5b3UgY2FuIHNlZSB0aGF0IHRoaXMgY29tcGxleCB0eXBlIHRyYW5zbGF0ZXMgaW50byBhIHNlcXVlbmNlIAogICAgb2YgdHdvIGVsZW1lbnRzLCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c3RvY2stc3ltYm9sPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnN0b2NrLXByaWNlPC9zcGFuPi4gCiAgICBTbyBpdCdzIG5vdCBzdXJwcmlzaW5nIHRoYXQgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPiAKICAgIGludGVyZmFjZSBleHBvc2VzIG1ldGhvZHMgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0U3RvY2tQcmljZTwvc3Bhbj4gCiAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNldFN0b2NrUHJpY2U8L3NwYW4+IHRvIHNldCB0aGUgdmFsdWUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnN0b2NrLXByaWNlPC9zcGFuPiAKICAgIGVsZW1lbnQuPC9wPgogIDxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZURvY3VtZW50PC9zcGFuPiBpbnRlcmZhY2UsIG9uIHRoZSAKICAgIG90aGVyIGhhbmQsIHJlcHJlc2VudHMgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gPGVtPmRvY3VtZW50PC9lbT4gCiAgICB0aGF0IGNvbnRhaW5zIHRoZSByb290IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gZWxlbWVudC4gCiAgICBYTUxCZWFucyBjcmVhdGVzIGEgc3BlY2lhbCAmcXVvdDtkb2N1bWVudCZxdW90OyB0eXBlIGZvciBnbG9iYWwgZWxlbWVudCB0eXBlcy4gCiAgICBBIGRvY3VtZW50IHR5cGUgcHJvdmlkZXMgYSB3YXkgZm9yIHlvdSB0byBnZXQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgCiAgICB0eXBlLCBoZXJlIHJlcHJlc2VudGVkIGJ5IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPi4gVGhlIAogICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlLXF1b3RlPC9zcGFuPiBlbGVtZW50IGlzIGNvbnNpZGVyZWQgYSA8ZW0+Z2xvYmFsPC9lbT4gCiAgICBlbGVtZW50IGJlY2F1c2UgaXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSBhbnl3aGVyZSBlbHNlIGluIHRoZSBzY2hlbWEuIEZvciAKICAgIGdsb2JhbCBlbGVtZW50cywgdGhlIFhNTEJlYW5zIHNjaGVtYSBjb21waWxlciBnZW5lcmF0ZXMgYW4gaW50ZXJmYWNlIHdob3NlIAogICAgbmFtZSBlbmRzIHdpdGggJnF1b3Q7RG9jdW1lbnQuJnF1b3Q7IFRoaXMgaXMgYmVjYXVzZSBhbiBYTUwgc2NoZW1hIGhhcyBubyAKICAgIHdheSBvZiBkZWZpbmluZyBhICZxdW90O3Jvb3QmcXVvdDsgZWxlbWVudDsgYW55IGdsb2JhbCBlbGVtZW50IGNhbiBiZSB0aGUgCiAgICByb290LjwvcD4KICA8cD5UaGUgZm9sbG93aW5nIGJpdCBvZiBKYXZhIGNvZGUgaWxsdXN0cmF0ZXMgaG93IHlvdSBtaWdodCB1c2UgdGhlc2UgaW50ZXJmYWNlcyAKICAgIHRvIGdldCB0aGUgc3RvY2sgcHJpY2UgY29udGFpbmVkIGluIHRoZSBYTUwuPC9wPgogIDxwcmU+CnB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0U3RvY2tQcmljZShqYXZhLmlvLkZpbGUgb3JkZXJYTUwpIHRocm93cyBFeGNlcHRpb24gCnsKICAgIFByaWNlUXVvdGVEb2N1bWVudCBkb2NYTUwgPSBQcmljZVF1b3RlRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShvcmRlclhNTCk7CiAgICBQcmljZVF1b3RlIHF1b3RlWE1MID0gZG9jWE1MLmdldFByaWNlUXVvdGUoKTsKICAgIGZsb2F0IHN0b2NrUHJpY2UgPSBxdW90ZVhNTC5nZXRTdG9ja1ByaWNlKCk7CiAgICByZXR1cm4gc3RvY2tQcmljZTsKfQo8L3ByZT4KICA8cD5UaGlzIGNvZGUgbG9hZHMgdGhlIFhNTCBmcm9tIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkZpbGU8L3NwYW4+IG9iamVjdCwgCiAgICBjb252ZXJ0aW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cGFyc2U8L3NwYW4+IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAKICAgIHRvIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGVEb2N1bWVudDwvc3Bhbj4gaW5zdGFuY2UuIEl0IHRoZW4gCiAgICB1c2VzIHRoaXMgaW5zdGFuY2UgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPi4gCiAgICBXaXRoIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPiwgdGhlIGNvZGUgZXh0cmFjdHMgdGhlIHN0b2NrIAogICAgcHJpY2UuIDwvcD4KPC9kaXY+CjxkaXY+IAogIDxkaXYgaWQ9InRvcGljdGV4dCI+IAogICAgPHA+VGhlIFhNTCBzY2hlbWEgc3BlY2lmaWNhdGlvbiBwcm92aWRlcyBhIHJpY2ggc2V0IG9mIHJ1bGVzIHRocm91Z2ggd2hpY2ggCiAgICAgIHlvdSBjYW4gZGVyaXZlIG5ldyB0eXBlcy4gV2hlbiB5b3UgZ2VuZXJhdGUgaW50ZXJmYWNlcyBmcm9tIHlvdXIgc2NoZW1hLCAKICAgICAgWE1MQmVhbnMgdXNlcyB0aGUgc2NoZW1hJ3MgcnVsZXMgdG8gZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBpbnRlcmZhY2VzLiAKICAgICAgVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgc29tZSBvZiB0aGUgZ3VpZGVsaW5lcyBieSB3aGljaCB0aGlzIGlzIGRvbmUuPC9wPgogICAgPGgyPk5hbWVzIGZvciBJbnRlcmZhY2VzPC9oMj4KICAgIDxwPkludGVyZmFjZXMgYXJlIGdlbmVyYXRlZCBmb3Igc2NoZW1hIHR5cGVzIChib3RoIHNpbXBsZSBhbmQgY29tcGxleCkuIEFub255bW91cyAKICAgICAgc2NoZW1hIHR5cGVzIHJlc3VsdCBpbiBpbm5lciBpbnRlcmZhY2VzIGluc2lkZSB0aGUgdHlwZSBpbnRlcmZhY2UgaW4gd2hpY2ggCiAgICAgIHRoZXkgYXJlIGRlZmluZWQuIFRoZWlyIG5hbWUgY29tZXMgZnJvbSB0aGUgZWxlbWVudCBvciBhdHRyaWJ1dGUgaW4gd2hpY2ggCiAgICAgIHRoZXkgaXMgZGVmaW5lZC48L3A+CiAgICA8cD5OYW1lcyBmb3Igc2NoZW1hIHR5cGVzIGJlY29tZSBKYXZhLWZyaWVuZGx5IG5hbWVzIHdoZW4gdGhlIHNjaGVtYSBpcyBjb21waWxlZC4gCiAgICAgIEluIG90aGVyIHdvcmRzLCBuYW1lcyBzdWNoIGFzICJwcmljZS1xdW90ZSIgYmVjb21lICJQcmljZVF1b3RlLiIgSW4gYWRkaXRpb24sIAogICAgICBhIHNjaGVtYSdzIFhNTCBuYW1lc3BhY2UgVVJJcyBiZWNvbWUgcGFja2FnZSBuYW1lcyBmb3IgWE1MQmVhbiB0eXBlcyBnZW5lcmF0ZWQgCiAgICAgIGZyb20gdGhlIHNjaGVtYS4gVGhlIHdheSB0aGlzIG5hbWUgdHJhbnNsYXRpb24gaXMgZG9uZSBpcyBkZXNjcmliZWQgYnkgc2VjdGlvbiAKICAgICAgQyBvZiB0aGUgSmF2YSBBUEkgZm9yIFhNTCBCaW5kaW5nIChKQVhCKSBzcGVjaWZpY2F0aW9uIGF0IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2Rvd25sb2Fkcy9qYXhiLmh0bWwiIHRhcmdldD0iX2JsYW5rIj4gCiAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIuaHRtbC48L2E+IDwvcD4KICAgIDxwPkhlcmUgYXJlIGEgZmV3IGV4YW1wbGVzOjwvcD4KICAgIDx0YWJsZT4KICAgICAgPHRyPiAKICAgICAgICA8dGQ+PHN0cm9uZz5TY2hlbWEgVGFyZ2V0IE5hbWVzcGFjZTwvc3Ryb25nPjwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSIxNTUiPjxzdHJvbmc+WE1MIExvY2FsbmFtZTwvc3Ryb25nPjwvdGQ+CiAgICAgICAgPHRkPjxzdHJvbmc+RnVsbHktUXVhbGlmaWVkIFhNTEJlYW4gVHlwZSBOYW1lPC9zdHJvbmc+PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyPiAKICAgICAgICA8dGQ+aHR0cDovL3d3dy5teWNvbXBhbnkuY29tLzIwMDIvYnV5ZXI8L3RkPgogICAgICAgIDx0ZCB3aWR0aD0iMTU1Ij5wdXJjaGFzZS1vcmRlci00PC90ZD4KICAgICAgICA8dGQ+Y29tLm15Y29tcGFueS54MjAwMi5idXllci5QdXJjaGFzZU9yZGVyNDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0cj4gCiAgICAgICAgPHRkPmh0dHA6Ly9teWNvLmNvbS9zYW1wbGUuaHRtbDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSIxNTUiPlNhbXBsZURvY3VtZW50PC90ZD4KICAgICAgICA8dGQ+Y29tLm15Y28uc2FtcGxlLlNhbXBsZURvY3VtZW50PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyPiAKICAgICAgICA8dGQ+aHR0cDovL29wZW51cmkub3JnL3Rlc3RfY2FzZV8xPC90ZD4KICAgICAgICA8dGQgd2lkdGg9IjE1NSI+dGVzdF90eXBlPC90ZD4KICAgICAgICA8dGQ+b3JnLm9wZW51cmkudGVzdENhc2UxLlRlc3RUeXBlPC90ZD4KICAgICAgPC90cj4KICAgIDwvdGFibGU+CiAgICA8cD5XaGVuIHRoZXJlIGFyZSBuYW1lIGNvbGxpc2lvbnMsIHRoZSBnZW5lcmF0ZWQgdHlwZXMgd2lsbCBoYXZlIG5hbWVzIHdpdGggCiAgICAgIG51bWVyYWxzIGFwcGVuZGVkJm5ic3A7lyBmb3IgZXhhbXBsZSwgIlRlc3RUeXBlMiIuPC9wPgogICAgPGgyPkdsb2JhbCBFbGVtZW50cyBhbmQgQXR0cmlidXRlczwvaDI+CiAgICA8cD5JbiBzY2hlbWEsIGdsb2JhbCBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgYXJlIHRob3NlIHRoYXQgYXJlIAogICAgICBkZWNsYXJlZCBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBzY2hlbWEgKHRoYXQgaXMsIGltbWVkaWF0ZWx5IHdpdGhpbiB0aGUgCiAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zY2hlbWE8L3NwYW4+IHJvb3QgZWxlbWVudCkuIEJlY2F1c2UgdGhleSBhcmUgZ2xvYmFsLCAKICAgICAgdGhleSBtYXkgYmUgcmVmZXJlbmNlZCBmcm9tIGluc2lkZSB0aGUgc2NoZW1hIGJ5IG5hbWUuIFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y3JlZGl0UmVwb3J0PC9zcGFuPiAKICAgICAgKG5vdCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmNyZWRpdFJlcG9ydFR5cGU8L3NwYW4+IGNvbXBsZXggdHlwZSkgCiAgICAgIGVsZW1lbnQgZGVmaW5lZCBpbiB0aGUgZm9sbG93aW5nIHNjaGVtYSBpcyBhbiBleGFtcGxlLjwvcD4KICAgIDxwcmU+CiZsdDt4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy9zYW1wbGVzL2NyZWRpdFJlcG9ydCZxdW90OyAKICAgIHhtbG5zOmNyPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy9zYW1wbGVzL2NyZWRpdFJlcG9ydCZxdW90OyAKICAgIHhtbG5zOnhzPSZxdW90O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJnF1b3Q7CiAgICBlbGVtZW50Rm9ybURlZmF1bHQ9JnF1b3Q7cXVhbGlmaWVkJnF1b3Q7CiAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0mcXVvdDt1bnF1YWxpZmllZCZxdW90OyZndDsKICAgICZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSZxdW90O2NyZWRpdFJlcG9ydFR5cGUmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O3hzOnNlcXVlbmNlJmd0OwogICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2JhbmtSZXBvcnQmcXVvdDsgdHlwZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsvJmd0OwogICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O3RheFJlcG9ydCZxdW90OyB0eXBlPSZxdW90O3hzOnN0cmluZyZxdW90Oy8mZ3Q7CiAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7CiAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2NyZWRpdFJlcG9ydCZxdW90OyB0eXBlPSZxdW90O2NyOmNyZWRpdFJlcG9ydFR5cGUmcXVvdDsvJmd0OwombHQ7L3hzOnNjaGVtYSZndDs8L3ByZT4KICAgIDxwPlhNTEJlYW5zIGdlbmVyYXRlcyBhIHNlcGFyYXRlIGludGVyZmFjZSBmb3IgZWFjaCBvZiB0aGVzZS4gQWxzbywgZ2xvYmFsIAogICAgICBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgdHlwZXMgYXJlIHNvbWV3aGF0IHVuaXF1ZSBpbiB0aGF0IHRoZSBzY2hlbWEgY29tcGlsZXIgCiAgICAgIHdpbGwgY3JlYXRlIHNwZWNpYWwgdHlwZXMgdG8gaG9sZCB0aGUgZ2xvYmFsbHkgZGVmaW5lZCBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gCiAgICAgIFRoZSBuYW1lcyBvZiB0aGVzZSB0eXBlcyB3aWxsIGJlIGFwcGVuZGVkIHdpdGggJnF1b3Q7RG9jdW1lbnQmcXVvdDsgKGZvciAKICAgICAgZWxlbWVudHMpIG9yICZxdW90O0F0dHJpYnV0ZSZxdW90OyAoZm9yIGF0dHJpYnV0ZXMpLiBZb3UgY2FuIHJldHJpZXZlIHRoZSAKICAgICAgZWxlbWVudCBvciBhdHRyaWJ1dGUgaXRzZWxmIChvciBjcmVhdGUgYSBuZXcgb25lKSBieSBjYWxsaW5nIHRoZSBhY2Nlc3NvciAKICAgICAgbWV0aG9kcyB0aGF0IHRoZSBzcGVjaWFsIHR5cGVzIHByb3ZpZGUuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3b3VsZCBjcmVhdGUgCiAgICAgIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjcmVkaXRSZXBvcnQgZWxlbWVudC48L3A+CiAgICA8cHJlPgovLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNwZWNpYWwgZG9jdW1lbnQgdHlwZS4KQ3JlZGl0UmVwb3J0RG9jdW1lbnQgcmVwb3J0RG9jID0gQ3JlZGl0UmVwb3J0RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwovKgogKiBVc2UgdGhlIGRvY3VtZW50IHR5cGUgdG8gYWRkIGEgbmV3IGNyZWRpdFJlcG9ydCBlbGVtZW50IHRvIHRoZSBYTUwgaW5zdGFuY2UuCiAqIE5vdGUgdGhhdCB0aGUgdHlwZSByZXR1cm5lZCBieSB0aGUgYWRkTmV3Q3JlZGl0UmVwb3J0IG1ldGhvZCBpcyB0aGUgCiAqIGNyZWRpdFJlcG9ydFR5cGUgY29tcGxleCB0eXBlIGRlZmluZWQgZm9yIGl0IGluIHNjaGVtYS4KICovCkNyZWRpdFJlcG9ydFR5cGUgcmVwb3J0ID0gcmVwb3J0RG9jLmFkZE5ld0NyZWRpdFJlcG9ydCgpOwo8L3ByZT4KICAgIDxoMj5HbG9iYWwgVXNlci1EZXJpdmVkIFR5cGVzPC9oMj4KICAgIDxwPkEgPGVtPnVzZXItZGVyaXZlZDwvZW0+IHR5cGUgaXMgb25lIGRlZmluZWQgd2l0aCBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5jb21wbGV4VHlwZTwvc3Bhbj4gCiAgICAgIG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zaW1wbGVUeXBlPC9zcGFuPiBlbGVtZW50IGluIHNjaGVtYS4gVXNlci1kZXJpdmVkIAogICAgICB0eXBlcyBhdCB0aGUgdG9wIGxldmVsIG9mIGEgc2NoZW1hIGFyZSBnbG9iYWwuIFhNTEJlYW5zIGdlbmVyYXRlcyBhbiBpbnRlcmZhY2UgCiAgICAgIGZvciBlYWNoIG9mIHRoZXNlLCBhcyBpdCBkb2VzIHdpdGggZ2xvYmFsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLiBUaGVzZSAKICAgICAgaW50ZXJmYWNlcyBpbmNsdWRlIG1ldGhvZHMgdGhyb3VnaCB3aGljaCB5b3UgY2FuIGdldCBhbmQgc2V0IHRoZSB0eXBlJ3MgCiAgICAgIHZhbHVlcywgaW5jbHVkaW5nIGFueSBuZXN0ZWQgZGVyaXZlZCB0eXBlcyBpdCBtYXkgY29udGFpbi4gVGhlIGZvbGxvd2luZyAKICAgICAgc2NoZW1hIHNuaXBwZXQgZGVmaW5lcyBhIHVzZXItZGVyaXZlZCBjb21wbGV4IHR5cGUgY2FsbGVkIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pdGVtVHlwZTwvc3Bhbj4sIAogICAgICBhbG9uZyB3aXRoIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlVHlwZTwvc3Bhbj4gdGhhdCB1c2VzIGl0IGFzIHRoZSAKICAgICAgdHlwZSBmb3IgYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPml0ZW08L3NwYW4+IGNoaWxkIGVsZW1lbnQuPC9wPgogICAgPHByZT4KJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9JnF1b3Q7aXRlbVR5cGUmcXVvdDsmZ3Q7CiAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7CiAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtuYW1lJnF1b3Q7IHR5cGU9JnF1b3Q7eHM6c3RyaW5nJnF1b3Q7LyZndDsKICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2Ftb3VudCZxdW90OyB0eXBlPSZxdW90O3hzOmludCZxdW90Oy8mZ3Q7CiAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtwcmljZSZxdW90OyB0eXBlPSZxdW90O3hzOmRvdWJsZSZxdW90Oy8mZ3Q7CiAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwombHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwombHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0mcXVvdDtwcmljZVR5cGUmcXVvdDsmZ3Q7CiAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7CiAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtpdGVtJnF1b3Q7IHR5cGU9JnF1b3Q7cHM6aXRlbVR5cGUmcXVvdDsgbWluT2NjdXJzPSZxdW90OzAmcXVvdDsgbWF4T2NjdXJzPSZxdW90O3VuYm91bmRlZCZxdW90Oy8mZ3Q7CiAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwombHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwombHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O3ByaWNlJnF1b3Q7IHR5cGU9JnF1b3Q7cHM6cHJpY2VUeXBlJnF1b3Q7LyZndDsKPC9wcmU+CiAgICA8cD5CeSBkZWZhdWx0LCB0aGUgZ2VuZXJhdGVkIEphdmEgdHlwZSBmb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPml0ZW1UeXBlPC9zcGFuPiAKICAgICAgd291bGQgYmUgYW4gaW50ZXJmYWNlIGNhbGxlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+SXRlbVR5cGU8L3NwYW4+LiBXaXRoIAogICAgICB0aGlzIHR5cGUsIHlvdSB3b3VsZCBiZSBhYmxlIHRvIGdldCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiwgCiAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5hbW91bnQ8L3NwYW4+LCBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlPC9zcGFuPiAKICAgICAgY2hpbGQgZWxlbWVudHMuIEhvd2V2ZXIsIGEgdXNlci1kZXJpdmVkIHR5cGUgKGFzIG9wcG9zZWQgdG8gYW4gZWxlbWVudCBvciAKICAgICAgYXR0cmlidXRlKSBpcyBhbHdheXMgaW50ZW5kZWQgZm9yIHVzZSBhcyB0aGUgdHlwZSB0byB3aGljaCBhbiBlbGVtZW50IG9yIAogICAgICBhdHRyaWJ1dGUgaXMgYm91bmQuIEluIG90aGVyIHdvcmRzLCBpdCdzIGNvbnRhaW5lZCBieSBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gCiAgICAgIFdoaWxlIHlvdSBjYW4gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgdXNlci1kZXJpdmVkIHR5cGUsIHRoZSBuZXcgaW5zdGFuY2UncyAKICAgICAgdW5kZXJseWluZyBYTUwgaXMgYSBmcmFnbWVudC4gQXMgdGhlIGdlbmVyYXRlZCBBUEkgd291bGQgbWFrZSBjbGVhciwgdGhlIAogICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbVR5cGU8L3NwYW4+IGJlY29tZXMgdGhlIHJldHVybiB0eXBlIG9mIGEgZ2V0IAogICAgICBtZXRob2QsIG9yIHRoZSBwYXJhbWV0ZXIgb2YgYSBzZXQgbWV0aG9kLjwvcD4KICAgIDxwcmU+Ci8vIENyZWF0ZSBhIG5ldyBwcmljZSBkb2N1bWVudC4KUHJpY2VEb2N1bWVudCBwcmljZURvYyA9IFByaWNlRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwpQcmljZVR5cGUgcHJpY2UgPSBwcmljZURvYy5nZXRQcmljZSgpOwoKLyogCiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBJdGVtVHlwZSBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgaXRzCiAqIGNoaWxkIGVsZW1lbnRzLgogKi8KSXRlbVR5cGUgaXRlbSA9IEl0ZW1UeXBlLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKaXRlbS5zZXROYW1lKCZxdW90O2JpY3ljbGUmcXVvdDspOwppdGVtLnNldEFtb3VudCgxMik7Cml0ZW0uc2V0UHJpY2UoNTYwLjAwKTsKCi8qIAogKiBVc2UgdGhlIG5ldyBJdGVtVHlwZSBpbnN0YW5jZSB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSAKICogcHJpY2UgZWxlbWVudCdzIGZpcnN0IGl0ZW0gY2hpbGQgZWxlbWVudC4gTm90aWNlIHRoYXQgdGhlIHNldCBtZXRob2QKICogaGVyZSBpcyBhbiAiQXJyYXkiIG1ldGhvZC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBpdGVtIGVsZW1lbnQKICogaXMgZGVmaW5lZCB3aXRoIGEgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIGF0dHJpYnV0ZS4gSXQgY2FuIG9jY3VyCiAqIG1hbnkgdGltZXMgYXMgYSBjaGlsZCBvZiBwcmljZS4KICovCnByaWNlLnNldEl0ZW1BcnJheSgwLCBpdGVtKTsKPC9wcmU+CiAgICA8aDI+TmVzdGVkIEVsZW1lbnRzIGFuZCBEZXJpdmVkIFR5cGVzPC9oMj4KICAgIDxwPldoZW4geW91ciBzY2hlbWEgaW5jbHVkZXMgbmFtZWQgdHlwZXMgdGhhdCBhcmUgZGVjbGFyZWQgbG9jYWxseZd3aXRoaW4gCiAgICAgIHRoZSBkZWNsYXJhdGlvbiBvZiBhbm90aGVyIGVsZW1lbnQgb3IgdHlwZZd0aGUgc2NoZW1hIHR5cGUncyBnZW5lcmF0ZWQgSmF2YSAKICAgICAgaW50ZXJmYWNlIHdpbGwgYmUgYW4gaW5uZXIgaW50ZXJmYWNlIHdpdGhpbiB0aGUgdHlwZSBpdCdzIG5lc3RlZCBpbi48L3A+CiAgICA8cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzY2hlbWEgc25pcHBldCBkZWZpbmVzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiAKICAgICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZW5kZXI8L3NwYW4+IGVsZW1lbnRzIG5lc3RlZCB3aXRoaW4gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cGVyc29uPC9zcGFuPiAKICAgICAgY29tcGxleCB0eXBlLiBJbiBwYXJ0aWN1bGFyLCBub3RlIHRoYXQgdGhlIGdlbmRlciBlbGVtZW50IGlzIGRlZmluZWQgYXMgCiAgICAgIGRlcml2aW5nIGZyb20gdGhlIHhzOk5NVE9LRU4gYnVpbHQtaW4gdHlwZS48L3A+CiAgICA8cHJlPgombHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0icGVyc29uIiZndDsKICAgICZsdDt4czpzZXF1ZW5jZSZndDsKICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJnZW5kZXIiJmd0OwogICAgICAgICAgICAmbHQ7eHM6c2ltcGxlVHlwZSZndDsKICAgICAgICAgICAgICAgICZsdDt4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIiZndDsKICAgICAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hbGUiLyZndDsKICAgICAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZlbWFsZSIvJmd0OwogICAgICAgICAgICAgICAgJmx0Oy94czpyZXN0cmljdGlvbiZndDsKICAgICAgICAgICAgJmx0Oy94czpzaW1wbGVUeXBlJmd0OwogICAgICAgICZsdDsveHM6ZWxlbWVudCZndDsKICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7CiZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7CjwvcHJlPgogICAgPHA+VGhlIGdlbmVyYXRlZCBpbnRlcmZhY2VzIGZvciBwZXJzb24gYW5kIGdlbmRlciB3b3VsZCBiZSBvcmdhbml6ZWQgaW4gc291cmNlIAogICAgICBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nLiBPZiBjb3Vyc2UsIHlvdSB3b3VsZG4ndCBzZWUgdGhlIHNvdXJjZSwgYnV0IAogICAgICB5b3UgY2FuIHNlZSBoZXJlIHRoYXQgdGhlIEdlbmRlciBpbnRlcmZhY2UgaXMgbmVzdGVkIHdpdGggUGVyc29uLiBBbHNvLCAKICAgICAgbm90aWNlIHRoYXQgaXQgZXh0ZW5kcyBYbWxOTVRPS0VOLCBtaXJyb3JpbmcgdGhlIHNjaGVtYS48L3A+CiAgICA8cHJlPnB1YmxpYyBpbnRlcmZhY2UgUGVyc29uIGV4dGVuZHMgWG1sT2JqZWN0CnsKICAgIHB1YmxpYyBpbnRlcmZhY2UgR2VuZGVyIGV4dGVuZHMgWG1sTk1UT0tFTgogICAgewogICAgICAgIC8vIE1ldGhvZHMgb21pdHRlZCBmb3IgdGhpcyBleGFtcGxlCiAgICB9CiAgICAvLyBNZXRob2RzIG9taXR0ZWQgZm9yIHRoaXMgZXhhbXBsZQp9CjwvcHJlPgogICAgPHA+WW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkdlbmRlcjwvc3Bhbj4gCiAgICAgIHR5cGUgaW4gdGhpcyB3YXkgKHRoZXJlIGFyZSBhbHNvIHZhcmlvdXMgYWx0ZXJuYXRpdmVzIHRvIHRoaXMpOjwvcD4KICAgIDxwcmU+Ci8vIENyZWF0ZSBhIG5ldyBQZXJzb24gaW5zdGFuY2UuClBlcnNvbiBwZXJzb24gPSBQZXJzb24uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwovKgogKiBTZXQgdGhlIGdlbmRlciBlbGVtZW50J3MgdmFsdWUgdXNpbmcgdGhlIAogKiBlbnVtZXJhdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLgogKi8KcGVyc29uLnNldEdlbmRlcihHZW5kZXIuRkVNQUxFKTs8L3ByZT4KICAgIDxoMj5Vc2VyLURlcml2ZWQgU2ltcGxlIFR5cGVzPC9oMj4KICAgIDxwPkluIGFkZGl0aW9uIHRvIHRoZSA0NiBidWlsdC1pbiBzaW1wbGUgdHlwZXMgaW4gWE1MIHNjaGVtYSwgYSBzY2hlbWEgY2FuIAogICAgICBpbmNsdWRlIGl0cyBvd24gY3VzdG9tIHNpbXBsZSB0eXBlcyB1c2luZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6c2ltcGxlVHlwZTwvc3Bhbj4gCiAgICAgIGRlY2xhcmF0aW9ucy4gVGhlc2UgdXNlci1kZXJpdmVkIHNpbXBsZSB0eXBlcyBhcmUgYWx3YXlzIGJhc2VkIG9uIHRoZSBidWlsdC1pbiAKICAgICAgWE1MIHNjaGVtYSB0eXBlcy4gVGhlIGJ1aWx0LWluIHR5cGVzIGNhbiBiZSBtb2RpZmllZCBieSA8ZW0+cmVzdHJpY3Rpbmc8L2VtPiAKICAgICAgdGhlbSwgdGFraW5nIDxlbT51bmlvbnM8L2VtPiBvZiB0aGVtLCBvciBtYWtpbmcgc3BhY2Utc2VwYXJhdGVkIDxlbT5saXN0czwvZW0+IAogICAgICBvZiB0aGVtLiBFYWNoIFhNTCBzaW1wbGUgdHlwZSBpcyB0cmFuc2xhdGVkIGludG8gYSBKYXZhIHR5cGUgdGhhdCBwcm92aWRlcyAKICAgICAgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEuPC9wPgogICAgPGgzPlVuaW9uczwvaDM+CiAgICA8cD5JbiBzY2hlbWEsIHlvdSBjYW4gdXNlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czp1bmlvbjwvc3Bhbj4gdG8gc3BlY2lmeSAKICAgICAgYSBzaW1wbGUgdHlwZSB0aGF0IGlzIGFsbG93ZWQgdG8gY29udGFpbiB2YWx1ZXMgb2YgYSBudW1iZXIgb2Ygb3RoZXIgc2ltcGxlIAogICAgICB0eXBlcy4gWE1MQmVhbnMgZ2VuZXJhdGVzIGEgdHlwZSBmb3IgYSB1bmlvbiwganVzdCBhcyBpdCBnZW5lcmF0ZXMgYSB0eXBlIAogICAgICBmb3IgYW55IG90aGVyIHNjaGVtYSB0eXBlLiBBdCBydW4gdGltZSwgeW91IGNhbiBkaXNjb3ZlciB0aGUgdW5kZXJseWluZyAKICAgICAgdHlwZSBvZiBhbiBpbnN0YW5jZSBvZiBhIHVuaW9uIHR5cGUgYnkgY2FsbGluZyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gCiAgICAgIGludGVyZmFjZSdzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbnN0YW5jZVR5cGU8L3NwYW4+IG1ldGhvZC4gT25jZSB5b3UgCiAgICAgIGhhdmUgZGV0ZXJtaW5lZCB0aGUgdHlwZSwgeW91IGNhbiBjYXN0IGFuIGluc3RhbmNlIG9mIGEgdW5pb24gdHlwZSB0byB0aGUgCiAgICAgIGFjdHVhbCB1bmRlcmx5aW5nIGluc3RhbmNlIHR5cGUuPC9wPgogICAgPHByZT4KJmx0O3hzOnNpbXBsZVR5cGUgbmFtZT0mcXVvdDtpbnRPclN0cmluZyZxdW90OyZndDsKICAgICZsdDt4czp1bmlvbiBtZW1iZXJUeXBlcz0mcXVvdDt4czppbnQgeHM6c3RyaW5nJnF1b3Q7Jmd0OwombHQ7L3hzOnNpbXBsZVR5cGUmZ3Q7CjwvcHJlPgogICAgPHA+R2l2ZW4gdGhlIHByZWNlZGluZyBzY2hlbWEgc25pcHBldCwgeW91IGNvdWxkIHNldCB0aGUgaW50T3JTdHJpbmcgdmFsdWUgCiAgICAgIHRvLCBzYXksIDYgb3IgJnF1b3Q7c2l4JnF1b3Q7LiBUaGUgdW5pb24gb2YgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmludDwvc3Bhbj4gCiAgICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6c3RyaW5nPC9zcGFuPiBtYWtlcyBib3RoIGFsbG93YWJsZS48L3A+CiAgICA8cHJlPgovLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHR5cGUuCkludE9yU3RyaW5nIGludE9yU3RyaW5nID0gSW50T3JTdHJpbmcuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwppbnRPclN0cmluZy5zZXQoJnF1b3Q7NSZxdW90Oyk7Ci8vIFRoaXMgY29kZSBwcmludHMgIlhtbEludCIgdG8gdGhlIGNvbnNvbGUuClN5c3RlbS5vdXQucHJpbnRsbihpbnRPclN0cmluZy5pbnN0YW5jZVR5cGUoKS5nZXRTaG9ydEphdmFOYW1lKCkpOwo8L3ByZT4KICAgIDxoMz5SZXN0cmljdGlvbnM8L2gzPgogICAgPHA+WE1MIHNjaGVtYSByZXN0cmljdGlvbnMgb24gc2ltcGxlIFhNTEJlYW5zIHR5cGVzIGFyZSBlbmZvcmNlZC4gU28sIGZvciAKICAgICAgZXhhbXBsZSwgaXQgaXMgaWxsZWdhbCB0byBzZXQgYSBudW1iZXIgb3V0c2lkZSBpdHMgcmVzdHJpY3RlZCByYW5nZS4gPC9wPgogICAgPGg0Pk51bWVyaWMgVHlwZSBSZXN0cmljdGlvbnM8L2g0PgogICAgPHA+SW4gc2NoZW1hLCB5b3UgY2FuIHJlc3RyaWN0IG51bWVyaWMgdHlwZXMgdG8gYWxsb3csIGZvciBleGFtcGxlLCBvbmx5IGEgCiAgICAgIHBhcnRpY3VsYXIgcmFuZ2Ugb2YgdmFsdWVzLiBGb3Igc3VjaCBhIHJlc3RyaWN0aW9uLCBYTUxCZWFucyB0YWlsb3JzIHRoZSAKICAgICAgcmVzdWx0aW5nIG5hdHVyYWwgSmF2YSBhbHRlcm5hdGl2ZS4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgdGhlIGZvbGxvd2luZyAKICAgICAgZWxlbWVudCBkZWZpbmVkIGluIHNjaGVtYTo8L3A+CiAgICA8cHJlPgombHQ7eHM6ZWxlbWVudCBuYW1lPSJudW1iZXIiJmd0OwogICAgJmx0O3hzOnNpbXBsZVR5cGUmZ3Q7CiAgICAgICAgJmx0O3hzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiJmd0OwogICAgICAgICAgICAmbHQ7eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8mZ3Q7CiAgICAgICAgICAgICZsdDt4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEwMDAwMDAiLyZndDsKICAgICAgICAmbHQ7L3hzOnJlc3RyaWN0aW9uJmd0OwogICAgJmx0Oy94czpzaW1wbGVUeXBlJmd0OwombHQ7L3hzOmVsZW1lbnQmZ3Q7CjwvcHJlPgogICAgPHA+VGhlIHR5cGUgaXMgcmVzdHJpY3RlZCBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czppbnRlZ2VyPC9zcGFuPiwgCiAgICAgIGJ1dCBiZWNhdXNlIHRoZSBudW1iZXIncyByYW5nZSBpcyBsaW1pdGVkIHRvIGJldHdlZW4gMSBhbmQgMTAwMDAwMCwgaXQgd2lsbCAKICAgICAgZml0IGludG8gYSBKYXZhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbnQ8L3NwYW4+LiBBIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5sb25nPC9zcGFuPiAKICAgICAgb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9zcGFuPiB3b3VsZCBiZSB0b28gYmlnIAogICAgICBmb3IgdGhlIG5lZWQuIEluIG90aGVyIHdvcmRzLCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldE51bWJlcjwvc3Bhbj4gCiAgICAgIG1ldGhvZCBnZW5lcmF0ZWQgZm9yIHRoaXMgdHlwZSB3aWxsIHJldHVybiBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aW50PC9zcGFuPiwgCiAgICAgIHJhdGhlciB0aGFuIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkJpZ0ludGVnZXI8L3NwYW4+IG9yIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxvbmc8L3NwYW4+LjwvcD4KICAgIDxwPkJ5IHRoZSBzYW1lIHRva2VuLCBhbiBsb25nIGNhbiBiZSBjb21waWxlZCB0byBhbiBpbnQgaWYgdGhlIHRvdGFsRGlnaXRzIAogICAgICBhdHRyaWJ1dGUgaXMgJmx0Oz05LCBvciB0aGUgbWluIGFuZCBtYXggYXR0cmlidXRlIHZhbHVlcyBhcmUgd2l0aGluIDMyLWJpdCAKICAgICAgMnMgY29tcGxlbWVudCByYW5nZS48L3A+CiAgICA8cD5UaGUgc2luZ2xlIHByaW1pdGl2ZSBYTUwgdHlwZSB4czpkZWNpbWFsIGNhbiBiZSByZXN0cmljdGVkIGluIHNldmVyYWwgd2F5cyAKICAgICAgdGhhdCBpbmZsdWVuY2UgdGhlIHJlc3VsdGluZyBuYXR1cmFsIEphdmEgdHlwZS4gRm9yIGV4YW1wbGUsIGl0IGNhbiBiZTo8L3A+CiAgPC9kaXY+CjwvZGl2Pgo8dWw+CiAgPGxpPgogICAgPGRpdj4KICAgICAgPGRpdj5Db21waWxlZCB0byBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5CaWdJbnRlZ2VyPC9zcGFuPiBpZiBpdHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmZyYWN0aW9uRGlnaXQ8L3NwYW4+IAogICAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gMC4gPC9kaXY+CiAgICA8L2Rpdj4KICA8L2xpPgogIDxsaT4KICAgIDxkaXY+CiAgICAgIDxkaXY+Q29tcGlsZWQgdG8gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bG9uZzwvc3Bhbj4gaWYgaXRzIHRvdGFsRGlnaXRzIAogICAgICAgIGF0dHJpYnV0ZSBpcyAmbHQ7PTE4LCBvciB0aGUgbWluIGFuZCBtYXggYXJlIHdpdGhpbiA2NC1iaXQgMnMgY29tcGxlbWVudCAKICAgICAgICByYW5nZS48L2Rpdj4KICAgIDwvZGl2PgogIDwvbGk+CjwvdWw+CjxkaXY+CiAgPGRpdj4KICAgIDxoMz5FbnVtZXJhdGlvbnM8L2gzPgogICAgPHA+SW4gc2NoZW1hLCB5b3UgY2FuIGRlcml2ZSBhIG5ldyB0eXBlIGJ5IHJlc3RyaWN0aW5nIGEgYnVpbHQtaW4gdHlwZSBzbyAKICAgICAgdGhhdCBvbmx5IGEgZmluaXRlIHNldCBvZiB2YWx1ZXMgYXJlIGFsbG93YWJsZS4gV2hlcmUgc2NoZW1hIGRvZXMgdGhpcyBieSAKICAgICAgcmVzdHJpY3RpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnN0cmluZzwvc3Bhbj4sIFhNTEJlYW5zIGdlbmVyYXRlcyAKICAgICAgYSBzcGVjaWFsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5FbnVtPC9zcGFuPiB0eXBlLiBXaXRoIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5FbnVtPC9zcGFuPiwgCiAgICAgIHlvdSBjYW4gc2VsZWN0IHRoZSBlbnVtZXJhdGVkIHZhbHVlIGVpdGhlciBieSBpdHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlN0cmluZzwvc3Bhbj4gCiAgICAgIHZhbHVlIG9yIGJ5IGEgbnVtZXJpYyBpbmRleC4gVGhlIGluZGV4J3MgdmFsdWUgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgCiAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5TdHJpbmc8L3NwYW4+IHZhbHVlJ3Mgb3JkZXIgaW4gdGhlIHNjaGVtYS4gSGF2aW5nIAogICAgICBhbiBpbmRleCBjYW4gYmUgdXNlZnVsIGluIEphdmEgc3dpdGNoIHN0YXRlbWVudHMuPC9wPgogICAgPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhIGRvY3VtZW50IGNvbnRhaW5pbmcgcHJpY2UgZWxlbWVudHMgd2hvc2UgCiAgICAgIHR5cGUgd2FzIHRoZSBwcmljZVR5cGUgZGVmaW5lZCBpbiB0aGUgZm9sbG93aW5nIHNjaGVtYSBzbmlwcGV0OjwvcD4KICAgIDxwcmU+Jmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9JnF1b3Q7cHJpY2VUeXBlJnF1b3Q7Jmd0OwogICAgJmx0O3hzOnNlcXVlbmNlJmd0OwogICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7aXRlbSZxdW90OyB0eXBlPSZxdW90O3BzOml0ZW1UeXBlJnF1b3Q7IG1pbk9jY3Vycz0mcXVvdDswJnF1b3Q7IAogICAgICAgICAgICAgIG1heE9jY3Vycz0mcXVvdDt1bmJvdW5kZWQmcXVvdDsvJmd0OwogICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKICAgICZsdDt4czphdHRyaWJ1dGUgbmFtZT0mcXVvdDt0aHJlc2hvbGQmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O3hzOnNpbXBsZVR5cGUmZ3Q7CiAgICAgICAgICAgICZsdDt4czpyZXN0cmljdGlvbiBiYXNlPSZxdW90O3hzOnN0cmluZyZxdW90OyZndDsKICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0mcXVvdDtCZWxvdzEwRG9sbGFycyZxdW90Oy8mZ3Q7CiAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9JnF1b3Q7QmV0d2VlbjEwQW5kMjBEb2xsYXJzJnF1b3Q7LyZndDsKICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0mcXVvdDtBYm92ZTIwRG9sbGFycyZxdW90Oy8mZ3Q7CiAgICAgICAgICAgICZsdDsveHM6cmVzdHJpY3Rpb24mZ3Q7CiAgICAgICAgJmx0Oy94czpzaW1wbGVUeXBlJmd0OwogICAgJmx0Oy94czphdHRyaWJ1dGUmZ3Q7CiZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7PC9wcmU+CiAgICA8cD5Vc2luZyB0eXBlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLCB5b3Ugd291bGQgYmUgYWJsZSB0byB3cml0ZSB0aGUgZm9sbG93aW5nIAogICAgICBKYXZhIGNvZGUgdG8gJnF1b3Q7c3dpdGNoJnF1b3Q7IG9uIHRoZSB0aHJlc2hvbGQgYXR0cmlidXRlJ3MgZW51bWVyYXRpb246PC9wPgogICAgPHByZT4KLyoKICogVXNlIHRoZSBpbnRWYWx1ZSBtZXRob2QgcHJvdmlkZWQgYnkgdGhlIEVudW0gdHlwZSB0byBkZXRlcm1pbmUgdGhlIHRocmVzaG9sZAogKiBhdHRyaWJ1dGUncyBjdXJyZW50IGVudW1lcmF0aW9uIHZhbHVlLgogKi8Kc3dpdGNoKHByaWNlRWxlbWVudHNbaV0uZ2V0VGhyZXNob2xkKCkuaW50VmFsdWUoKSkKewogICAgLy8gVXNlIHRoZSBUaHJlc2hvbGQgdHlwZSdzIGVudW1lcmF0aW9uIHZhbHVlcyB0byB0ZXN0IGZvciBhbiBhdHRyaWJ1dGUgdmFsdWUuIAogICAgY2FzZSBQcmljZVR5cGUuVGhyZXNob2xkLklOVF9CRUxPV18xMF9ET0xMQVJTOgogICAgICAgIHplcm9CdWZmZXIuYXBwZW5kKGl0ZW0uZ2V0VGl0bGUoKSArICZxdW90O1xuJnF1b3Q7KTsKICAgICAgICBicmVhazsKICAgIGNhc2UgUHJpY2VUeXBlLlRocmVzaG9sZC5JTlRfQkVUV0VFTl8xMF9BTkRfMjBfRE9MTEFSUzoKICAgICAgICB0ZW5CdWZmZXIuYXBwZW5kKGl0ZW0uZ2V0VGl0bGUoKSArICZxdW90O1xuJnF1b3Q7KTsKICAgICAgICBicmVhazsKICAgIGNhc2UgUHJpY2VUeXBlLlRocmVzaG9sZC5JTlRfQUJPVkVfMjBfRE9MTEFSUzoKICAgICAgICB0d2VudHlCdWZmZXIuYXBwZW5kKGl0ZW0uZ2V0VGl0bGUoKSArICZxdW90O1xuJnF1b3Q7KTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCZxdW90O1lvISBTb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZCEmcXVvdDspOwogICAgICAgIGJyZWFrOwp9PC9wcmU+CiAgPC9kaXY+CiAgPHAgY2xhc3M9InJlbGF0ZWR0b3BpY3MiPlJlbGF0ZWQgVG9waWNzPC9wPgogIDxwPjxhIGhyZWY9ImNvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sIj5YTUxCZWFucyBTdXBwb3J0IGZvciAKICAgIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvYT48L3A+CjwvZGl2PgogPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KCjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K