ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS8uZ2l0aWdub3JlIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2NzhhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTcgQEAKKyMgZWNsaXBzZQorLmNsYXNzcGF0aAorLnByb2plY3QKKy5zZXR0aW5ncy8KK2Jpbi8KKworIyBncmFkbGUKKy5ncmFkbGUKK2J1aWxkLworCisjIGludGVsbGlqCisuaWRlYS8KK291dC8KKyouaXByCisqLmltbAorKi5pd3MKKy9iaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4ZTA5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDI3NyBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wCisKKyAgICBUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorICAgIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04KKyAgICBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisxLiBERUZJTklUSU9OUworCisiQ29udHJpYnV0aW9uIiBtZWFuczoKKworICBhKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKKyAgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorICAgICBpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKyAgICAgaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKyAgd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20KKyAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICJvcmlnaW5hdGVzIiBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5CisgIHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4KKyAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB0aGF0CisgIGFyZSBub3QgTW9kaWZpZWQgV29ya3MuCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKK2FyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKK29yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCitBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK29yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisKKyJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyCitmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBQcm9ncmFtIGFuZCBmb3Igd2hpY2ggdGhlCitlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCityZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4KKworIk1vZGlmaWVkIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0gdGhhdAorcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCitjb250ZW50cyBvZiB0aGUgUHJvZ3JhbSwgaW5jbHVkaW5nLCBmb3IgcHVycG9zZXMgb2YgY2xhcml0eSBhbnkgbmV3IGZpbGUKK2luIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBjb250YWlucyBhbnkgY29udGVudHMgb2YgdGhlIFByb2dyYW0uIE1vZGlmaWVkCitXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsCitpbnRlcmZhY2VzLCB0eXBlcywgY2xhc3Nlcywgc3RydWN0dXJlcywgb3IgZmlsZXMgb2YgdGhlIFByb2dyYW0gc29sZWx5CitpbiBlYWNoIGNhc2UgaW4gb3JkZXIgdG8gbGluayB0bywgYmluZCBieSBuYW1lLCBvciBzdWJjbGFzcyB0aGUgUHJvZ3JhbQorb3IgTW9kaWZpZWQgV29ya3MgdGhlcmVvZi4KKworIkRpc3RyaWJ1dGUiIG1lYW5zIHRoZSBhY3RzIG9mIGEpIGRpc3RyaWJ1dGluZyBvciBiKSBtYWtpbmcgYXZhaWxhYmxlCitpbiBhbnkgbWFubmVyIHRoYXQgZW5hYmxlcyB0aGUgdHJhbnNmZXIgb2YgYSBjb3B5LgorCisiU291cmNlIENvZGUiIG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworbW9kaWZpY2F0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwKK2RvY3VtZW50YXRpb24gc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworIlNlY29uZGFyeSBMaWNlbnNlIiBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorVmVyc2lvbiAyLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aGF0IGxpY2Vuc2UsIGluY2x1ZGluZyBhbnkKK2V4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBpbml0aWFsCitDb250cmlidXRvci4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKKyAgYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKKyAgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKKyAgcHVibGljbHkgcGVyZm9ybSwgRGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKKyAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3Jrcy4KKworICBiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudAorICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsCisgIGlmIGFueSwgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbAorICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0CisgIHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uCisgIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKKyAgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKKyAgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCisgIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworICBjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKKyAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCisgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMKKyAgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKKyAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUKKyAgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5CisgIGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbAorICBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5CisgIHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBEaXN0cmlidXRlIHRoZQorICBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZQorICBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCisgIGQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzCisgIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50CisgIHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKyAgZSkgTm90d2l0aHN0YW5kaW5nIHRoZSB0ZXJtcyBvZiBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UsIG5vCisgIENvbnRyaWJ1dG9yIG1ha2VzIGFkZGl0aW9uYWwgZ3JhbnRzIHRvIGFueSBSZWNpcGllbnQgKG90aGVyIHRoYW4KKyAgdGhvc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50KSBhcyBhIHJlc3VsdCBvZiBzdWNoIFJlY2lwaWVudCdzCisgIHJlY2VpcHQgb2YgdGhlIFByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UKKyAgKGlmIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAzKS4KKworMy4gUkVRVUlSRU1FTlRTCisKKzMuMSBJZiBhIENvbnRyaWJ1dG9yIERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtIGluIGFueSBmb3JtLCB0aGVuOgorCisgIGEpIHRoZSBQcm9ncmFtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBhcyBTb3VyY2UgQ29kZSwgaW4KKyAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgIHRoZSBQcm9ncmFtIHdpdGggYSBzdGF0ZW1lbnQgdGhhdCB0aGUgU291cmNlIENvZGUgZm9yIHRoZSBQcm9ncmFtCisgIGlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGluZm9ybXMgUmVjaXBpZW50cyBob3cgdG8KKyAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZTsgYW5kCisKKyAgYikgdGhlIENvbnRyaWJ1dG9yIG1heSBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIHVuZGVyIGEgbGljZW5zZQorICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgIGkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCisgICAgIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kCisgICAgIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcworICAgICBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKKyAgICAgaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCisgICAgIGlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cycgcmlnaHRzCisgICAgIGluIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBzZWN0aW9uIDMuMjsgYW5kCisKKyAgICAgaXYpIHJlcXVpcmVzIGFueSBzdWJzZXF1ZW50IGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbnkKKyAgICAgcGFydHkgdG8gYmUgdW5kZXIgYSBsaWNlbnNlIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMKKyAgICAgb2YgdGhpcyBzZWN0aW9uIDMuCisKKzMuMiBXaGVuIHRoZSBQcm9ncmFtIGlzIERpc3RyaWJ1dGVkIGFzIFNvdXJjZSBDb2RlOgorCisgIGEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIG9yIGlmIHRoZQorICBQcm9ncmFtIChpKSBpcyBjb21iaW5lZCB3aXRoIG90aGVyIG1hdGVyaWFsIGluIGEgc2VwYXJhdGUgZmlsZSBvcgorICBmaWxlcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBhIFNlY29uZGFyeSBMaWNlbnNlLCBhbmQgKGlpKSB0aGUgaW5pdGlhbAorICBDb250cmlidXRvciBhdHRhY2hlZCB0byB0aGUgU291cmNlIENvZGUgdGhlIG5vdGljZSBkZXNjcmliZWQgaW4KKyAgRXhoaWJpdCBBIG9mIHRoaXMgQWdyZWVtZW50LCB0aGVuIHRoZSBQcm9ncmFtIG1heSBiZSBtYWRlIGF2YWlsYWJsZQorICB1bmRlciB0aGUgdGVybXMgb2Ygc3VjaCBTZWNvbmRhcnkgTGljZW5zZXMsIGFuZAorCisgIGIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mCisgIHRoZSBQcm9ncmFtLgorCiszLjMgQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCwKK3RyYWRlbWFyaywgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zCitvZiBsaWFiaWxpdHkgKCJub3RpY2VzIikgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbSBmcm9tIGFueSBjb3B5IG9mCit0aGUgUHJvZ3JhbSB3aGljaCB0aGV5IERpc3RyaWJ1dGUsIHByb3ZpZGVkIHRoYXQgQ29udHJpYnV0b3JzIG1heSBhZGQKK3RoZWlyIG93biBhcHByb3ByaWF0ZSBub3RpY2VzLgorCis0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgorCitDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcword2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCitsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLAordGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMKK3RoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5CitvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLAorZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMKK2FuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0KK2luIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdAorYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkCitpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCit3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLAorYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55CityZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CitwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKK2Fsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KK2RlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvCitwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5Cit0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQKK1BFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVywgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIgorQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUgorSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgorVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCithcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwKK3Jpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMKK29yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQKK1BFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVywgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMKK1NIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCitFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUCitQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCitDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUKK0VYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlcgorYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCitQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlCitvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MKK3JpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YKK3RpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlCithbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4KK0hvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKK2dyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCitidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZAorbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZAorcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24KK2lzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlCityZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZQorZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nCit2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCitEaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzCityZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsCitDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cworQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQKK3JlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKK2VzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQKK3VuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAordG8gYmUgZW5mb3JjZWFibGUgYnkgYW55IGVudGl0eSB0aGF0IGlzIG5vdCBhIENvbnRyaWJ1dG9yIG9yIFJlY2lwaWVudC4KK05vIHRoaXJkLXBhcnR5IGJlbmVmaWNpYXJ5IHJpZ2h0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGlzIEFncmVlbWVudC4KKworRXhoaWJpdCBBIC0gRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlCisKKyJUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcKK1NlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGgKK2luIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2LiAyLjAgYXJlIHNhdGlzZmllZDoge25hbWUgbGljZW5zZShzKSwKK3ZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uIgorCisgIFNpbXBseSBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgdGhpcyBFeGhpYml0IEEKKyAgaXMgbm90IHN1ZmZpY2llbnQgdG8gbGljZW5zZSB0aGUgU291cmNlIENvZGUgdW5kZXIgU2Vjb25kYXJ5IExpY2Vuc2VzLgorCisgIElmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyCisgIGZpbGUsIHRoZW4gWW91IG1heSBpbmNsdWRlIHRoZSBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhIExJQ0VOU0UKKyAgZmlsZSBpbiBhIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvCisgIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuCisKKyAgWW91IG1heSBhZGQgYWRkaXRpb25hbCBhY2N1cmF0ZSBub3RpY2VzIG9mIGNvcHlyaWdodCBvd25lcnNoaXAuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvTk9USUNFLnR4dCBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjgxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvTk9USUNFLnR4dApAQCAtMCwwICsxLDM4MiBAQAorIyBOb3RpY2VzIGZvciBFY2xpcHNlIE1ETXxCTAorCitUaGlzIGNvbnRlbnQgaXMgcHJvZHVjZWQgYW5kIG1haW50YWluZWQgYnkgdGhlIEVjbGlwc2UgTURNfEJMIHByb2plY3QsCitpdCBpcyBhIHByb2plY3Qgb2YgdGhlIG9wZW5NRE0oUikgRWNsaXBzZSBXb3JraW5nIEdyb3VwLgorCisqIFByb2plY3QgaG9tZTogaHR0cHM6Ly9wcm9qZWN0cy5lY2xpcHNlLm9yZy9wcm9qZWN0cy90ZWNobm9sb2d5Lm1kbWJsCisKKyMjIFRyYWRlbWFya3MKKworRWNsaXBzZSBNRE18QkwsIE1ETXxCTCBhbmQgRWNsaXBzZSBvcGVuTURNKFIpIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcworb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbi4KKworIyMgQ29weXJpZ2h0CisKK0FsbCBjb250ZW50IGlzIHRoZSBwcm9wZXJ0eSBvZiB0aGUgZm9sbG93aW5nIHJlc3BlY3RpdmUgYXV0aG9ycyBvciB0aGVpciBlbXBsb3llcnMuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYXV0aG9yc2hpcCBvZiBjb250ZW50LCBwbGVhc2UgY29uc3VsdCB0aGUgbGlzdGVkCitzb3VyY2UgY29kZSByZXBvc2l0b3J5IGxvZ3MuCisKK0NvcHlyaWdodCAoYykgMjAxNi0yMDE5IEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICitDb3B5cmlnaHQgKGMpIDIwMTYtMjAyMCBQZWFrIFNvbHV0aW9uIEdtYkgKK0NvcHlyaWdodCAoYykgMjAxNy0yMDE4IHNjaWVuY2UgKyBjb21wdXRpbmcgQUcgVHVlYmluZ2VuIChBVE9TIFNFKQorQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggQ2Fub28gRW5naW5lZXJpbmcgQUcKK0NvcHlyaWdodCAoYykgMjAxNyBGbG9yaWFuIFNjaG1pdHQKK0NvcHlyaWdodCAoYykgMjAxNy0yMDIwIEFuZ2VsaWthIFdpdHRlaworQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgRWxla3Ryb25pc2NoZSBGYWhyd2Vya3N5c3RlbWUgR01CSAorQ29weXJpZ2h0IChjKSAyMDE4LTIwMjAgS2FyYWt1biBBRworQ29weXJpZ2h0IChjKSAyMDE4LTIwMjAgQWxleGFuZGVyIE5laG1lcgorCisjIyBEZWNsYXJlZCBQcm9qZWN0IExpY2Vuc2VzCisKK1RoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQordGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorCisjIyBTb3VyY2UgQ29kZQorCitUaGUgcHJvamVjdCBtYWludGFpbnMgdGhlIGZvbGxvd2luZyBzb3VyY2UgY29kZSByZXBvc2l0b3JpZXM6CisKK29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5naXQJICAgIC0gVGhlIG9wZW5NRE0oUikgQVBJLgorb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0LmdpdAkgICAgLSBFeHRlbnNpb24gb2YgdGhlIG9wZW5NRE0oUikgQVBJIGNvbnRhaW5pbmcgZGVmYXVsdCBlbGVtZW50cy4KK29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5naXQJLSBPRFMgaW1wbGVtZW50YXRpb24gb2YgcGVyc2lzdGVuY2UgYWRhcHRlci4KK29yZy5lY2xpcHNlLm1kbS5udWNsZXVzLmdpdAkgICAgICAgIC0gQ29yZSBidWlsZGluZyBibG9ja3MgZm9yIHRoZSBvcGVuTURNIEJ1c2luZXNzIExvZ2ljIGFuZCBXZWIgRnJvbnRlbmQuCisKKyMjIFRoaXJkLXBhcnR5IENvbnRlbnQKKworVGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4KK0lmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZworaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0bwordGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuCisKK2FudGxyNC00LjUuMy5qYXIoMi41LjMpCisgICAgKiBMaWNlbnNlOiBOZXcgQlNEIGxpY2Vuc2UKKworYW9wYWxsaWFuY2UtcmVwYWNrYWdlZC0yLjUuMC1iMDUuamFyICgyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2NvbW1vbnMtY29kZWMtMS4yLmphciAoMS4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitjb21tb25zLWh0dHBjbGllbnQtMy4xLmphciAgKDMuMSkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworY29tbW9ucy1sYW5nMy0zLjguMS5qYXIgKDMuOC4xKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitjb21tb25zLXRleHQtMS42LmphciAoMS42KQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitnc29uLTIuNy5qYXIgKDIuNykKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworR29vZ2xlIEd1YXZhIFZlcnNpb246IDI1LjAtanJlICAoMjUuMCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworR3JhZGxlIFdyYXBwZXIgKDQuMTAuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworaGsyLWFwaS0yLjUuMC1iMDUuamFyICgyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMLTEuMQorCitoazItbG9jYXRvci0yLjUuMC1iMDUuamFyKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworaGsyLXV0aWxzLTIuNS4wLWIwNS5qYXIgKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworamFja3Nvbi1hbm5vdGF0aW9ucy0yLjkuMC5qYXIgICgyLjkuMCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1jb3JlLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1kYXRhYmluZC0yLjkuMi5qYXIgICgyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1qYXhycy1iYXNlLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1qYXhycy1qc29uLXByb3ZpZGVyLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1tb2R1bGUtamF4Yi1hbm5vdGF0aW9ucy0yLjkuMi5qYXIgICgyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamF2YXNzaXN0LTMuMjAuMC1HQS5qYXIgICgyLjIwLjAtR0EpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgMi4wCisKK2pjbC1vdmVyLXNsZjRqLTEuNy4yNS5qYXIoMS43LjI1KQorICAgICogTGljZW5zZTogTUlUIExpY2Vuc2UKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly93d3cuc2xmNGoub3JnL2xpY2Vuc2UuaHRtbAorICAgICogUHJvamVjdCBVUkw6ICBodHRwczovL3d3dy5zbGY0ai5vcmcKKyAgICAqIFNvdXJjZSBVUkw6ICAgaHR0cHM6Ly9naXRodWIuY29tL3Fvcy1jaC9zbGY0agorCitqZXJzZXktY2xpZW50LTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1jb21tb24tMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktY29udGFpbmVyLXNlcnZsZXQtMi4yMy4yLmphciAgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUtMi4yMy4zLmphcigyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1ndWF2YS0yLjIzLjIuamFyICAoMi4yMy4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqZXJzZXktbWVkaWEtamF4Yi0yLjIzLjIuamFyKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LW1lZGlhLXNzZS0yLjIzLjIuamFyICgyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1tZWRpYS1tdWx0aXBhcnQtMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktc2VydmVyLTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworbG9nNGotb3Zlci1zbGY0ai0xLjcuMjUuamFyICgxLjcuMjUpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK2xvZ2JhY2stY2xhc3NpYy0xLjIuMy5qYXIoMS4yLjMpCisgICAgKiBMaWNlbnNlOiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDEuMAorCitsb2diYWNrLWNvcmUtMS4yLjMuamFyKDEuMi4zKQorICAgICogTGljZW5zZTogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAxLjAKKworbWltZXB1bGwtMS45LjYuamFyICgxLjkuNCkKKyAgICAqIExpY2Vuc2U6IENEREwKKworb3BlbmF0ZngtMC43LjQuamFyICgwLjcuNCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworb3NnaS1yZXNvdXJjZS1sb2NhdG9yLTEuMC4xLmphcigxLjAuMSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworcHJvdG9idWYtamF2YS0zLjIuMC5qYXIgKDMuMi4wKQorICAgICogTGljZW5zZTogTmV3IEJTRCBsaWNlbnNlCisKK3Byb3RvYnVmLWphdmEtdXRpbC0zLjIuMC5qYXIgICgzLjIuMCkKKyAgICAqIExpY2Vuc2U6IE5ldyBCU0QgbGljZW5zZQorCitzd2FnZ2VyLWFubm90YXRpb25zLTIuMC44LmphciAoMi4wLjgpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK3N3YWdnZXItdWktMy4yMy4wLmphciAoMy4yMy4wKQorICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorCitzbGY0ai1hcGktMS43LjI1LmphciAgKDEuNy4yNSkKKyAgICAqIExpY2Vuc2U6IE1JVCBsaWNlbnNlCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vd3d3LnNsZjRqLm9yZy9saWNlbnNlLmh0bWwKKyAgICAqIFByb2plY3QgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vcW9zLWNoL3NsZjRqCisgICAgKiBTb3VyY2UgVVJMOiAgaHR0cHM6Ly9naXRodWIuY29tL3Fvcy1jaC9zbGY0ai9yZWxlYXNlcy90YWcvdl8xLjcuMjUKKworc3RheDItYXBpLTMuMS40LmphciAoMy4xLjQpCisgICAgKiBMaWNlbnNlOiBCU0QtMi1DbGF1c2UKKwordmFsaWRhdGlvbi1hcGktMS4xLjAuRmluYWwuamFyICgxLjEuMC5GaW5hbCkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK3ZhdnItMC45LjEtc291cmNlcy5qYXIgKDAuOS4xKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKwordmF2ci1tYXRjaC0wLjkuMS5qYXIgKDAuOS4xKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKword29vZHN0b3gtY29yZS1hc2wtNC40LjEuamFyICg0LjQuMSkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKKworRkZBTUZBTUZBTSBTaWxrIEljb24sIFZlcnNpb24gMS4zCisgICAgKiBMaWNlbnNlOiBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBMaWNlbnNlCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvCisgICAgKiBQcm9qZWN0OiBodHRwOi8vd3d3LmZhbWZhbWZhbS5jb20vbGFiL2ljb25zL3NpbGsvCisgICAgKiBTb3VyY2U6ICBodHRwOi8vd3d3LmZhbWZhbWZhbS5jb20vbGFiL2ljb25zL3NpbGsvCisKK0Bhbmd1bGFyL2FuaW1hdGlvbnM6Ny4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pby9hcGkvYW5pbWF0aW9ucworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvY2RrOjcuMS4xCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8vYXBpCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjEuMQorCisKK0Bhbmd1bGFyL2NvbW1vbkA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40cgorCitAYW5ndWxhci9jb21waWxlckA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9jb3JlQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2Zvcm1zQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2h0dHBANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvcm91dGVyQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK2Jvb3RzdHJhcEA0LjEuMworICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcAorCitjbGFzcy10cmFuc2Zvcm1lckAwLjEuNgorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlc3RhY2svY2xhc3MtdHJhbnNmb3JtZXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3BsZWVyb2NrL2NsYXNzLXRyYW5zZm9ybWVyCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcGxlZXJvY2svY2xhc3MtdHJhbnNmb3JtZXIKKworY29yZS1qc0AyLjYuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3Jhdy9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3JlbGVhc2VzL3RhZy92Mi42LjAKKworZmlsZS1zYXZlckAxLjMuMworICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcy9yYXcvbWFzdGVyL0xJQ0VOU0UubWQKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzCisKK2ZvbnQtYXdlc29tZUA0LjcuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3J0QXdlc29tZS9Gb250LUF3ZXNvbWUvYmxvYi9tYXN0ZXIvTElDRU5TRS50eHQKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tLworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL0ZvcnRBd2Vzb21lL0ZvbnQtQXdlc29tZQorCituZzItc3BsaXQtcGFuZUAxLjMuMQorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS93YW5uYWJlZ2Vlay9uZzItc3BsaXQtcGFuZS9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS93YW5uYWJlZ2Vlay9uZzItc3BsaXQtcGFuZQorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3dhbm5hYmVnZWVrL25nMi1zcGxpdC1wYW5lCisKK25neC1ib290c3RyYXBAMy4xLjIKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vdmFsb3Itc29mdHdhcmUvbmd4LWJvb3RzdHJhcC9ibG9iL3YzLjEuMi9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL3ZhbG9yLXNvZnR3YXJlLmNvbS9uZ3gtYm9vdHN0cmFwCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vdmFsb3Itc29mdHdhcmUvbmd4LWJvb3RzdHJhcC90cmVlL3YzLjEuMgorCitAbmd4LXRyYW5zbGF0ZS9jb3JlQDExLjAuMQorICAgICogTGljZW5zZTogTUlUIAorICAgICogTGljZW5jZSBQYXRoOiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2NvcmUvYmxvYi92MTEuMC4xL0xJQ0VOU0UgIAorICAgICogUHJvamVjdCBVUkw6ICAgIGh0dHA6Ly93d3cubmd4LXRyYW5zbGF0ZS5jb20vCisgICAgKiBTb3VyY2UgVVJMOiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvY29yZQorCitAbmd4LXRyYW5zbGF0ZS9odHRwLWxvYWRlckA0LjAuMAorICAgICogTGljZW5zZTogTUlUIAorICAgICogTGljZW5jZSBQYXRoOiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2h0dHAtbG9hZGVyL2Jsb2IvdjQuMC4wL0xJQ0VOU0UgIAorICAgICogUHJvamVjdCBVUkw6ICAgIGh0dHA6Ly93d3cubmd4LXRyYW5zbGF0ZS5jb20vCisgICAgKiBTb3VyY2UgVVJMOiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvaHR0cC1sb2FkZXIvdHJlZS92NC4wLjAKKworcHJpbWVpY29uczoxLjAuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1laWNvbnMvYmxvYi8xLjAuMC9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL3d3dy5wcmltZWZhY2VzLm9yZy9wcmltZW5nCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZWljb25zL3RyZWUvMS4wLjAKKworcHJpbWVuZ0A3LjAuMQorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1lbmcvYmxvYi83LjAuMS9MSUNFTlNFLm1kCisgICAgKiBQcm9qZWN0OiBodHRwczovL3d3dy5wcmltZWZhY2VzLm9yZy9wcmltZW5nCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZW5nL3RyZWUvNy4wLjEKKworcnhqc0A2LjMuMworICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorICAgICogUHJvamVjdDogaHR0cHM6Ly9yeGpzLWRldi5maXJlYmFzZWFwcC5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvdHJlZS82LjMuMworCityeGpzLWNvbXBhdDo2LjMuMworICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorICAgICogUHJvamVjdDogaHR0cHM6Ly9yeGpzLWRldi5maXJlYmFzZWFwcC5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvdHJlZS82LjMuMy9jb21wYXQKKwordHNsaWJAMS45LjAKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdHNsaWIKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdHNsaWIvdHJlZS8xLjkuMAorCit6b25lLmpzQDAuOC4yNgorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvcmF3L21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhcgorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9yZWxlYXNlcy90YWcvdjAuOC4yNgorCitPTUcgRXZlbnQgU2VydmljZSBTcGVjaWZpY2F0aW9uICgxLjIpCisKKyogTGljZW5zZTogTGljZW5zZVJlZiAtIE9iamVjdC1NYW5hZ2VtZW50LUdyb3VwLUxpY2Vuc2UKKyogUHJvamVjdDogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL0VWTlQvMS4yLworKiBTb3VyY2U6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9FVk5ULzEuMi9wZGYKKworT01HIE5vdGlmaWNhdGlvbiBTZXJ2aWNlIFNwZWNpZmljYXRpb24gKDEuMSkKKworKiBMaWNlbnNlOiBMaWNlbnNlUmVmIC0gT2JqZWN0LU1hbmFnZW1lbnQtR3JvdXAtTGljZW5zZQorKiBQcm9qZWN0OiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvTk9ULworKiBTb3VyY2U6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9OT1QvMS4xL1BERgorCitvZHM1MzAuaWRsCitEYXRlOiBIb2VoZW5raXJjaGVuLCAwNi8wMS8yMDE2CisiVGhlIEFTQU0gQm9hcmQgb2YgRGlyZWN0b3JzIHJlbGVhc2VzIHRoZSBJREwgZmlsZXMgZm9yIHVzZSB1bmRlciB0aGUgRVBMIHRvIHRoZSBFY2xpcHNlIElXRyBvcGVuTURNLgorVGhpcyBpcyB2YWxpZCBmb3IgYWxsIHZlcnNpb25zIG9mIEFTQU0gT0RTIDUuMy54LgorVGhpcyBwZXJtaXNzaW9uIGlzIHZhbGlkIHVuZGVyIHRoZSBjb25kaXRpb25zIG9mIEVjbGlwc2Ugd2lsbCBub3QgbW9kaWZ5IHRoZSBmaWxlLiIKKworQXZhbG9uRXZlbnQuaWRsLCBDb3JiYUZpbGVTZXJ2ZXIuaWRsCitEYXRlOiAwOC8xNS8yMDE2CisiSGVyZXdpdGgsIHdlIHJlbGVhc2UgdGhlIGdlbmVyYXRlZCBDbGllbnQtU291cmNlLUNvZGUgZ2VuZXJhdGVkIGZyb20gb3VyIENPUkJBIElETHMsIG5hbWVseQorKiBDT1JCQU5vdGlmaWNhdGlvbiBTZXJ2aWNlIChnZW5lcmF0ZWQgZnJvbSDigJ5BdmFsb25FdmVudC5pZGzigJ0pCisqIENPUkJBRmlsZVNlcnZlciAoZ2VuZXJhdGVkIGZyb20g4oCeQ29yYmFGaWxlU2VydmVyLmlkbOKAnCksCitVbmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKS4gVGhpcyBhZ3JlZW1lbnQgZG9lcyBub3QgaW5jbHVkZSB0aGUg4oCeQXZhbG9uRXZlbnQuaWRs4oCcIGFuZAor4oCeQ29yYmFGaWxlU2VydmVyLmlkbOKAnCBpdHNlbGYsIHdoaWNoIHJlbWFpbiBwcm90ZWN0ZWQgcHJvcGVydHkgb2YgSGlnaFFTb2Z0LiAiCisKKyMjIENyeXB0b2dyYXBoeQorCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5CittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzCitwZXJtaXR0ZWQuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvYnVpbGQuZ3JhZGxlIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGExMDVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworZGVzY3JpcHRpb24gPSAnTURNIEFQSSAtIEJhc2UgTW9kZWwnCitncm91cCA9ICdvcmcuZWNsaXBzZS5tZG0nCit2ZXJzaW9uID0gJzUuMS4wTTgnCisKK2FwcGx5IHBsdWdpbjogJ2phdmEnCithcHBseSBwbHVnaW46ICdtYXZlbicKK2FwcGx5IHBsdWdpbjogJ2VjbGlwc2UnCisKK3JlcG9zaXRvcmllcyB7CisgICAgbWF2ZW5Mb2NhbCgpCisgICAgbWF2ZW5DZW50cmFsKCkKK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICAvLyB0ZXN0aW5nCisgICAgdGVzdENvbXBpbGUgJ2p1bml0Omp1bml0OjQuMTInCisgICAgdGVzdENvbXBpbGUgJ29yZy5tb2NraXRvOm1vY2tpdG8tY29yZToyLjEzLjAnIAorICAgIHRlc3RDb21waWxlICdvcmcuYXNzZXJ0ajphc3NlcnRqLWNvcmU6My42LjInCit9CisKK2phciB7CisJbWV0YUluZiB7IGZyb20gJ05PVElDRS50eHQnIH0KKwltZXRhSW5mIHsgZnJvbSAnTElDRU5TRS50eHQnIH0KK30KKwordGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZGVwZW5kc09uOiBjbGFzc2VzKSB7CisJY2xhc3NpZmllciA9ICdzb3VyY2VzJworCWZyb20gc291cmNlU2V0cy5tYWluLmFsbFNvdXJjZQorfQorCithcnRpZmFjdHMgeworCWFyY2hpdmVzIHNvdXJjZXNKYXIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiNTQzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGUucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitzb3VyY2VDb21wYXRpYmlsaXR5PTEuOAordGFyZ2V0Q29tcGF0aWJpbGl0eT0xLjgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTMyNjVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmUwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQ0KK2Rpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cw0KK3ppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FDQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMNCitkaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS00LjEwLjItYmluLnppcA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGV3IGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2dyYWRsZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NjZGQzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGV3LmJhdCBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGV3LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTU2NDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KK0ByZW0NCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MNCitAcmVtDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0ByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsDQorDQorc2V0IERJUk5BTUU9JX5kcDANCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uDQorc2V0IEFQUF9CQVNFX05BTUU9JX5uMA0KK3NldCBBUFBfSE9NRT0lRElSTkFNRSUNCisNCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lg0KK3NldCBERUZBVUxUX0pWTV9PUFRTPQ0KKw0KK0ByZW0gRmluZCBqYXZhLmV4ZQ0KK2lmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUNCisNCitzZXQgSkFWQV9FWEU9amF2YS5leGUNCislSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQ0KK2lmICIlRVJST1JMRVZFTCUiID09ICIwIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6ZmluZEphdmFGcm9tSmF2YUhvbWUNCitzZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lDQorc2V0IEpBVkFfRVhFPSVKQVZBX0hPTUUlL2Jpbi9qYXZhLmV4ZQ0KKw0KK2lmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6aW5pdA0KK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMNCisNCitpZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIHdpbjl4TUVfYXJncw0KKw0KKzp3aW45eE1FX2FyZ3MNCitAcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLg0KK3NldCBDTURfTElORV9BUkdTPQ0KK3NldCBfU0tJUD0yDQorDQorOndpbjl4TUVfYXJnc19zbHVycA0KK2lmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlDQorDQorc2V0IENNRF9MSU5FX0FSR1M9JSoNCisNCis6ZXhlY3V0ZQ0KK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQ0KKw0KK3NldCBDTEFTU1BBVEg9JUFQUF9IT01FJVxncmFkbGVcd3JhcHBlclxncmFkbGUtd3JhcHBlci5qYXINCisNCitAcmVtIEV4ZWN1dGUgR3JhZGxlDQorIiVKQVZBX0VYRSUiICVERUZBVUxUX0pWTV9PUFRTJSAlSkFWQV9PUFRTJSAlR1JBRExFX09QVFMlICItRG9yZy5ncmFkbGUuYXBwbmFtZT0lQVBQX0JBU0VfTkFNRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gJUNNRF9MSU5FX0FSR1MlDQorDQorOmVuZA0KK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kDQorDQorOmZhaWwNCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YNCityZW0gdGhlIF9jbWQuZXhlIC9jXyByZXR1cm4gY29kZSENCitpZiAgbm90ICIiID09ICIlR1JBRExFX0VYSVRfQ09OU09MRSUiIGV4aXQgMQ0KK2V4aXQgL2IgMQ0KKw0KKzptYWluRW5kDQoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwNCisNCis6b21lZ2ENCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc2V0dGluZ3MuZ3JhZGxlIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NldHRpbmdzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZThjZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxLDE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Jvb3RQcm9qZWN0Lm5hbWUgPSAnb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlJwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0Jhc2VBcHBsaWNhdGlvbkNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlQXBwbGljYXRpb25Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0ZWIwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlQXBwbGljYXRpb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLk1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuZmlsZS5GaWxlU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hTZXJ2aWNlOworCisvKioKKyAqIEJhc2UgYXBwbGljYXRpb24gY29udGV4dCByZXByZXNlbnRzIGEgY29ubmVjdGlvbi9zZXNzaW9uIHRvIHRoZSB1bmRlcmx5aW5nCisgKiBkYXRhIHN0b3JlLiBJdCBwcm92aWRlcyBhY2Nlc3MgdG8gbWFuYWdlcnMgYW5kIHNlcnZpY2VzLgorICoKKyAqIEBwYXJhbSA8Uz4gVHlwZSBvZiB0aGUgY29ubmVjdGVkIGVudGl0eSBmYWN0b3J5LgorICogQHBhcmFtIDxUPiBUeXBlIG9mIHRoZSBjb25uZWN0ZWQgZW50aXR5IG1hbmFnZXIuCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGludGVyZmFjZSBCYXNlQXBwbGljYXRpb25Db250ZXh0PFMgZXh0ZW5kcyBCYXNlRW50aXR5RmFjdG9yeSwgVCBleHRlbmRzIEJhc2VFbnRpdHlNYW5hZ2VyPgorCQlleHRlbmRzIEF1dG9DbG9zZWFibGUgeworCS8qKgorCSAqIFRoZSByZXR1cm5lZCBzZXJ2aWNlIGxvYWRzIGVudGl0aWVzIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2UuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgbm8gc3VjaCBzZXJ2aWNlIGlzIGF2YWlsYWJsZS4KKwkgKi8KKwlkZWZhdWx0IE9wdGlvbmFsPFQ+IGdldEVudGl0eU1hbmFnZXIoKSB7CisJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCX0KKworCS8qKgorCSAqIFRoZSByZXR1cm5lZCBzZXJ2aWNlIGNyZWF0ZXMgbmV3IGVudGl0aWVzLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIG5vIHN1Y2ggc2VydmljZSBpcyBhdmFpbGFibGUuCisJICovCisJZGVmYXVsdCBPcHRpb25hbDxTPiBnZXRFbnRpdHlGYWN0b3J5KCkgeworCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgcmV0dXJuZWQgc2VydmljZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFwcGxpY2F0aW9uIG1vZGVsJ3MgbWV0YSBkYXRhLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIG5vIHN1Y2ggc2VydmljZSBpcyBhdmFpbGFibGUuCisJICogQHNlZSBNb2RlbE1hbmFnZXIKKwkgKi8KKwlkZWZhdWx0IE9wdGlvbmFsPE1vZGVsTWFuYWdlcj4gZ2V0TW9kZWxNYW5hZ2VyKCkgeworCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgcmV0dXJuZWQgc2VydmljZSBwcm92aWRlcyBhZHZhbmNlZCBzZWFyY2ggY2FwYWJpbGl0aWVzIGZvciBzdXBwb3J0ZWQKKwkgKiBlbnRpdHkgdHlwZXMuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgbm8gc3VjaCBzZXJ2aWNlIGlzIGF2YWlsYWJsZS4KKwkgKiBAc2VlIFNlYXJjaFNlcnZpY2UKKwkgKi8KKwlkZWZhdWx0IE9wdGlvbmFsPFNlYXJjaFNlcnZpY2U+IGdldFNlYXJjaFNlcnZpY2UoKSB7CisJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCX0KKworCS8qKgorCSAqIFRoZSByZXR1cm5lZCBzZXJ2aWNlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbG93IGxldmVsIHF1ZXJ5IEFQSS4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBubyBzdWNoIHNlcnZpY2UgaXMgYXZhaWxhYmxlLgorCSAqIEBzZWUgUXVlcnlTZXJ2aWNlCisJICovCisJZGVmYXVsdCBPcHRpb25hbDxRdWVyeVNlcnZpY2U+IGdldFF1ZXJ5U2VydmljZSgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisJfQorCisJLyoqCisJICogVGhlIHJldHVybmVkIHNlcnZpY2UgYWxsb3dzIHRvIGRvd25sb2FkIGxpbmtlZCBmaWxlcyBmcm9tIHRoZSBmaWxlIHN0b3JhZ2UuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgbm8gc3VjaCBzZXJ2aWNlIGlzIGF2YWlsYWJsZS4KKwkgKiBAc2VlIEZpbGVTZXJ2aWNlCisJICovCisJZGVmYXVsdCBPcHRpb25hbDxGaWxlU2VydmljZT4gZ2V0RmlsZVNlcnZpY2UoKSB7CisJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCX0KKworCS8qKgorCSAqIFRoZSByZXR1cm5lZCBzZXJ2aWNlIGFsbG93cyB0byByZWdpc3Rlci91bnJlZ2lzdGVyIGZvciBldmVudHMgYXQgYQorCSAqIHJlZ2lzdHJhdGlvbiBzZXJ2aWNlLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIG5vIHN1Y2ggc2VydmljZSBpcyBhdmFpbGFibGUuCisJICogQHNlZSBOb3RpZmljYXRpb25TZXJ2aWNlCisJICovCisJZGVmYXVsdCBPcHRpb25hbDxOb3RpZmljYXRpb25TZXJ2aWNlPiBnZXROb3RpZmljYXRpb25TZXJ2aWNlKCkgeworCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbWFwIHdpdGggYWxsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycywgd2hpY2ggd2hlcmUgZ2l2ZW4gdG8KKwkgKiBpbml0aWFsaXplIHRoaXMgY29udGV4dC4KKwkgKiAKKwkgKiBAcmV0dXJuIG1hcCB3aXRoIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworCSAqLworCU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycygpOworCisJLyoqCisJICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIEFQSSBpbXBsZW1lbnRhdGlvbi4KKwkgKiBUaGUgZXhhY3QgY29udGVudCBpcyB1cCB0byB0aGUgaW5kaXZpZHVhbCBhZGFwdGVyIGFuZCBpdCBpcyBpbnRlbmRlZCB0byBiZQorCSAqIGludGVycHJldGVkIGJ5IHRoZSBjbGllbnQuCisJICogCisJICogQHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIEFQSSBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlTdHJpbmcgZ2V0QWRhcHRlclR5cGUoKTsKKworCS8qKgorCSAqIENsb3NlcyB0aGUgQmFzZUNvbnRleHQuCisJICogCisJICogVGhpcyBjbG9zZXMgYWxsIHVuZGVybHlpbmcgbWFuYWdlcnMgYW5kIHNlcnZpY2VzLgorCSAqLworCXZvaWQgY2xvc2UoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0Jhc2VBcHBsaWNhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlNWZlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHlGYWN0b3J5OworCisvKioKKyAqIFRha2VzIGNvbm5lY3Rpb24gcGFyYW1ldGVycyBhbmQgcHJvZHVjZXMgYSBjb3JyZXNwb25kaW5nIGJhc2UgYXBwbGljYXRpb24KKyAqIGNvbnRleHQuCisgKgorICogQHBhcmFtIDxUPiBUeXBlIG9mIHRoZSBjb25uZWN0ZWQgZW50aXR5IG1hbmFnZXIuCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGludGVyZmFjZSBCYXNlQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeTxUIGV4dGVuZHMgQmFzZUFwcGxpY2F0aW9uQ29udGV4dDw/IGV4dGVuZHMgQmFzZUVudGl0eUZhY3RvcnksID8gZXh0ZW5kcyBCYXNlRW50aXR5TWFuYWdlcj4+IHsKKworCS8qKgorCSAqIFRha2VzIGdpdmVuIGNvbm5lY3Rpb24gcGFyYW1ldGVycyBhbmQgY3JlYXRlcyBhIG5ldyBjb250ZXh0LCB3aGljaCBpcworCSAqIHBlcm1hbmVudGx5IGNvbm5lY3RlZCB3aXRoIGNvbmZpZ3VyZWQgZGF0YSBzb3VyY2UuCisJICoKKwkgKiBAcGFyYW0gY29ubmVjdGlvblBhcmFtZXRlcnMgVGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycy4KKwkgKiBAcmV0dXJuIFRoZSBjb25uZWN0ZWQgY29udGV4dCBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBjb25uZWN0IHRvIGEgZGF0YSBzb3VyY2UuCisJICovCisJVCBjb25uZWN0KE1hcDxTdHJpbmcsIFN0cmluZz4gY29ubmVjdGlvblBhcmFtZXRlcnMpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlRW50aXR5TWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0Jhc2VFbnRpdHlNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1YmRhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlRW50aXR5TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhLlJlYWRSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0RGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWVhc3VyZWRWYWx1ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworLyoqCisgKiBQcm92aWRlcyBidXNpbmVzcyBsYXllciBDUlVEIG9wZXJhdGlvbnMgYW5kIHNlcnZpY2VzIChDUkVBVEUsIFJFQUQsIFVQREFURSwKKyAqIElOU0VSVCkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmFzZUVudGl0eU1hbmFnZXIgeworCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudmlyb25tZW50fSB0aGlzIGVudGl0eSBtYW5hZ2VyIGlzIGNvbm5lY3RlZCB0by4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBFbnZpcm9ubWVudH0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIHtAY29kZQorCSAqIAkJRW52aXJvbm1lbnR9ICAgICAgICAuCisJICovCisJRW52aXJvbm1lbnQgbG9hZEVudmlyb25tZW50KCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVXNlcn0gd2hpY2ggd2FzIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgdW5kZXJseWluZyBkYXRhCisJICogc291cmNlLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHRoZSBkYXRhIHNvdXJjZSBjb25uZWN0aW9uIGlzIHVzZXIKKwkgKiAgICAgICAgIGluZGVwZW5kZW50LCB3aGljaCBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUge0Bjb2RlIFVzZXJ9LgorCSAqLworCWRlZmF1bHQgT3B0aW9uYWw8VXNlcj4gbG9hZExvZ2dlZE9uVXNlcigpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisJfQorCisJLyoqCisJICogTG9hZHMgdGhlIGVudGl0eSBpZGVudGlmaWVkIGJ5IGdpdmVuIGVudGl0eSBjbGFzcyBhbmQgaXRzIGluc3RhbmNlIElELgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIFRoZSBkZXNpcmVkIHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFR5cGUgb2YgdGhlIHJldHVybmVkIGVudGl0eS4KKwkgKiBAcGFyYW0gaW5zdGFuY2VJRCAgVGhlIGluc3RhbmNlIElELgorCSAqIEByZXR1cm4gVGhlIGVudGl0eSB3aXRoIGdpdmVuIGluc3RhbmNlIElEIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlbnRpdHkuCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gVCBsb2FkKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdHJpbmcgaW5zdGFuY2VJRCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMaXN0PFQ+IGVudGl0aWVzID0gbG9hZChlbnRpdHlDbGFzcywgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpbnN0YW5jZUlEKSk7CisJCWlmIChlbnRpdGllcy5zaXplKCkgIT0gMSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIGVudGl0eSBieSBpbnN0YW5jZSBJRC4iKTsKKwkJfQorCQlyZXR1cm4gZW50aXRpZXMuZ2V0KDApOworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSBlbnRpdGllcyBpZGVudGlmaWVkIGJ5IGdpdmVuIGVudGl0eSBjbGFzcyBhbmQgaXRzIGluc3RhbmNlIElEcy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdGllcy4KKwkgKiBAcGFyYW0gaW5zdGFuY2VJRHMgVGhlIGluc3RhbmNlIElEcyB0byBsb2FkLiBJZiBhIGluc3RhbmNlIElEIGRvZXMgbm90IGV4aXN0LAorCSAqICAgICAgICAgICAgICAgICAgICBpdCBpcyBpZ25vcmVkLgorCSAqIEByZXR1cm4gRW50aXRpZXMgYXJlIHJldHVybmVkIGluIGEgbGlzdC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZW50aXRpZXMuCisJICovCisJPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZChDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29sbGVjdGlvbjxTdHJpbmc+IGluc3RhbmNlSURzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIExvYWRzIGFsbCBhdmFpbGFibGUgZW50aXRpZXMgb2YgZ2l2ZW4gdHlwZS4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIHdoaWxlCisJICogd29ya2luZyB3aXRoIHR5cGVzIHdob3NlIGFtb3VudCBpcyBrbm93biB0byBiZSBmYWlybHkgc21hbGwgKGUuZy46CisJICoge0Bjb2RlIFVuaXR9LCB7QGNvZGUgUXVhbnRpdHl9LCBldGMuKS4gSWYgYSB0eXBlIGlzIGdpdmVuIHdoZXJlIHRob3VzYW5kCisJICogaW5zdGFuY2VzIGV4aXN0IChlLmcuOiB7QGNvZGUgVGVzdH0pIHRoZSBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcworCSAqIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLiBUaGUgZm9sbG93aW5nIGludm9jYXRpb24gbWlnaHQgdGFrZSBpdHMgdGltZSB0bworCSAqIGNvbXBsZXRlIG9yIGV2ZW4gcmVzdWx0IGluIGFuIGV4Y2VwdGlvbiBhcyBzb29uIGFzIHRvbyBtYW55IHJlc3VsdHMgYXJlCisJICogZm91bmQ6CisJICoKKwkgKiA8cHJlPgorCSAqIHsKKwkgKiAJJiM2NDtjb2RlCisJICogCUxpc3Q8VGVzdD4gdGVzdHMgPSBlbnRpdHlNYW5hZ2VyLmxvYWRBbGwoVGVzdC5jbGFzcyk7CisJICogfQorCSAqIDwvcHJlPgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIFRoZSBkZXNpcmVkIHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFR5cGUgb2YgdGhlIHJldHVybmVkIGVudGl0aWVzLgorCSAqIEByZXR1cm4gRW50aXRpZXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlbnRpdGllcy4KKwkgKiBAc2VlICNsb2FkQWxsKENsYXNzLCBTdHJpbmcpCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkQWxsKENsYXNzPFQ+IGVudGl0eUNsYXNzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBsb2FkQWxsKGVudGl0eUNsYXNzLCAiKiIpOworCX0KKworCS8qKgorCSAqIExvYWRzIGFsbCBhdmFpbGFibGUgZW50aXRpZXMgb2YgZ2l2ZW4gdHlwZSB3aG9zZSBuYW1lIGZ1bGZpbGxzIHRoZSBnaXZlbgorCSAqIHBhdHRlcm4uIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB3aGlsZSB3b3JraW5nIHdpdGggdHlwZXMgd2hvc2UgYW1vdW50IGlzIGtub3duCisJICogdG8gYmUgZmFpcmx5IHNtYWxsIChlLmcuOiB7QGNvZGUgVW5pdH0sIHtAY29kZSBRdWFudGl0eX0sIGV0Yy4pLiBJZiBhIHR5cGUgaXMKKwkgKiBnaXZlbiB3aGVyZSB0aG91c2FuZCBpbnN0YW5jZXMgZXhpc3QgKGUuZy46IHtAY29kZSBUZXN0fSkgdGhlIGJlaGF2aW9yIG9mCisJICogdGhpcyBtZXRob2QgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuIFRoZSBmb2xsb3dpbmcgaW52b2NhdGlvbiBtaWdodCB0YWtlCisJICogaXRzIHRpbWUgdG8gY29tcGxldGUgb3IgZXZlbiByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIGFzIHNvb24gYXMgdG9vIG1hbnkKKwkgKiByZXN1bHRzIGFyZSBmb3VuZDoKKwkgKgorCSAqIDxwcmU+CisJICogeworCSAqIAkmIzY0O2NvZGUKKwkgKiAJLy8gcmV0cmlldmUgYWxsIHRlc3RzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggJ0V4YW1wbGUnCisJICogCUxpc3Q8VGVzdD4gdGVzdHMgPSBlbnRpdHlNYW5hZ2VyLmxvYWRBbGwoVGVzdC5jbGFzcywgIkV4YW1wbGUqIik7CisJICogfQorCSAqIDwvcHJlPgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIFRoZSBkZXNpcmVkIHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFR5cGUgb2YgdGhlIHJldHVybmVkIGVudGl0aWVzLgorCSAqIEBwYXJhbSBwYXR0ZXJuICAgICBJcyBhbHdheXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkCisJICogICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgYXMgZm9sbG93czogIj8iIGZvciBvbmUgbWF0Y2hpbmcgY2hhcmFjdGVyIGFuZAorCSAqICAgICAgICAgICAgICAgICAgICAiKiIgZm9yIGEgc2VxdWVuY2Ugb2YgbWF0Y2hpbmcgY2hhcmFjdGVycy4KKwkgKiBAcmV0dXJuIE1hdGNoZWQgZW50aXRpZXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlbnRpdGllcy4KKwkgKiBAc2VlICNsb2FkQWxsKENsYXNzKQorCSAqLworCTxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWRBbGwoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIExvYWRzIHRoZSBwYXJlbnQgZW50aXR5IGZvciBnaXZlbiBjaGlsZC4gRWFjaCBtb2RlbGVkIGVudGl0eSBwcm92aWRlcyBwdWJsaWMKKwkgKiBmaWVsZHMgZm9yIGF2YWlsYWJsZSBwYXJlbnQgZW50aXR5IHR5cGVzIGUuZy46CisJICoKKwkgKiA8cHJlPgorCSAqIHsKKwkgKiAJJiM2NDtjb2RlCisJICogCU9wdGlvbmFsPFRlc3Q+IHBhcmVudFRlc3QgPSBlbnRpdHlNYW5hZ2VyLmxvYWRQYXJlbnQodGVzdFN0ZXAsIFRlc3RTdGVwLlBBUkVOVF9UWVBFX1RFU1QpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCBwYXJlbnQgdHlwZS4KKwkgKiBAcGFyYW0gY2hpbGQgICAgICAgVGhlIGNoaWxkIGVudGl0eS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVGhlIGRlc2lyZWQgcGFyZW50IGVudGl0eSB0eXBlLgorCSAqIEByZXR1cm4ge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBwYXJlbnQgZW50aXR5IGNvdWxkIG5vdCBiZSBmb3VuZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXRyaWV2ZSBwYXJlbnQgZW50aXR5LgorCSAqLworCTxUIGV4dGVuZHMgRW50aXR5PiBPcHRpb25hbDxUPiBsb2FkUGFyZW50KEVudGl0eSBjaGlsZCwgQ2xhc3M8VD4gZW50aXR5Q2xhc3MpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogTG9hZHMgYWxsIHJlbGF0ZWQgY2hpbGRyZW4gb2YgZ2l2ZW4gdHlwZSBmb3IgZ2l2ZW4gcGFyZW50IGVudGl0eS4gRWFjaAorCSAqIG1vZGVsZWQgZW50aXR5IHByb3ZpZGVzIHB1YmxpYyBmaWVsZHMgZm9yIGF2YWlsYWJsZSBjaGlsZCBlbnRpdHkgdHlwZXMgZS5nLjoKKwkgKgorCSAqIDxwcmU+CisJICogeworCSAqIAkmIzY0O2NvZGUKKwkgKiAJTGlzdDxDaGFubmVsPiBjaGFubmVscyA9IGVudGl0eU1hbmFnZXIubG9hZENoaWxkcmVuKG1lYXN1cmVtZW50LCBNZWFzdXJlbWVudC5DSElMRF9UWVBFX0NIQU5ORUwpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCBjaGlsZCB0eXBlLgorCSAqIEBwYXJhbSBwYXJlbnQgICAgICBUaGUgcGFyZW50IGVudGl0eS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVGhlIGRlc2lyZWQgY2hpbGQgZW50aXR5IHR5cGUuCisJICogQHJldHVybiBSZWxhdGVkIGNoaWxkIGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgY2hpbGRyZW4uCisJICogQHNlZSAjbG9hZENoaWxkcmVuKEVudGl0eSwgQ2xhc3MsIFN0cmluZykKKwkgKi8KKwlkZWZhdWx0IDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWRDaGlsZHJlbihFbnRpdHkgcGFyZW50LCBDbGFzczxUPiBlbnRpdHlDbGFzcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbG9hZENoaWxkcmVuKHBhcmVudCwgZW50aXR5Q2xhc3MsICIqIik7CisJfQorCisJLyoqCisJICogTG9hZHMgYWxsIHJlbGF0ZWQgY2hpbGRyZW4gb2YgZ2l2ZW4gdHlwZSBmb3IgZ2l2ZW4gcGFyZW50IGVudGl0eSB3aG9zZSBuYW1lCisJICogZnVsZmlsbHMgdGhlIGdpdmVuIHBhdHRlcm4uIEVhY2ggbW9kZWxlZCBlbnRpdHkgcHJvdmlkZXMgcHVibGljIGZpZWxkcyBmb3IKKwkgKiBhdmFpbGFibGUgY2hpbGQgZW50aXR5IHR5cGVzIGUuZy46CisJICoKKwkgKiA8cHJlPgorCSAqIHsKKwkgKiAJJiM2NDtjb2RlCisJICogCUxpc3Q8VGVzdFN0ZXA+IHRlc3RTdGVwcyA9IGVudGl0eU1hbmFnZXIubG9hZENoaWxkcmVuKHRlc3QsIFRlc3QuQ0hJTERfVFlQRV9URVNUU1RFUCwgIkV4YW1wbGUqIik7CisJICogfQorCSAqIDwvcHJlPgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIFRoZSBkZXNpcmVkIGNoaWxkIHR5cGUuCisJICogQHBhcmFtIHBhcmVudCAgICAgIFRoZSBwYXJlbnQgZW50aXR5LgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUaGUgZGVzaXJlZCBjaGlsZCBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gcGF0dGVybiAgICAgSXMgYWx3YXlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZAorCSAqICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6ICI/IiBmb3Igb25lIG1hdGNoaW5nIGNoYXJhY3RlciBhbmQKKwkgKiAgICAgICAgICAgICAgICAgICAgIioiIGZvciBhIHNlcXVlbmNlIG9mIG1hdGNoaW5nIGNoYXJhY3RlcnMuCisJICogQHJldHVybiBNYXRjaGVkIGNoaWxkIGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgY2hpbGRyZW4uCisJICogQHNlZSAjbG9hZENoaWxkcmVuKEVudGl0eSwgQ2xhc3MpCisJICovCisJPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZENoaWxkcmVuKEVudGl0eSBwYXJlbnQsIENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdHJpbmcgcGF0dGVybikKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogUXVlcmllcyBhdmFpbGFibGUge0BsaW5rIENvbnRleHRUeXBlfSBmb3IgZ2l2ZW4ge0BsaW5rIENvbnRleHREZXNjcmliYWJsZX0uCisJICoKKwkgKiBAcGFyYW0gY29udGV4dERlc2NyaWJhYmxlIEVpdGhlciBhIHtAbGluayBUZXN0U3RlcH0gb3IgYSB7QGxpbmsgTWVhc3VyZW1lbnR9CisJICogQHJldHVybiB7QGNvZGUgTGlzdH0gY29udGFpbnMgdGhlIHtAY29kZSBDb250ZXh0VHlwZX0gb2YgZWFjaCByZWZlcmVuY2VkCisJICogICAgICAgICB7QGxpbmsgQ29udGV4dFJvb3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHF1ZXJ5IHRoZSBhdmFpbGFibGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIENvbnRleHRUeXBlfXMuCisJICovCisJTGlzdDxDb250ZXh0VHlwZT4gbG9hZENvbnRleHRUeXBlcyhDb250ZXh0RGVzY3JpYmFibGUgY29udGV4dERlc2NyaWJhYmxlKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIExvYWRzIHRoZSByZXF1ZXN0ZWQge0BsaW5rIENvbnRleHRSb290fXMgZm9yIGdpdmVuCisJICoge0BsaW5rIENvbnRleHREZXNjcmliYWJsZX0uCisJICoKKwkgKiBAcGFyYW0gY29udGV4dERlc2NyaWJhYmxlIEVpdGhlciBhIHtAbGluayBUZXN0U3RlcH0gb3Ige0BsaW5rIE1lYXN1cmVtZW50fS4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGVzICAgICAgIFRoZSByZXF1ZXN0ZWQgY29udGV4dCB0eXBlcy4gSWYgb21pdHRlZCwgYWxsIHR5cGVzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYmUgbG9hZGVkLgorCSAqIEByZXR1cm4gVGhlIG9yZGVyZWQgY29udGV4dHMgZm9yIGdpdmVuIHtAY29kZSBUZXN0U3RlcH0gb3IgdGhlIG1lYXN1cmVkIG9uZXMKKwkgKiAgICAgICAgIGZvciB7QGNvZGUgTWVhc3VyZW1lbnR9IGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBNYXB9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSB7QGNvZGUKKwkgKiAJCUNvbnRleHRSb290fSAgICAgICAgcy4KKwkgKiBAc2VlIENvbnRleHRUeXBlCisJICovCisJTWFwPENvbnRleHRUeXBlLCBDb250ZXh0Um9vdD4gbG9hZENvbnRleHRzKENvbnRleHREZXNjcmliYWJsZSBjb250ZXh0RGVzY3JpYmFibGUsIENvbnRleHRUeXBlLi4uIGNvbnRleHRUeXBlcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogQHBhcmFtIGVudGl0eSAgICAgICBUaGUgZW50aXR5CisJICogQHBhcmFtIHJlbGF0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb24sIHdoaWNoIGVudGl0aWVzIHNob3VsZCBiZQorCSAqICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLgorCSAqIEBwYXJhbSByZWxhdGVkQ2xhc3MgQ2xhc3Mgb2YgdGhlIHJlbGF0ZWQgZW50aXRpZXMuCisJICogQHJldHVybiBUaGUgcmVsYXRlZCBlbnRpdGllcyBmb3IgdGhlIGdpdmVuIHtAbGluayBFbnRpdHl9IGFuZCByZWxhdGlvbk5hbWUKKwkgKi8KKwk8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkUmVsYXRlZEVudGl0aWVzKEVudGl0eSBlbnRpdHksIFN0cmluZyByZWxhdGlvbk5hbWUsIENsYXNzPFQ+IHJlbGF0ZWRDbGFzcyk7CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHtAbGluayBNZWFzdXJlZFZhbHVlc30gYXMgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbgorCSAqIHtAbGluayBSZWFkUmVxdWVzdH0uCisJICoKKwkgKiBAcGFyYW0gcmVhZFJlcXVlc3QgUHJvdmlkZXMgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9ucyB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUge0Bjb2RlIE1lYXN1cmVkVmFsdWVzfSBpbiBhIHtAY29kZSBMaXN0fSBhcyBzcGVjaWZpZWQgaW4KKwkgKiAgICAgICAgIHRoZSBnaXZlbiB7QGNvZGUgUmVhZFJlcXVlc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGFjY2VzcyB0aGUgbWVhc3VyZWQgdmFsdWVzLgorCSAqLworCUxpc3Q8TWVhc3VyZWRWYWx1ZXM+IHJlYWRNZWFzdXJlZFZhbHVlcyhSZWFkUmVxdWVzdCByZWFkUmVxdWVzdCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUcmFuc2FjdGlvbn0gZm9yIG1vZGlmeWluZyBhY2Nlc3MuCisJICoKKwkgKiBAcmV0dXJuIEEgbmV3IHtAY29kZSBUcmFuc2FjdGlvbn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gY3JlYXRlIGEgbmV3CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBUcmFuc2FjdGlvbn0uCisJICovCisJVHJhbnNhY3Rpb24gc3RhcnRUcmFuc2FjdGlvbigpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogUmV0dXJucyBsaW5rcyB0byB0aGUgZ2l2ZW4gZW50aXRpZXMgaW4gdGhlIGRhdGEgc3RvcmUuIFRoZSBmb3JtYXQgb2YgdGhlCisJICogbGlua3MgaXMgYWRhcHRlciBzcGVjaWZpYyBhbmQgZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlLiBUaGUgbGlua3MKKwkgKiBjYW4gYmUgdXNlZCBieSB0aGUgY2xpZW50IHRvIGRpcmVjdGx5IGFjY2VzcyB0aGUgZW50aXRpZXMgYnkgYnlwYXNzaW5nIHRoZQorCSAqIE1ETSBBUEksIGlmIHRoZSBjbGllbnQgaXMgY2FwYWJsZSBvZiBhY2Nlc3NpbmcgdGhlIGFkYXB0ZXJzIGRhdGEgc3RvcmUuIFRoZQorCSAqIGNsaWVudCBjYW4gaW52b2tlIHtAbGluayBCYXNlQXBwbGljYXRpb25Db250ZXh0I2dldEFkYXB0ZXJUeXBlKCl9IHRvIGdldCB0aGUKKwkgKiB0eXBlIG9mIHRoZSBhZGFwdGVyLgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdGllcyB0aGUgRW50aXRpZXMgZm9yIHdoaWNoIHRoZSBsaW5rcyBhcmUgcmV0cmlldmVkCisJICogQHJldHVybiB0aGUgbGlua3MgdG8gdGhlIGdpdmVuIGVudGl0aWVzIGluIHRoZSBkYXRhIHN0b3JlIGFic3RyYWN0ZWQgYnkgdGhlCisJICogICAgICAgICBjdXJyZW50IGFkYXB0ZXIuIFRoZSBtYXAgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBlbnRpdGllcyBhcyBrZXlzIGFuZAorCSAqICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgbGlua3MgYXMgdmFsdWVzLgorCSAqLworCU1hcDxFbnRpdHksIFN0cmluZz4gZ2V0TGlua3MoQ29sbGVjdGlvbjxFbnRpdHk+IGVudGl0aWVzKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9Db25uZWN0aW9uRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTRjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKKy8qKgorICogVGhyb3duIHRvIGluZGljYXRlIChkaXMtKWNvbm5lY3QgZXJyb3JzIHdpdGggYSBkYXRhIHNvdXJjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIENvbm5lY3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMjk5Njg1NzA1MTg2NDg0OTcyTDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBDb25uZWN0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1lc3NhZ2UgICBUaGUgZXJyb3IgbWVzc2FnZS4KKwkgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBvcmlnaW4gY2F1c2UuCisJICovCisJcHVibGljIENvbm5lY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKwkJc3VwZXIobWVzc2FnZSwgdGhyb3dhYmxlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9TZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9TZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjBhNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL1NlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gaW5kaWNhdGVzIHRoYXQgYSBzZXJ2aWNlIGlzIG5vdCBwcm92aWRlZCBieSBhbiBhZGFwdGVyLgorICovCitwdWJsaWMgY2xhc3MgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDgyOTYxODAzNjk1ODkyOTQxNUw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjbGF6eiB0aGUgc2VydmljZSB0aGF0IGlzIG5vdCBwcm92aWRlZAorCSAqLworCXB1YmxpYyBTZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24oQ2xhc3M8Pz4gY2xhenopIHsKKwkJc3VwZXIoIlRoZSBzZXJ2aWNlICciICsgY2xhenogKyAiJyBpcyBub3QgaW1wbGVtZW50ZWQhIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL1RyYW5zYWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvVHJhbnNhY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZiMzcwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL1RyYW5zYWN0aW9uLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhLldyaXRlUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVkVmFsdWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworCisvKioKKyAqIFByb3ZpZGVzIGJ1c2luZXNzIGxheWVyIHdyaXRlIG9wZXJhdGlvbnMgKENSRUFURSwgVVBEQVRFLCBERUxFVEUpLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYW5zYWN0aW9uIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vIFRPRE86IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhIGF0dGFjaCBhIGxpc3RlbmVyCisJLy8gLT4gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uIHVwZGF0ZXMgd2hpbGUgdXBsb2FkaW5nIGZpbGVzCisJLy8gLT4gYW55IG90aGVyIHVzZWZ1bCBpbmZvcm1hdGlvbnM/IQorCisJLyoqCisJICogUGVyc2lzdHMgZ2l2ZW4gZW50aXRpZXMgYW5kIGltcGxpY2l0bHkgdXBkYXRlcyB0aGVpciBpbnN0YW5jZSBJRHMuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgTW9zdCBjb21tb24gdHlwZSBvZiB0aGUgZ2l2ZW4gZW50aXRpZXMuCisJICogQHBhcmFtIGVudGl0aWVzIEVudGl0aWVzIHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSB3cml0aW5nIGVudGl0aWVzLgorCSAqLworCTxUIGV4dGVuZHMgRW50aXR5PiB2b2lkIGNyZWF0ZShDb2xsZWN0aW9uPFQ+IGVudGl0aWVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIFVwZGF0ZXMgZ2l2ZW4gZW50aXRpZXMuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgTW9zdCBjb21tb24gdHlwZSBvZiB0aGUgZ2l2ZW4gZW50aXRpZXMuCisJICogQHBhcmFtIGVudGl0aWVzIEVudGl0aWVzIHRoYXQgd2lsbCBiZSB1cGRhdGVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgd3JpdGluZyBlbnRpdGllcy4KKwkgKi8KKwk8VCBleHRlbmRzIEVudGl0eT4gdm9pZCB1cGRhdGUoQ29sbGVjdGlvbjxUPiBlbnRpdGllcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBEZWxldGVzIGdpdmVuIGVudGl0aWVzLiBSZWxhdGVkIGNoaWxkcmVuIHdpbGwgYmUgc2VhcmNoZWQgYW5kIGF1dG9tYXRpY2FsbHkKKwkgKiByZW1vdmVkLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgIE1vc3QgY29tbW9uIHR5cGUgb2YgdGhlIGdpdmVuIGVudGl0aWVzLgorCSAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllcyB0aGF0IHdpbGwgYmUgZGVsZXRlZCAoaW5jbHVkaW5nIHRoZWlyIGNoaWxkcmVuKS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGRlbGV0aW5nIGVudGl0aWVzLgorCSAqLworCTxUIGV4dGVuZHMgRGVsZXRhYmxlPiB2b2lkIGRlbGV0ZShDb2xsZWN0aW9uPFQ+IGVudGl0aWVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIENyZWF0ZXMge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSBhcyBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuCisJICoge0BsaW5rIFdyaXRlUmVxdWVzdH1zLgorCSAqCisJICogQHBhcmFtIHdyaXRlUmVxdWVzdHMgUHJvdmlkZXMgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9ucyB0byBwcm9jZXNzIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gY3JlYXRlIHNwZWNpZmllZCBtZWFzdXJlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuCisJICovCisJdm9pZCB3cml0ZU1lYXN1cmVkVmFsdWVzKENvbGxlY3Rpb248V3JpdGVSZXF1ZXN0PiB3cml0ZVJlcXVlc3RzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIENvbW1pdCB0aGlzIHRyYW5zYWN0aW9uLiBBbnkgY2hhbmdlcyBtYWRlIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uIGJlY29tZQorCSAqIHBlcm1hbmVudC4KKwkgKgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGNvbW1pdCB0aGlzIHRyYW5zYWN0aW9uLgorCSAqLworCXZvaWQgY29tbWl0KCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBBYm9ydHMgKHJvbGxiYWNrKSB0aGlzIHRyYW5zYWN0aW9uLiBBbnkgY2hhbmdlcyBtYWRlIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uCisJICogd2lsbCBiZSBsb3N0LgorCSAqLworCXZvaWQgYWJvcnQoKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9BdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjkxNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBtb2RlbGVkIGF0dHJpYnV0ZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgRW50aXR5VHlwZQorICogQHNlZSBWYWx1ZVR5cGUKKyAqIEBzZWUgVmFsdWUKKyAqLworcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eVR5cGV9IHRoaXMgYXR0cmlidXRlIGJlbG9uZ3MgdG8uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBvd25pbmcge0Bjb2RlIEVudGl0eVR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCUVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHVuaXQgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHVuaXQgbmFtZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlTdHJpbmcgZ2V0VW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFZhbHVlVHlwZX0gb2YgdGhpcyBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgVmFsdWVUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlWYWx1ZVR5cGUgZ2V0VmFsdWVUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBlbnVtZXJhdGlvbiB7QGNvZGUgQ2xhc3N9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBBdHRyaWJ1dGV9LgorCSAqCisJICogQHJldHVybiBUaGUgZW51bWVyYXRpb24ge0Bjb2RlIENsYXNzfSBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQXR0cmlidXRlfQorCSAqICAgICAgICAgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIGlmIHRoZSB7QGxpbmsgVmFsdWVUeXBlfSBvZiB0aGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEF0dHJpYnV0ZX0gaXMgbmVpdGhlcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBWYWx1ZVR5cGUjRU5VTUVSQVRJT059IG5vcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBWYWx1ZVR5cGUjRU5VTUVSQVRJT05fU0VRVUVOQ0V9LgorCSAqLworCUVudW1lcmF0aW9uPD8+IGdldEVudW1PYmooKTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYW5kIGVtcHR5IHtAbGluayBWYWx1ZX0uCisJICoKKwkgKiBAcmV0dXJuIENyZWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFZhbHVlIGNyZWF0ZVZhbHVlKCkgeworCQlWYWx1ZVR5cGUgdmFsdWVUeXBlID0gZ2V0VmFsdWVUeXBlKCk7CisJCWlmICh2YWx1ZVR5cGUuaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJcmV0dXJuIHZhbHVlVHlwZS5jcmVhdGUoZ2V0RW51bU9iaigpLCBnZXROYW1lKCkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHZhbHVlVHlwZS5jcmVhdGUoZ2V0TmFtZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFZhbHVlfSB3aXRoIGdpdmVuIGluaXRpYWwgdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIGluaXRpYWwgdmFsdWUuCisJICogQHJldHVybiBDcmVhdGVkIHtAY29kZSBWYWx1ZX0gaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBWYWx1ZSBjcmVhdGVWYWx1ZShPYmplY3QgaW5wdXQpIHsKKwkJcmV0dXJuIGNyZWF0ZVZhbHVlKCIiLCBpbnB1dCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVmFsdWV9IHdpdGggZ2l2ZW4gdW5pdCBuYW1lIGFuZCBpbml0aWFsIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHVuaXQgIFRoZSBuYW1lIG9mIHVuaXQuCisJICogQHBhcmFtIGlucHV0IFRoZSBpbml0aWFsIHZhbHVlLgorCSAqIEByZXR1cm4gQ3JlYXRlZCB7QGNvZGUgVmFsdWV9IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgVmFsdWUgY3JlYXRlVmFsdWUoU3RyaW5nIHVuaXQsIE9iamVjdCBpbnB1dCkgeworCQlyZXR1cm4gY3JlYXRlVmFsdWUodW5pdCwgdHJ1ZSwgaW5wdXQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgc2VxdWVuY2Uge0BsaW5rIFZhbHVlfSB3aXRoIGdpdmVuIHVuaXQgbmFtZSBhbmQgaW5pdGlhbCB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB1bml0ICBUaGUgbmFtZSBvZiB1bml0LgorCSAqIEBwYXJhbSBpbnB1dCBUaGUgaW5pdGlhbCB2YWx1ZS4KKwkgKiBAcmV0dXJuIENyZWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFZhbHVlIGNyZWF0ZVZhbHVlU2VxKFN0cmluZyB1bml0LCBPYmplY3QgaW5wdXQpIHsKKwkJaWYgKGdldFZhbHVlVHlwZSgpLmlzRW51bWVyYXRpb25UeXBlKCkpIHsKKwkJCXJldHVybiBjcmVhdGVFbnVtZXJhdGlvblNlcXVlbmNlKHVuaXQsIGlucHV0KTsKKwkJfQorCQlyZXR1cm4gY3JlYXRlVmFsdWVTZXF1ZW5jZSh1bml0LCBpbnB1dCk7CisJfQorCisJZGVmYXVsdCBWYWx1ZSBjcmVhdGVWYWx1ZVNlcXVlbmNlKFN0cmluZyB1bml0LCBPYmplY3QgaW5wdXQpIHsKKwkJVmFsdWVUeXBlIHZhbHVlVHlwZSA9IGdldFZhbHVlVHlwZSgpOworCQl0cnkgeworCQkJRmllbGQgZmllbGQgPSB2YWx1ZVR5cGUuZ2V0Q2xhc3MoKS5nZXRGaWVsZCh2YWx1ZVR5cGUubmFtZSgpICsgIl9TRVFVRU5DRSIpOworCQkJVmFsdWVUeXBlPD8+IHNlcXVlbmNlVmFsdWVUeXBlID0gKFZhbHVlVHlwZTw/PikgZmllbGQuZ2V0KHZhbHVlVHlwZSk7CisJCQlyZXR1cm4gc2VxdWVuY2VWYWx1ZVR5cGUuY3JlYXRlKGdldE5hbWUoKSwgdW5pdCwgdHJ1ZSwgaW5wdXQpOworCisJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIHwgQ2xhc3NDYXN0RXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgZmlndXJlIG91dCBzZXF1ZW5jZSB0eXBlIGZvciAiICsgdmFsdWVUeXBlLm5hbWUoKSk7CisJCX0KKwl9CisKKwlkZWZhdWx0IFZhbHVlIGNyZWF0ZUVudW1lcmF0aW9uU2VxdWVuY2UoU3RyaW5nIHVuaXQsIE9iamVjdCBpbnB1dCkgeworCQlWYWx1ZVR5cGUgdmFsdWVUeXBlID0gZ2V0VmFsdWVUeXBlKCkudG9TZXF1ZW5jZVR5cGUoKTsKKwkJcmV0dXJuIHZhbHVlVHlwZS5jcmVhdGUoZ2V0TmFtZSgpLCB1bml0LCB0cnVlLCBpbnB1dCwgZ2V0RW51bU9iaigpLmdldE5hbWUoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVmFsdWV9IHdpdGggZ2l2ZW4gdW5pdCBuYW1lLCBpbml0aWFsIHZhbGlkIGZsYWcgYW5kCisJICogdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdW5pdCAgVGhlIG5hbWUgb2YgdW5pdC4KKwkgKiBAcGFyYW0gdmFsaWQgVGhlIGluaXRpYWwgdmFsaWQgZmxhZy4KKwkgKiBAcGFyYW0gaW5wdXQgVGhlIGluaXRpYWwgdmFsdWUuCisJICogQHJldHVybiBDcmVhdGVkIHtAY29kZSBWYWx1ZX0gaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBWYWx1ZSBjcmVhdGVWYWx1ZShTdHJpbmcgdW5pdCwgYm9vbGVhbiB2YWxpZCwgT2JqZWN0IGlucHV0KSB7CisJCVZhbHVlVHlwZTw/PiB2YWx1ZVR5cGUgPSBnZXRWYWx1ZVR5cGUoKTsKKwkJaWYgKHZhbHVlVHlwZS5pc0VudW1lcmF0aW9uVHlwZSgpKSB7CisJCQlyZXR1cm4gdmFsdWVUeXBlLmNyZWF0ZShnZXROYW1lKCksIHVuaXQsIHZhbGlkLCBpbnB1dCwgZ2V0RW51bU9iaigpLmdldE5hbWUoKSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdmFsdWVUeXBlLmNyZWF0ZShnZXROYW1lKCksIHVuaXQsIHZhbGlkLCBpbnB1dCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlTdHJpbmcgdG9TdHJpbmcoKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvQ2hpbGRyZW5TdG9yZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvQ2hpbGRyZW5TdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDExYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9DaGlsZHJlblN0b3JlLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworCisvKioKKyAqIEhvbGRzIHJlbGF0ZWQgZW50aXRpZXMgb2YgYW55IGtpbmQgYW5kIGtlZXBzIHRyYWNrIG9mIG1vZGlmaWNhdGlvbnMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDaGlsZHJlblN0b3JlIHsKKworCXByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBEZWxldGFibGU+LCBMaXN0PD8gZXh0ZW5kcyBEZWxldGFibGU+PiBjdXJyZW50ID0gbmV3IEhhc2hNYXA8PigwKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgRGVsZXRhYmxlPiwgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gcmVtb3ZlZCA9IG5ldyBIYXNoTWFwPD4oMCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGN1cnJlbnQgc2V0IG9mIHJlbGF0ZWQgY2hpbGRyZW4gbWFwcGVkIGJ5IHRoZWlyIHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybmVkIHtAY29kZSBNYXB9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTWFwPENsYXNzPD8gZXh0ZW5kcyBEZWxldGFibGU+LCBMaXN0PD8gZXh0ZW5kcyBEZWxldGFibGU+PiBnZXRDdXJyZW50KCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGN1cnJlbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgY3VycmVudCBzZXQgb2YgcmVtb3ZlZCByZWxhdGVkIGNoaWxkcmVuIG1hcHBlZCBieSB0aGVpciB0eXBlLgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTWFwfSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIE1hcDxDbGFzczw/IGV4dGVuZHMgRGVsZXRhYmxlPiwgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gZ2V0UmVtb3ZlZCgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZW1vdmVkKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHJlbGF0ZWQgY2hpbGQgZW50aXRpZXMgb2YgZ2l2ZW4gdHlwZS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBEZXNpcmVkIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyA8VCBleHRlbmRzIERlbGV0YWJsZT4gTGlzdDxUPiBnZXQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKExpc3Q8VD4pIGN1cnJlbnQuY29tcHV0ZUlmQWJzZW50KGVudGl0eUNsYXNzLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKSk7CisJfQorCisJLyoqCisJICogU29ydHMgdGhlIGNoaWxkIGVudGl0aWVzIHdpdGggZ2l2ZW4ge0Bjb2RlIENvbXBhcmF0b3J9LgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIERlc2lyZWQgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gY29tcGFyYXRvciAgVXNlZCBmb3Igc29ydGluZy4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQgZXh0ZW5kcyBEZWxldGFibGU+IHZvaWQgc29ydChDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGNvbXBhcmF0b3IpIHsKKwkJTGlzdDxUPiBjaGlsZHJlbiA9IChMaXN0PFQ+KSBjdXJyZW50LmdldChlbnRpdHlDbGFzcyk7CisJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisJCQljaGlsZHJlbi5zb3J0KGNvbXBhcmF0b3IpOworCQl9CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiBjaGlsZCBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gY2hpbGQgVGhlIG5ldyBjaGlsZC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgdm9pZCBhZGQoRGVsZXRhYmxlIGNoaWxkKSB7CisJCXJlbW92ZWQuZ2V0T3JEZWZhdWx0KGNoaWxkLmdldENsYXNzKCksIG5ldyBBcnJheUxpc3Q8PigpKS5yZW1vdmUoY2hpbGQpOworCQkoKExpc3Q8RGVsZXRhYmxlPikgY3VycmVudC5jb21wdXRlSWZBYnNlbnQoY2hpbGQuZ2V0Q2xhc3MoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkpLmFkZChjaGlsZCk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyBnaXZlbiBjaGlsZCBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gY2hpbGQgVGhlIGNoaWxkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgdm9pZCByZW1vdmUoRGVsZXRhYmxlIGNoaWxkKSB7CisJCUxpc3Q8RGVsZXRhYmxlPiBjaGlsZHJlbiA9IChMaXN0PERlbGV0YWJsZT4pIGN1cnJlbnQuZ2V0T3JEZWZhdWx0KGNoaWxkLmdldENsYXNzKCksIG5ldyBBcnJheUxpc3Q8PigpKTsKKwkJaWYgKGNoaWxkcmVuLnJlbW92ZShjaGlsZCkgJiYgY2hpbGQuZ2V0SUQoKSAhPSBudWxsICYmIGNoaWxkLmdldElEKCkubGVuZ3RoKCkgPiAwKSB7CisJCQkoKExpc3Q8RGVsZXRhYmxlPikgcmVtb3ZlZC5jb21wdXRlSWZBYnNlbnQoY2hpbGQuZ2V0Q2xhc3MoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkpLmFkZChjaGlsZCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDbGVhbiB1cCBsaXN0IG9mIHJlbW92ZWQgZW50aXRpZXMuCisJICovCisJdm9pZCBhcHBseSgpIHsKKwkJcmVtb3ZlZC5jbGVhcigpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0NvcmUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0NvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTllYjMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvQ29yZS5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmlsZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaW50ZXJuYWxzIG9mIGFueSBlbnRpdHk6CisgKgorICogPHVsPgorICogPGxpPm5hbWUgb2YgdGhlIGRhdGEgc291cmNlPC9saT4KKyAqIDxsaT5uYW1lIG9mIHRoZSB0eXBlPC9saT4KKyAqIDxsaT5pbnN0YW5jZSBJRDwvbGk+CisgKiA8bGk+dmFsdWVzPC9saT4KKyAqIDxsaT5hZGRlZC9yZW1vdmVkIGZpbGUgbGlua3M8L2xpPgorICogPGxpPnJlbGF0ZWQgZW50aXRpZXM8L2xpPgorICogPGxpPnBhcmVudC9jaGlsZCBlbnRpdGllczwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIENvcmUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBlbnRpdHkgd2FzIHJldHJpZXZlZCBmcm9tLgorCSAqCisJICogQHJldHVybiBOYW1lIG9mIHRoZSBkYXRhIHNvdXJjZS4KKwkgKi8KKwlTdHJpbmcgZ2V0U291cmNlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW50aXR5IHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlIGlzIHJldHVybmVkLgorCSAqLworCVN0cmluZyBnZXRUeXBlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5zdGFuY2UgSUQgb3Ige0Bjb2RlIDB9IGlmIHRoaXMgaW5zdGFuY2UgaXMgbm90IHlldCBwZXJzaXN0ZWQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBJRCBpcyByZXR1cm5lZC4KKwkgKi8KKwlTdHJpbmcgZ2V0SUQoKTsKKworCS8qKgorCSAqIFNldHMgYW4gaW5zdGFuY2UgSUQuCisJICoKKwkgKiBAcGFyYW0gaW5zdGFuY2VJRCBUaGUgbmV3IGluc3RhbmNlIElELgorCSAqLworCXZvaWQgc2V0SUQoU3RyaW5nIGluc3RhbmNlSUQpOworCisJLyoqCisJICogUmV0dXJucyA8aT5hbGw8L2k+IHtAbGluayBWYWx1ZX0gY29udGFpbmVycyBvZiB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVmFsdWVzIG1hcHBlZCBieSB0aGVpciBuYW1lIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlNYXA8U3RyaW5nLCBWYWx1ZT4gZ2V0VmFsdWVzKCk7CisKKwkvKioKKwkgKiBIaWRlcyB7QGxpbmsgVmFsdWV9IGNvbnRhaW5lcnMgd2hvc2UgbmFtZSBpcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIG5hbWVzCisJICoge0Bjb2RlIENvbGxlY3Rpb259LiBFLmcuIGhpZGUgYXR0cmlidXRlcyBmcm9tIGEgQ2F0YWxvZ0NvbXBvbmVudCB3aGVuIG5vdAorCSAqIHVzZWQgaW4gYSBUZW1wbGF0ZUNvbXBvbmVudC4KKwkgKgorCSAqIEBwYXJhbSBuYW1lcyBOYW1lcyBvZiB0aGUge0Bjb2RlIFZhbHVlfSB3aGljaCBzaGFsbCBiZSBoaWRkZW4uCisJICovCisJdm9pZCBoaWRlVmFsdWVzKENvbGxlY3Rpb248U3RyaW5nPiBuYW1lcyk7CisKKwkvKioKKwkgKiBSZXR1cm5zIDxpPmFsbDwvaT4ge0BsaW5rIFZhbHVlfSBjb250YWluZXJzLCBpbmNsdWRpbmcgdGhlIGhpZGRlbiBvbmVzLgorCSAqCisJICogQHJldHVybiBBbGwge0Bjb2RlIFZhbHVlfSBjb250YWluZXJzIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlNYXA8U3RyaW5nLCBWYWx1ZT4gZ2V0QWxsVmFsdWVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBuZXdseSBhZGRlZCB7QGxpbmsgRmlsZUxpbmt9LgorCSAqCisJICogQHJldHVybiBOZXcge0Bjb2RlIEZpbGVMaW5rfXMgYXJlIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgTGlzdDxGaWxlTGluaz4gZ2V0QWRkZWRGaWxlTGlua3MoKSB7CisJCVByZWRpY2F0ZTxGaWxlTGluaz4gaXNSZW1vdGUgPSBGaWxlTGluazo6aXNSZW1vdGU7CisKKwkJTGlzdDxGaWxlTGluaz4gZmlsZUxpbmtzID0gZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKHYgLT4gdi5nZXRWYWx1ZVR5cGUoKS5pc0ZpbGVMaW5rKCkpCisJCQkJLmZpbHRlcihWYWx1ZTo6aXNWYWxpZCkubWFwKHYgLT4gKEZpbGVMaW5rKSB2LmV4dHJhY3QoKSkuZmlsdGVyKGlzUmVtb3RlLm5lZ2F0ZSgpKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisJCUxpc3Q8VmFsdWU+IHZhbHVlcyA9IGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLmZpbHRlcih2IC0+IHYuZ2V0VmFsdWVUeXBlKCkuaXNGaWxlTGlua1NlcXVlbmNlKCkpCisJCQkJLmZpbHRlcihWYWx1ZTo6aXNWYWxpZCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlmb3IgKFZhbHVlIHZhbHVlIDogdmFsdWVzKSB7CisJCQlBcnJheXMuc3RyZWFtKChGaWxlTGlua1tdKSB2YWx1ZS5leHRyYWN0KCkpLmZpbHRlcihpc1JlbW90ZS5uZWdhdGUoKSkuZm9yRWFjaChmaWxlTGlua3M6OmFkZCk7CisJCX0KKworCQlyZXR1cm4gZmlsZUxpbmtzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIHJlbW92ZWQge0BsaW5rIEZpbGVMaW5rfXMuCisJICoKKwkgKiBAcmV0dXJuIFJlbW92ZWQge0Bjb2RlIEZpbGVMaW5rfXMgYXJlIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgTGlzdDxGaWxlTGluaz4gZ2V0UmVtb3ZlZEZpbGVMaW5rcygpIHsKKwkJUHJlZGljYXRlPEZpbGVMaW5rPiBpc1JlbW90ZSA9IEZpbGVMaW5rOjppc1JlbW90ZTsKKworCQlMaXN0PEZpbGVMaW5rPiBmaWxlTGlua3MgPSBnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIodiAtPiB2LmdldFZhbHVlVHlwZSgpLmlzRmlsZUxpbmsoKSkKKwkJCQkuZmlsdGVyKFZhbHVlOjppc01vZGlmaWVkKS5tYXAodiAtPiAoRmlsZUxpbmspIHYuZXh0cmFjdEluaXRpYWwoKSkuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpCisJCQkJLmZpbHRlcihpc1JlbW90ZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PFZhbHVlPiB2YWx1ZXMgPSBnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIodiAtPiB2LmdldFZhbHVlVHlwZSgpLmlzRmlsZUxpbmtTZXF1ZW5jZSgpKQorCQkJCS5maWx0ZXIoVmFsdWU6Ondhc1ZhbGlkKS5maWx0ZXIoVmFsdWU6OmlzTW9kaWZpZWQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJZm9yIChWYWx1ZSB2YWx1ZSA6IHZhbHVlcykgeworCQkJTGlzdDxGaWxlTGluaz4gY3VycmVudCA9IEFycmF5cy5hc0xpc3QoKEZpbGVMaW5rW10pIHZhbHVlLmV4dHJhY3QoKSk7CisJCQlBcnJheXMuc3RyZWFtKChGaWxlTGlua1tdKSB2YWx1ZS5leHRyYWN0SW5pdGlhbCgpKS5maWx0ZXIoZmwgLT4gIWN1cnJlbnQuY29udGFpbnMoZmwpKQorCQkJCQkuZm9yRWFjaChmaWxlTGlua3M6OmFkZCk7CisJCX0KKworCQlyZXR1cm4gZmlsZUxpbmtzOworCX0KKworCS8qKgorCSAqIEFwcGxpZXMgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZSBlbnRpdHkgc3RvcmVzIGFuZCB7QGxpbmsgVmFsdWV9IGNvbnRhaW5lcnMuCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSB0cmFuc2FjdGlvbiBpcyBmaW5hbGl6ZWQgKGFsbCBvcGVyYXRpb25zCisJICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseSkgdG8gcmVmbGVjdCB0aGUgbmV3IHN0YXRlIGluIHRoZSBjb3JlLgorCSAqLworCWRlZmF1bHQgdm9pZCBhcHBseSgpIHsKKwkJLy8gYXBwbHkgdGhlIHJlbW92ZWQgc3RhdGUgdG8gbXV0YWJsZSBlbnRpdGllcworCQlnZXRNdXRhYmxlU3RvcmUoKS5hcHBseSgpOworCisJCS8vIGFwcGx5IHRoZSByZW1vdmVkIHN0YXRlIHRvIGNoaWxkcmVuCisJCWdldENoaWxkcmVuU3RvcmUoKS5hcHBseSgpOworCisJCS8vIGFwcGx5IG1vZGlmaWVkIHZhbHVlcworCQlnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIoVmFsdWU6OmlzTW9kaWZpZWQpLmZvckVhY2goVmFsdWU6OmFwcGx5KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtdXRhYmxlIHtAbGluayBFbnRpdHlTdG9yZX0uIEhvbGRzIGVudGl0aWVzIHdpdGggbXV0YWJsZQorCSAqIChlZGl0YWJsZSkgcmVsYXRpb25zIHRvIHRoZSBlbnRpdHkgYm91bmQgdG8gdGhpcyBjb3JlIGluc3RhbmNlLiBUaGlzIHN0b3JlCisJICogb25seSBjb250YWlucyBhbHdheXMgb25seSBvbmUgcmVsYXRpb24gZm9yIG9uZSBlbnRpdHkuIEZvciBjaGlsZCByZWxhdGlvbnMKKwkgKiB1c2Uge0BsaW5rIENoaWxkcmVuU3RvcmV9LgorCSAqCisJICogQHJldHVybiBUaGUgbXV0YWJsZSB7QGNvZGUgRW50aXR5U3RvcmV9IGlzIHJldHVybmVkLgorCSAqLworCUVudGl0eVN0b3JlIGdldE11dGFibGVTdG9yZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGVybWFuZW50IHtAbGluayBFbnRpdHlTdG9yZX0uIEhvbGRzIGVudGl0aWVzIHdpdGggaW1tdXRhYmxlCisJICogKG5vbi1lZGl0YWJsZSkgcmVsYXRpb25zIHRvIHRoZSBlbnRpdHkgYm91bmQgdG8gdGhpcyBjb3JlIGluc3RhbmNlLiBFLmcuCisJICogcmVsYXRpb25zIHRvIHRoZSBwYXJlbnQgZW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUgcGVybWFuZW50IHtAY29kZSBFbnRpdHlTdG9yZX0gaXMgcmV0dXJuZWQuCisJICovCisJRW50aXR5U3RvcmUgZ2V0UGVybWFuZW50U3RvcmUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBDaGlsZHJlblN0b3JlfS4gVGhpcyBzdG9yZSBob2xkcyBjaGlsZCBlbnRpdGllcyB3aXRoCisJICogcmVsYXRpb25zIHRvIHRoZSBlbnRpdHkgYm91bmQgdG8gdGhpcyBjb3JlIGluc3RhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBDaGlsZHJlblN0b3JlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwkvLyBUT0RPICg4LjExLjIwMTc7IEZsb3JpYW4gU2NobWl0dCwgQW5nZWxpa2EgV2l0dGVrKQorCS8vIEVudGl0aWVzIHdpdGggbW9yZSB0aGFuIG9uZSByZWxhdGVkIGVudGl0eSB0aGF0IGRvIG5vdCByZWZlciB0byBjaGlsZHJlbiwKKwkvLyBoYXZlIGFsc28gdG8gZ28gaGVyZSwKKwkvLyBhcyBpdCBpcyBub3QgcGVybWl0dGVkIHRvIGdvIHRvIHRoZSBvdGhlciBzdG9yZXMuIERvZXMgdGhpcyB3b3JrIGF0IGFsbD8KKwlDaGlsZHJlblN0b3JlIGdldENoaWxkcmVuU3RvcmUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBSZWxhdGlvblN0b3JlfS4gVGhpcyBzdG9yZSBob2xkcyByZWxhdGVkIGVudGl0aWVzIGZvciBOIHRvCisJICogTSByZWxhdGlvbnMuCisJICogCisJICogQHJldHVybiBUaGUge0BsaW5rIFJlbGF0aW9uU3RvcmV9IGlzIHJldHVybmVkCisJICovCisJUmVsYXRpb25TdG9yZSBnZXROdG9NU3RvcmUoKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvRGVmYXVsdENvcmUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0RlZmF1bHRDb3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxZTEzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0RlZmF1bHRDb3JlLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVjb3JkOworCisvKioKKyAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaW50ZXJuYWxzIG9mIGFueSBlbnRpdHk6CisgKgorICogPHVsPgorICogPGxpPm5hbWUgb2YgdGhlIGRhdGEgc291cmNlPC9saT4KKyAqIDxsaT5uYW1lIG9mIHRoZSB0eXBlPC9saT4KKyAqIDxsaT5pbnN0YW5jZSBJRDwvbGk+CisgKiA8bGk+dmFsdWVzPC9saT4KKyAqIDxsaT5hZGRlZC9yZW1vdmVkIGZpbGUgbGlua3M8L2xpPgorICogPGxpPnJlbGF0ZWQgZW50aXRpZXM8L2xpPgorICogPGxpPnBhcmVudC9jaGlsZCBlbnRpdGllczwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdENvcmUgaW1wbGVtZW50cyBDb3JlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIEVudGl0eVN0b3JlIHBlcm1hbmVudEVudGl0eVN0b3JhZ2UgPSBuZXcgRW50aXR5U3RvcmUoKTsKKwlwcml2YXRlIGZpbmFsIEVudGl0eVN0b3JlIG11dGFibGVFbnRpdHlTdG9yYWdlID0gbmV3IEVudGl0eVN0b3JlKCk7CisJcHJpdmF0ZSBmaW5hbCBDaGlsZHJlblN0b3JlIGNoaWxkcmVuU3RvcmUgPSBuZXcgQ2hpbGRyZW5TdG9yZSgpOworCXByaXZhdGUgZmluYWwgUmVsYXRpb25TdG9yZSBudG9NU3RvcmUgPSBuZXcgUmVsYXRpb25TdG9yZSgpOworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hNYXA8PigpOworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVmFsdWU+IGhpZGRlblZhbHVlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHNvdXJjZU5hbWU7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZU5hbWU7CisKKwlwcml2YXRlIFN0cmluZyBpbnN0YW5jZUlEOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIENvcmV9IGluaXRpYWxpemVkIHdpdGggYSBxdWVyaWVkIHtAbGluayBSZWNvcmR9LgorCSAqCisJICogQHBhcmFtIHJlY29yZCBUaGUgcXVlcmllZCB7QGNvZGUgUmVjb3JkfS4KKwkgKi8KKwlwdWJsaWMgRGVmYXVsdENvcmUoUmVjb3JkIHJlY29yZCkgeworCQlzZXRJRChyZWNvcmQuZ2V0SUQoKSk7CisJCXZhbHVlcy5wdXRBbGwocmVjb3JkLmdldFZhbHVlcygpKTsKKwkJdmFsdWVzLnJlbW92ZShFbnRpdHkuQVRUUl9JRCk7CisKKwkJLy8gcmVtb3ZlIGFueSBjb250YWluZWQgcmVsYXRpb24gYXR0cmlidXRlcworCQlFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSByZWNvcmQuZ2V0RW50aXR5VHlwZSgpOworCQllbnRpdHlUeXBlLmdldFJlbGF0aW9ucygpLnN0cmVhbSgpLm1hcChSZWxhdGlvbjo6Z2V0TmFtZSkuZm9yRWFjaCh2YWx1ZXM6OnJlbW92ZSk7CisKKwkJc291cmNlTmFtZSA9IGVudGl0eVR5cGUuZ2V0U291cmNlTmFtZSgpOworCQl0eXBlTmFtZSA9IGVudGl0eVR5cGUuZ2V0TmFtZSgpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkge0BsaW5rIENvcmV9LiBUaGUgSUQgaXMgc2V0IHRvIGFuIGVtcHR5IFN0cmluZy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKi8KKwlwdWJsaWMgRGVmYXVsdENvcmUoRW50aXR5VHlwZSBlbnRpdHlUeXBlKSB7CisJCXNldElEKCIiKTsKKwkJdmFsdWVzLnB1dEFsbChlbnRpdHlUeXBlLmNyZWF0ZVZhbHVlcygpKTsKKwkJdmFsdWVzLnJlbW92ZShFbnRpdHkuQVRUUl9JRCk7CisKKwkJc291cmNlTmFtZSA9IGVudGl0eVR5cGUuZ2V0U291cmNlTmFtZSgpOworCQl0eXBlTmFtZSA9IGVudGl0eVR5cGUuZ2V0TmFtZSgpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKSB7CisJCXJldHVybiBzb3VyY2VOYW1lOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgeworCQlyZXR1cm4gdHlwZU5hbWU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisJCXJldHVybiBpbnN0YW5jZUlEOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaW5zdGFuY2VJRCkgeworCQl0aGlzLmluc3RhbmNlSUQgPSBpbnN0YW5jZUlEOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgVmFsdWU+IGdldFZhbHVlcygpIHsKKwkJcmV0dXJuIHZhbHVlczsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaGlkZVZhbHVlcyhDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpIHsKKwkJaWYgKG5hbWVzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7CisJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5yZW1vdmUobmFtZSk7CisJCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQkJaGlkZGVuVmFsdWVzLnB1dChuYW1lLCB2YWx1ZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIFZhbHVlPiBnZXRBbGxWYWx1ZXMoKSB7CisJCWlmIChoaWRkZW5WYWx1ZXMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdmFsdWVzOworCQl9CisKKwkJTWFwPFN0cmluZywgVmFsdWU+IGFsbFZhbHVlcyA9IG5ldyBIYXNoTWFwPD4odmFsdWVzKTsKKwkJYWxsVmFsdWVzLnB1dEFsbChoaWRkZW5WYWx1ZXMpOworCQlyZXR1cm4gYWxsVmFsdWVzOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5U3RvcmUgZ2V0TXV0YWJsZVN0b3JlKCkgeworCQlyZXR1cm4gbXV0YWJsZUVudGl0eVN0b3JhZ2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlTdG9yZSBnZXRQZXJtYW5lbnRTdG9yZSgpIHsKKwkJcmV0dXJuIHBlcm1hbmVudEVudGl0eVN0b3JhZ2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDaGlsZHJlblN0b3JlIGdldENoaWxkcmVuU3RvcmUoKSB7CisJCXJldHVybiBjaGlsZHJlblN0b3JlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb25TdG9yZSBnZXROdG9NU3RvcmUoKSB7CisJCXJldHVybiBudG9NU3RvcmU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9FbnRpdHlTdG9yZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvRW50aXR5U3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmFjNTFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvRW50aXR5U3RvcmUuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKKworLyoqCisgKiBIb2xkcyByZWxhdGVkIGVudGl0aWVzIG9mIGFueSBraW5kIGFuZCBrZWVwcyB0cmFjayBvZiBtb2RpZmljYXRpb25zLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW50aXR5U3RvcmUgeworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFbnRpdHk+IGN1cnJlbnQgPSBuZXcgSGFzaE1hcDw+KDApOworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRW50aXR5PiByZW1vdmVkID0gbmV3IEhhc2hNYXA8PigwKTsKKworCS8qKgorCSAqIFJldHVybnMgY3VycmVudCBzZXQgb2YgcmVsYXRlZCBlbnRpdGllcy4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJuZWQge0Bjb2RlIENvbGxlY3Rpb259IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgQ29sbGVjdGlvbjxFbnRpdHk+IGdldEN1cnJlbnQoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGN1cnJlbnQudmFsdWVzKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgY3VycmVudCBzZXQgb2YgcmVtb3ZlZCByZWxhdGVkIGVudGl0aWVzLgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBDb2xsZWN0aW9uPEVudGl0eT4gZ2V0UmVtb3ZlZCgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24ocmVtb3ZlZC52YWx1ZXMoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyByZWxhdGVkIGVudGl0eSBpZGVudGlmaWVkIGJ5IGdpdmVuIGVudGl0eSBjbGFzcy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHJlbGF0ZWQgZW50aXR5IGlzIHJldHVybmVkIG9yIG51bGwgb2Ygbm90IGRlZmluZWQuCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBUIGdldChDbGFzczxUPiBlbnRpdHlDbGFzcykgeworCQlyZXR1cm4gZ2V0KGVudGl0eUNsYXNzLmdldFNpbXBsZU5hbWUoKSwgZW50aXR5Q2xhc3MpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgcmVsYXRlZCBlbnRpdHkgaWRlbnRpZmllZCBieSBnaXZlbiBlbnRpdHkgY2xhc3MuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgIFRoZSBkZXNpcmVkIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSByZWxhdGlvbk5hbWUgVGhlIHJlbGF0aW9uIG5hbWUgdGhlIGVudGl0eSBpcyByZWZlcmVuY2VkIGJ5LgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyAgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHJlbGF0ZWQgZW50aXR5IGlzIHJldHVybmVkIG9yIG51bGwgb2Ygbm90IGRlZmluZWQuCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBUIGdldChTdHJpbmcgcmVsYXRpb25OYW1lLCBDbGFzczxUPiBlbnRpdHlDbGFzcykgeworCQlyZXR1cm4gZW50aXR5Q2xhc3MuY2FzdChjdXJyZW50LmdldChyZWxhdGlvbk5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBhIHJlbGF0ZWQgZW50aXR5IHdpdGggdGhlIGdpdmVuIG9uZS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIG5ldyByZWxhdGVkIGVudGl0eS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXQoRW50aXR5IGVudGl0eSkgeworCQlzZXQoZW50aXR5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBlbnRpdHkpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGEgcmVsYXRlZCBlbnRpdHkgd2l0aCB0aGUgZ2l2ZW4gb25lLgorCSAqCisJICogQHBhcmFtIG5hbWUgICBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb24gdGhlIGVudGl0eSBpcyByZWZlcmVuY2VkIGJ5LgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIG5ldyByZWxhdGVkIGVudGl0eS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIG5hbWUsIEVudGl0eSBlbnRpdHkpIHsKKwkJRW50aXR5IG9sZCA9IGN1cnJlbnQucHV0KG5hbWUsIGVudGl0eSk7CisJCWlmIChvbGQgIT0gbnVsbCkgeworCQkJcmVtb3ZlZC5wdXQobmFtZSwgb2xkKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbW92ZXMgYSByZWxhdGVkIGVudGl0eSBmb3IgZ2l2ZW4gZW50aXR5IGNsYXNzLgorCSAqCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmUoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MpIHsKKwkJU3RyaW5nIGtleSA9IGVudGl0eUNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKwkJcmVtb3ZlKGtleSwgZW50aXR5Q2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgYSByZWxhdGVkIGVudGl0eSBmb3IgZ2l2ZW4gcmVsYXRpb24gbmFtZSBhbmQgZW50aXR5IGNsYXNzLgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbiB0aGUgZW50aXR5IGlzIHJlZmVyZW5jZWQgYnkuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIG5hbWUsIENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzKSB7CisJCUVudGl0eSBvbGQgPSBjdXJyZW50LnJlbW92ZShuYW1lKTsKKwkJaWYgKG9sZCAhPSBudWxsKSB7CisJCQlyZW1vdmVkLnB1dChuYW1lLCBvbGQpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyByZWxhdGVkIGVudGl0eSBpZGVudGlmaWVkIGJ5IGdpdmVuIGVudGl0eSBjbGFzcyBhbmQKKwkgKiB7QGxpbmsgQ29udGV4dFR5cGV9LgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIFRoZSBkZXNpcmVkIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSByZWxhdGVkIGVudGl0eSBpcyByZXR1cm5lZCBvciBudWxsIG9mIG5vdCBkZWZpbmVkLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gVCBnZXQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCXJldHVybiBlbnRpdHlDbGFzcy5jYXN0KGN1cnJlbnQuZ2V0KGNyZWF0ZUNvbnRleHRUeXBlS2V5KGVudGl0eUNsYXNzLCBjb250ZXh0VHlwZSkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBhIHJlbGF0ZWQgZW50aXR5IHdpdGggdGhlIGdpdmVuIG9uZS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICAgICBUaGUgbmV3IHJlbGF0ZWQgZW50aXR5LgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBVc2VkIGFzIGlkZW50aWZpZXIuCisJICovCisJcHVibGljIHZvaWQgc2V0KEVudGl0eSBlbnRpdHksIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCVN0cmluZyBrZXkgPSBjcmVhdGVDb250ZXh0VHlwZUtleShlbnRpdHkuZ2V0Q2xhc3MoKSwgY29udGV4dFR5cGUpOworCQlFbnRpdHkgb2xkID0gY3VycmVudC5wdXQoa2V5LCBlbnRpdHkpOworCQlpZiAob2xkICE9IG51bGwpIHsKKwkJCXJlbW92ZWQucHV0KGtleSwgb2xkKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbW92ZXMgYSByZWxhdGVkIGVudGl0eSBmb3IgZ2l2ZW4gZW50aXR5IGNsYXNzIGFuZCB7QGxpbmsgQ29udGV4dFR5cGV9LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGUgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZShDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUpIHsKKwkJU3RyaW5nIGtleSA9IGNyZWF0ZUNvbnRleHRUeXBlS2V5KGVudGl0eUNsYXNzLCBjb250ZXh0VHlwZSk7CisJCUVudGl0eSBvbGQgPSBjdXJyZW50LnJlbW92ZShrZXkpOworCQlpZiAob2xkICE9IG51bGwpIHsKKwkJCXJlbW92ZWQucHV0KGtleSwgb2xkKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENsZWFuIHVwIGxpc3Qgb2YgcmVtb3ZlZCBlbnRpdGllcy4KKwkgKi8KKwl2b2lkIGFwcGx5KCkgeworCQlyZW1vdmVkLmNsZWFyKCk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGVzIGEga2V5IGZyb20gZ2l2ZW4gZW50aXR5IGNsYXNzIGFuZCB7QGxpbmsgQ29udGV4dFR5cGV9LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNsYXNzIElkZW50aWZpZXIgcGFydCAxLgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBJZGVudGlmaWVyIHBhcnQgMi4KKwkgKiBAcmV0dXJuIEEgY29udGV4dCB0eXBlIGRlcGVuZGVudCBrZXkgaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbnRleHRUeXBlS2V5KENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlyZXR1cm4gZW50aXR5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgJ18nICsgY29udGV4dFR5cGU7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvRW50aXR5VHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvRW50aXR5VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjVjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9FbnRpdHlUeXBlLmphdmEKQEAgLTAsMCArMSwxOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBtb2RlbGVkIGVudGl0eSB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBBdHRyaWJ1dGUKKyAqIEBzZWUgUmVsYXRpb24KKyAqIEBzZWUgUmVsYXRpb25UeXBlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRW50aXR5VHlwZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZS4KKwkgKgorCSAqIEByZXR1cm4gTmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UgaXMgcmV0dXJuZWQuCisJICovCisJU3RyaW5nIGdldFNvdXJjZU5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlbnRpdHkgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIElEIG9mIHRoaXMgZW50aXR5IHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBJRCBpcyByZXR1cm5lZC4KKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYWxsIHtAbGluayBBdHRyaWJ1dGV9cyBvZiB0aGlzIGVudGl0eSB0eXBlLgorCSAqCisJICogPHA+CisJICogPGI+Tk9URTo8L2I+IFJlbGF0aW9uIGF0dHJpYnV0ZXMgYXJlIDxpPm5vdDwvaT4gcGFydCBvZiB0aGUgcmV0dXJuZWQKKwkgKiB7QGNvZGUgTGlzdH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gbWF5IGJlIGltbXV0YWJsZS4KKwkgKi8KKwlMaXN0PEF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgSUQge0BsaW5rIEF0dHJpYnV0ZX0gb2YgdGhpcyBlbnRpdHkgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIElEIHtAY29kZSBBdHRyaWJ1dGV9IGlzIHJldHVybmVkLgorCSAqIEBzZWUgRW50aXR5I0FUVFJfSUQKKwkgKi8KKwlkZWZhdWx0IEF0dHJpYnV0ZSBnZXRJREF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZShFbnRpdHkuQVRUUl9JRCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSB7QGxpbmsgQXR0cmlidXRlfSBvZiB0aGlzIGVudGl0eSB0eXBlLgorCSAqCisJICogQHJldHVybiBUaGUgbmFtZSB7QGNvZGUgQXR0cmlidXRlfSBpcyByZXR1cm5lZC4KKwkgKiBAc2VlIEVudGl0eSNBVFRSX05BTUUKKwkgKi8KKwlkZWZhdWx0IEF0dHJpYnV0ZSBnZXROYW1lQXR0cmlidXRlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlKEVudGl0eS5BVFRSX05BTUUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1pbWUgdHlwZSB7QGxpbmsgQXR0cmlidXRlfSBmb3IgdGhpcyBlbnRpdHkgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1pbWUgdHlwZSB7QGNvZGUgQXR0cmlidXRlfSBpcyByZXR1cm5lZC4KKwkgKiBAc2VlIEVudGl0eSNBVFRSX01JTUVUWVBFCisJICovCisJZGVmYXVsdCBBdHRyaWJ1dGUgZ2V0TWltZVR5cGVBdHRyaWJ1dGUoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGUoRW50aXR5LkFUVFJfTUlNRVRZUEUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgZWl0aGVyIHRoZSB7QGxpbmsgQXR0cmlidXRlfSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBuYW1lIG9yIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgcmVsYXRpb24ge0Bjb2RlIEF0dHJpYnV0ZX0gKGZvcmVpZ24ga2V5KSBhcyByZXR1cm5lZCBieQorCSAqIHtAbGluayBSZWxhdGlvbiNnZXRBdHRyaWJ1dGUoKX0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUge0Bjb2RlIEF0dHJpYnV0ZX0gaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIHtAY29kZSBBdHRyaWJ1dGV9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBuZWl0aGVyIGFuIHtAY29kZSBBdHRyaWJ1dGV9IG5vciBhCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFJlbGF0aW9ufSB3aXRoIGdpdmVuIG5hbWUgZXhpc3RzLgorCSAqLworCUF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOworCisJLyoqCisJICogUmV0dXJucyBhbGwge0BsaW5rIFJlbGF0aW9ufXMgdG8gb3RoZXIgZW50aXR5IHR5cGVzLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IG1heSBiZSBpbW11dGFibGUuCisJICovCisJTGlzdDxSZWxhdGlvbj4gZ2V0UmVsYXRpb25zKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCB7QGxpbmsgUmVsYXRpb259cyB0byBhbGxvd2VkIHBhcmVudCBlbnRpdHkgdHlwZXMuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gbWF5IGJlIGltbXV0YWJsZS4KKwkgKi8KKwlMaXN0PFJlbGF0aW9uPiBnZXRQYXJlbnRSZWxhdGlvbnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSBjaGlsZCB7QGxpbmsgUmVsYXRpb259cyB3aG9zZSByZWxhdGlvbnNoaXAgaXMKKwkgKiB7QGxpbmsgUmVsYXRpb25UeXBlI0ZBVEhFUl9DSElMRH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gbWF5IGJlIGltbXV0YWJsZS4KKwkgKi8KKwlMaXN0PFJlbGF0aW9uPiBnZXRDaGlsZFJlbGF0aW9ucygpOworCisJLyoqCisJICogUmV0dXJucyBhbGwgY2hpbGQge0BsaW5rIFJlbGF0aW9ufXMgd2hvc2UgcmVsYXRpb25zaGlwIGlzCisJICoge0BsaW5rIFJlbGF0aW9uVHlwZSNJTkZPfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBtYXkgYmUgaW1tdXRhYmxlLgorCSAqLworCUxpc3Q8UmVsYXRpb24+IGdldEluZm9SZWxhdGlvbnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgYWxsIHtAbGluayBSZWxhdGlvbn1zIHdob3NlIHJlbGF0aW9uc2hpcCBpcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGlvblR5cGUgVGhlIHJlbGF0aW9uc2hpcCB0eXBlLgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBtYXkgYmUgaW1tdXRhYmxlLgorCSAqLworCUxpc3Q8UmVsYXRpb24+IGdldFJlbGF0aW9ucyhSZWxhdGlvblR5cGUgcmVsYXRpb25UeXBlKTsKKworCS8qKgorCSAqIFJldHVybnMgYSB7QGxpbmsgUmVsYXRpb259IHRvIGdpdmVuIHRhcmdldCBlbnRpdHkgdHlwZS4gQXQgZmlyc3QgaXQgaXMgdHJpZWQKKwkgKiB0byBmaW5kIGEgdW5hbWJpZ3VvdXMge0Bjb2RlIFJlbGF0aW9ufSB0byBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0uIElmIHRoaXMKKwkgKiBmYWlscyBpdCBpcyB0cmllZCB0byBpZGVudGlmeSBpdCBieSB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHBhcmFtIHRhcmdldCBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgUmVsYXRpb259IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBhIHJlbGF0aW9uIHRvIGdpdmVuIHRhcmdldCBlbnRpdHkKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGRvZXMgbm90IGV4aXN0LgorCSAqLworCVJlbGF0aW9uIGdldFJlbGF0aW9uKEVudGl0eVR5cGUgdGFyZ2V0KTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBSZWxhdGlvbn0gd2l0aCBnaXZlbiB0YXJnZXQgZW50aXR5IHR5cGUgYW5kIHJlbGF0aW9uIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgZW50aXR5IHR5cGUgb2YgdGhlIHJlcXVlc3RlZCB7QGNvZGUgUmVsYXRpb259LgorCSAqIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCB7QGNvZGUgUmVsYXRpb259LgorCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQge0Bjb2RlIFJlbGF0aW9ufSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYge0Bjb2RlIFJlbGF0aW9ufSB3aXRoIGdpdmVuIHRhcmdldAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSB0eXBlIGFuZCBuYW1lIGRvZXMgbm90IGV4aXN0LgorCSAqIEBzZWUgI2dldFJlbGF0aW9uKEVudGl0eVR5cGUpCisJICovCisJUmVsYXRpb24gZ2V0UmVsYXRpb24oRW50aXR5VHlwZSB0YXJnZXQsIFN0cmluZyBuYW1lKTsKKworCS8qKgorCSAqIENyZWF0ZXMgZm9yIGVhY2gge0BsaW5rIEF0dHJpYnV0ZX0gYSBjb3JyZXNwb25kaW5nIGVtcHR5IHtAbGluayBWYWx1ZX0gYW5kCisJICogcmV0dXJucyB0aGVtIG1hcHBlZCBieSB0aGVpciBuYW1lLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIGNyZWF0ZWQgZW1wdHkge0Bjb2RlIFZhbHVlfXMgbWFwcGVkIGJ5IHRoZWlyIG5hbWUuCisJICovCisJZGVmYXVsdCBNYXA8U3RyaW5nLCBWYWx1ZT4gY3JlYXRlVmFsdWVzKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlcygpLnN0cmVhbSgpLm1hcChBdHRyaWJ1dGU6OmNyZWF0ZVZhbHVlKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoVmFsdWU6OmdldE5hbWUsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZW50aXR5IHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoaXMgZW50aXR5IHR5cGUgaXMgcmV0dXJuZWQuCisJICovCisJQE92ZXJyaWRlCisJU3RyaW5nIHRvU3RyaW5nKCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL01vZGVsTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvTW9kZWxNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViZjZkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL01vZGVsTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5OworCisvKioKKyAqIFByb3ZpZGVzIGFjY2VzcyB0byBhbnkgbW9kZWxlZCB7QGxpbmsgRW50aXR5VHlwZX0gd2l0aGluIGFuIHVuZGVybHlpbmcKKyAqIGFwcGxpY2F0aW9uIG1vZGVsLiBBIHtAbGluayBRdWVyeX0sIGNyZWF0ZWQgYnkgdGhpcyBzZXJ2aWNlLCB1c2VzIHRoZXNlCisgKiB7QGNvZGUgRW50aXR5VHlwZX1zIHRvIGFjY2VzcyBjb3JyZXNwb25kaW5nIHJlY29yZHMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTW9kZWxNYW5hZ2VyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSB7QGxpbmsgRW50aXR5VHlwZX1zLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlMaXN0PEVudGl0eVR5cGU+IGxpc3RFbnRpdHlUeXBlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eVR5cGV9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5fS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgSXRzIHR5cGUgbmFtZSBpcyB1c2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiB7QGNvZGUgRW50aXR5VHlwZX0gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIGVudGl0eSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IEVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZShFbnRpdHkgZW50aXR5KSB7CisJCXJldHVybiBnZXRFbnRpdHlUeXBlKGVudGl0eS5nZXRUeXBlTmFtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5VHlwZX0gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIGVudGl0eSBjbGFzcyB0eXBlLgorCSAqCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIHtAY29kZSBFbnRpdHlUeXBlfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gZW50aXR5IGNsYXNzIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB7QGNvZGUgRW50aXR5VHlwZX0gZm9yIGdpdmVuIHR5cGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MpOworCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eVR5cGV9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBlbnRpdHkgY2xhc3MgYW5kCisJICoge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIHtAY29kZSBFbnRpdHlUeXBlfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gZW50aXR5IGNsYXNzIGFuZCB7QGNvZGUKKwkgKiAJCUNvbnRleHRUeXBlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYge0Bjb2RlIEVudGl0eVR5cGV9IGZvciBnaXZlbiB0eXBlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgZXhpc3QuCisJICovCisJRW50aXR5VHlwZSBnZXRFbnRpdHlUeXBlKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5VHlwZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4ge0Bjb2RlIEVudGl0eVR5cGV9IHdpdGggZ2l2ZW4gbmFtZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYge0Bjb2RlIEVudGl0eVR5cGV9IHdpdGggZ2l2ZW4gbmFtZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0LgorCSAqLworCUVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZShTdHJpbmcgbmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5VHlwZX0gaWRlbnRpZmllZCBieSBnaXZlbiBJRC4KKwkgKgorCSAqIEBwYXJhbSBpZCBVc2VkIGFzIElELgorCSAqIEByZXR1cm4ge0Bjb2RlIEVudGl0eVR5cGV9IHdpdGggZ2l2ZW4gSUQgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHtAY29kZSBFbnRpdHlUeXBlfSB3aXRoIGdpdmVuIElECisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgZXhpc3QuCisJICovCisJRW50aXR5VHlwZSBnZXRFbnRpdHlUeXBlQnlJZChTdHJpbmcgaWQpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvUmVsYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL1JlbGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmNDBlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL1JlbGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBtb2RlbGVkIHJlbGF0aW9uLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBFbnRpdHlUeXBlCisgKiBAc2VlIFJlbGF0aW9uVHlwZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoaXMgcmVsYXRpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBUaGUgc291cmNlIHtAbGluayBFbnRpdHlUeXBlfSBvZiB0aGlzIHJlbGF0aW9uLgorCSAqCisJICogQHJldHVybiBUaGUgc291cmNlIHtAY29kZSBFbnRpdHlUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlFbnRpdHlUeXBlIGdldFNvdXJjZSgpOworCisJLyoqCisJICogVGhlIHRhcmdldCB7QGxpbmsgRW50aXR5VHlwZX0gb2YgdGhpcyByZWxhdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHRhcmdldCB7QGNvZGUgRW50aXR5VHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJRW50aXR5VHlwZSBnZXRUYXJnZXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBSZWxhdGlvblR5cGV9IHR5cGUgZm9yIHRoaXMgcmVsYXRpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgUmVsYXRpb25UeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlSZWxhdGlvblR5cGUgZ2V0UmVsYXRpb25UeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmb3JlaWduIGtleSB7QGxpbmsgQXR0cmlidXRlfSBmb3IgdGhpcyB7QGxpbmsgUmVsYXRpb259LgorCSAqCisJICogQHJldHVybiBUaGUgZm9yZWlnbiBrZXkge0Bjb2RlIEF0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICovCisJQXR0cmlidXRlIGdldEF0dHJpYnV0ZSgpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhbmQgZW1wdHkge0BsaW5rIFZhbHVlfSB3aXRoIHtAbGluayBWYWx1ZVR5cGUjTE9OR30uCisJICoKKwkgKiBAcmV0dXJuIENyZWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFZhbHVlIGNyZWF0ZVZhbHVlKCkgeworCQlyZXR1cm4gVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoZ2V0TmFtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcmVsYXRpb24uCisJICoKKwkgKiBAcmV0dXJuIE5hbWUgb2YgdGhpcyByZWxhdGlvbiBpcyByZXR1cm5lZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlTdHJpbmcgdG9TdHJpbmcoKTsKKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgcmVsYXRpb24gaXMgb2YgdGhlIHNhbWUge0BsaW5rIFJlbGF0aW9uVHlwZX0gYXMgdGhlIGdpdmVuCisJICogb25lIGFuZCB3aGV0aGVyIHRoZSBmb3JlaWduIGtleSBpcyBpbiB0aGUgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkgdHlwZQorCSAqIChvciwgaW4gb3RoZXIgd29yZHMsIGlmIHRoZXJlIG1heSBiZSBhdCBtb3N0IDEgcmVsYXRlZCBkZXN0aW5hdGlvbiBvYmplY3QpLgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uVHlwZSBUaGUge0Bjb2RlIFJlbGF0aW9uVHlwZX0uCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSB0aGlzIHJlbGF0aW9uJ3Mge0Bjb2RlIFJlbGF0aW9uVHlwZX0gaXMgZXF1YWwKKwkgKiAgICAgICAgIHdpdGggdGhlIGdpdmVuIG9uZSBhbmQgaXQgaXMgaXMgYW4gb3V0Z29pbmcgcmVsYXRpb24uCisJICovCisJYm9vbGVhbiBpc091dGdvaW5nKFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGUpOworCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyByZWxhdGlvbiBpcyBvZiB0aGUgc2FtZSB7QGxpbmsgUmVsYXRpb25UeXBlfSBhcyB0aGUgZ2l2ZW4KKwkgKiBvbmUgYW5kIHdoZXRoZXIgdGhlIGZvcmVpZ24ga2V5IGlzIGluIHRoZSB0YWJsZSBvZiB0aGUgdGFyZ2V0IGVudGl0eSB0eXBlCisJICogKG9yLCBpbiBvdGhlciB3b3JkcywgaWYgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgcmVsYXRlZCBkZXN0aW5hdGlvbgorCSAqIG9iamVjdHMpLgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uVHlwZSBUaGUge0Bjb2RlIFJlbGF0aW9uVHlwZX0uCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSB0aGlzIHJlbGF0aW9uJ3Mge0Bjb2RlIFJlbGF0aW9uVHlwZX0gaXMgZXF1YWwKKwkgKiAgICAgICAgIHdpdGggdGhlIGdpdmVuIG9uZSBhbmQgaXQgaXMgaXMgYW4gaW5jb21pbmcgcmVsYXRpb24uCisJICovCisJYm9vbGVhbiBpc0luY29taW5nKFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGUpOworCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyByZWxhdGlvbiBpcyBhIE4gdG8gTSByZWxhdGlvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgcmVsYXRpb24gaXMgTiB0byBNLgorCSAqLworCWJvb2xlYW4gaXNOdG9NKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9SZWxhdGlvblN0b3JlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9SZWxhdGlvblN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzZTUyMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL1JlbGF0aW9uU3RvcmUuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CisKKy8qKgorICogSG9sZHMgcmVsYXRlZCBlbnRpdGllcyBvZiBhbnkga2luZCBhbmQga2VlcHMgdHJhY2sgb2YgbW9kaWZpY2F0aW9ucy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlbGF0aW9uU3RvcmUgeworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBEZWxldGFibGU+PiBhZGRlZCA9IG5ldyBIYXNoTWFwPD4oMCk7CisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBEZWxldGFibGU+PiByZW1vdmVkID0gbmV3IEhhc2hNYXA8PigwKTsKKworCS8qKgorCSAqIFJldHVybnMgY3VycmVudCBzZXQgb2YgcmVsYXRlZCBjaGlsZHJlbiBtYXBwZWQgYnkgdGhlaXIgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJuZWQge0Bjb2RlIE1hcH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBEZWxldGFibGU+PiBnZXRBZGRlZCgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChhZGRlZCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBjdXJyZW50IHNldCBvZiByZW1vdmVkIHJlbGF0ZWQgY2hpbGRyZW4gbWFwcGVkIGJ5IHRoZWlyIHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybmVkIHtAY29kZSBNYXB9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gZ2V0UmVtb3ZlZCgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZW1vdmVkKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHJlbGF0ZWQgY2hpbGQgZW50aXRpZXMgb2YgZ2l2ZW4gdHlwZS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBEZXNpcmVkIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyA8VCBleHRlbmRzIERlbGV0YWJsZT4gTGlzdDxUPiBnZXQoU3RyaW5nIHJlbGF0aW9uKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KChMaXN0PFQ+KSBhZGRlZC5jb21wdXRlSWZBYnNlbnQocmVsYXRpb24sIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpKTsKKwl9CisKKwkvKioKKwkgKiBTb3J0cyB0aGUgY2hpbGQgZW50aXRpZXMgd2l0aCBnaXZlbiB7QGNvZGUgQ29tcGFyYXRvcn0uCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgRGVzaXJlZCBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBjb21wYXJhdG9yICBVc2VkIGZvciBzb3J0aW5nLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyA8VCBleHRlbmRzIERlbGV0YWJsZT4gdm9pZCBzb3J0KFN0cmluZyByZWxhdGlvbiwgQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGNvbXBhcmF0b3IpIHsKKwkJTGlzdDxUPiBjaGlsZHJlbiA9IChMaXN0PFQ+KSBhZGRlZC5nZXQocmVsYXRpb24pOworCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworCQkJY2hpbGRyZW4uc29ydChjb21wYXJhdG9yKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4gY2hpbGQgZW50aXR5LgorCSAqCisJICogQHBhcmFtIGNoaWxkIFRoZSBuZXcgY2hpbGQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgYWRkKFN0cmluZyByZWxhdGlvbiwgRGVsZXRhYmxlIHJlbGF0ZWRFbnRpdHkpIHsKKwkJcmVtb3ZlZC5nZXRPckRlZmF1bHQocmVsYXRpb24sIG5ldyBBcnJheUxpc3Q8PigpKS5yZW1vdmUocmVsYXRlZEVudGl0eSk7CisJCSgoTGlzdDxEZWxldGFibGU+KSBhZGRlZC5jb21wdXRlSWZBYnNlbnQocmVsYXRpb24sIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpKS5hZGQocmVsYXRlZEVudGl0eSk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyBnaXZlbiBjaGlsZCBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRlZEVudGl0eSBUaGUgY2hpbGQgd2hpY2ggd2lsbCBiZSByZW1vdmVkLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgcmVsYXRpb24sIERlbGV0YWJsZSByZWxhdGVkRW50aXR5KSB7CisJCWFkZGVkLmdldE9yRGVmYXVsdChyZWxhdGlvbiwgbmV3IEFycmF5TGlzdDw+KCkpLnJlbW92ZShyZWxhdGVkRW50aXR5KTsKKwkJKChMaXN0PERlbGV0YWJsZT4pIHJlbW92ZWQuY29tcHV0ZUlmQWJzZW50KHJlbGF0aW9uLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKSkuYWRkKHJlbGF0ZWRFbnRpdHkpOworCX0KKworCS8qKgorCSAqIENsZWFuIHVwIGxpc3Qgb2YgcmVtb3ZlZCBlbnRpdGllcy4KKwkgKi8KKwl2b2lkIGFwcGx5KCkgeworCQlyZW1vdmVkLmNsZWFyKCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvUmVsYXRpb25UeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9SZWxhdGlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJmODJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvUmVsYXRpb25UeXBlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyOworCisvKioKKyAqIFJlbGF0aW9uVHlwZSBlbnVtZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgRW50aXR5VHlwZQorICogQHNlZSBSZWxhdGlvbgorICovCitwdWJsaWMgZW51bSBSZWxhdGlvblR5cGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEVudW1lcmF0aW9ucworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJlcHJlc2VudHMgYSBoaWVyYXJjaGljYWwgcmVsYXRpb24gYmV0d2VlbiB0d28ge0BsaW5rIEVudGl0eVR5cGV9cyBlLmcuOgorCSAqIHtAY29kZSBUZXN0fSBhbmQge0Bjb2RlIFRlc3RTdGVwfS4KKwkgKi8KKwlGQVRIRVJfQ0hJTEQsCisKKwkvKioKKwkgKiBSZXByZXNlbnRzIGFuIGluZm9ybWF0aW9uYWwgcmVsYXRpb24gYmV0d2VlbiB0d28ge0BsaW5rIEVudGl0eVR5cGV9cyBlLmcuOgorCSAqIHtAY29kZSBNZWFzdXJlbWVudH0gYW5kIHtAY29kZSBQYXJhbWV0ZXJTZXR9LgorCSAqLworCUlORk8sCisKKwkvKioKKwkgKiBSZXByZXNlbnRzIGFuIGluaGVyaXRhbmNlIHJlbGF0aW9uIGJldHdlZW4gdHdvIHtAbGluayBFbnRpdHlUeXBlfXMuCisJICovCisJSU5IRVJJVEFOQ0UKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2ZpbGUvRmlsZVNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9maWxlL0ZpbGVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ODg5ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9maWxlL0ZpbGVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuZmlsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GaWxlTGluazsKKworLyoqCisgKiBQcm92aWRlcyBzdHJlYW0gYW5kIGRvd25sb2FkIG9wZXJhdGlvbnMgdG8gYWNjZXNzIGV4dGVybmFsbHkgbGlua2VkIGZpbGVzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIEZpbGVTZXJ2aWNlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFNlcXVlbnRpYWwgZG93bmxvYWQgb2YgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfXMgaW50byBnaXZlbiB0YXJnZXQge0Bjb2RlCisJICogUGF0aH0uIFJlbW90ZSBwYXRocyBsaW5rZWQgbXVsdGlwbGUgdGltZXMgYXJlIGRvd25sb2FkZWQgb25seSBvbmNlLgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHBhcmFtIHRhcmdldCAgICBNdXN0IGJlIGEgZGlyZWN0b3J5LgorCSAqIEBwYXJhbSBmaWxlTGlua3MgQ29sbGVjdGlvbiBvZiB7QGNvZGUgRmlsZUxpbmt9cyB0byBkb3dubG9hZC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gZG93bmxvYWQgZmlsZXMuCisJICovCisJZGVmYXVsdCB2b2lkIGRvd25sb2FkU2VxdWVudGlhbChFbnRpdHkgZW50aXR5LCBQYXRoIHRhcmdldCwgQ29sbGVjdGlvbjxGaWxlTGluaz4gZmlsZUxpbmtzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlkb3dubG9hZFNlcXVlbnRpYWwoZW50aXR5LCB0YXJnZXQsIGZpbGVMaW5rcywgbnVsbCk7CisJfQorCisJLyoqCisJICogU2VxdWVudGlhbCBkb3dubG9hZCBvZiBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9cyBpbnRvIGdpdmVuIHRhcmdldCB7QGNvZGUKKwkgKiBQYXRofS4gUmVtb3RlIHBhdGhzIGxpbmtlZCBtdWx0aXBsZSB0aW1lcyBhcmUgZG93bmxvYWRlZCBvbmx5IG9uY2UuIFRoZQorCSAqIGRvd25sb2FkIHByb2dyZXNzIG1heSBiZSB0cmFjZWQgd2l0aCBhIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgICAgICAgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSB0YXJnZXQgICAgICAgICAgIE11c3QgYmUgYSBkaXJlY3RvcnkuCisJICogQHBhcmFtIGZpbGVMaW5rcyAgICAgICAgQ29sbGVjdGlvbiBvZiB7QGNvZGUgRmlsZUxpbmt9cyB0byBkb3dubG9hZC4KKwkgKiBAcGFyYW0gcHJvZ3Jlc3NMaXN0ZW5lciBUaGUgcHJvZ3Jlc3MgbGlzdGVuZXIuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGRvd25sb2FkIGZpbGVzLgorCSAqLworCXZvaWQgZG93bmxvYWRTZXF1ZW50aWFsKEVudGl0eSBlbnRpdHksIFBhdGggdGFyZ2V0LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsCisJCQlQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIFBhcmFsbGVsIGRvd25sb2FkIG9mIGdpdmVuIHtAbGluayBGaWxlTGlua31zIGludG8gZ2l2ZW4gdGFyZ2V0IHtAY29kZQorCSAqIFBhdGh9LiBSZW1vdGUgcGF0aHMgbGlua2VkIG11bHRpcGxlIHRpbWVzIGFyZSBkb3dubG9hZGVkIG9ubHkgb25jZS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSB0YXJnZXQgICAgTXVzdCBiZSBhIGRpcmVjdG9yeS4KKwkgKiBAcGFyYW0gZmlsZUxpbmtzIENvbGxlY3Rpb24gb2Yge0Bjb2RlIEZpbGVMaW5rfXMgdG8gZG93bmxvYWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGRvd25sb2FkIGZpbGVzLgorCSAqLworCWRlZmF1bHQgdm9pZCBkb3dubG9hZFBhcmFsbGVsKEVudGl0eSBlbnRpdHksIFBhdGggdGFyZ2V0LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWRvd25sb2FkUGFyYWxsZWwoZW50aXR5LCB0YXJnZXQsIGZpbGVMaW5rcywgbnVsbCk7CisJfQorCisJLyoqCisJICogUGFyYWxsZWwgZG93bmxvYWQgb2YgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfXMgaW50byBnaXZlbiB0YXJnZXQge0Bjb2RlCisJICogUGF0aH0uIFJlbW90ZSBwYXRocyBsaW5rZWQgbXVsdGlwbGUgdGltZXMgYXJlIGRvd25sb2FkZWQgb25seSBvbmNlLiBUaGUKKwkgKiBkb3dubG9hZCBwcm9ncmVzcyBtYXkgYmUgdHJhY2VkIHdpdGggYSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICAgICAgICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gdGFyZ2V0ICAgICAgICAgICBNdXN0IGJlIGEgZGlyZWN0b3J5LgorCSAqIEBwYXJhbSBmaWxlTGlua3MgICAgICAgIENvbGxlY3Rpb24gb2Yge0Bjb2RlIEZpbGVMaW5rfXMgdG8gZG93bmxvYWQuCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgVGhlIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBkb3dubG9hZCBmaWxlcy4KKwkgKi8KKwl2b2lkIGRvd25sb2FkUGFyYWxsZWwoRW50aXR5IGVudGl0eSwgUGF0aCB0YXJnZXQsIENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcywgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uOworCisJLyoqCisJICogRG93bmxvYWRzIGdpdmVuIHtAbGluayBGaWxlTGlua30gaW50byBnaXZlbiB0YXJnZXQge0Bjb2RlIFBhdGh9LgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gdGFyZ2V0ICAgTXVzdCBiZSBhIGRpcmVjdG9yeS4KKwkgKiBAcGFyYW0gZmlsZUxpbmsgVGhlIHtAY29kZSBGaWxlTGlua30gdG8gZG93bmxvYWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGRvd25sb2FkIGZpbGUuCisJICovCisJZGVmYXVsdCB2b2lkIGRvd25sb2FkKEVudGl0eSBlbnRpdHksIFBhdGggdGFyZ2V0LCBGaWxlTGluayBmaWxlTGluaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZG93bmxvYWQoZW50aXR5LCB0YXJnZXQsIGZpbGVMaW5rLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBEb3dubG9hZHMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSBpbnRvIGdpdmVuIHRhcmdldCB7QGNvZGUgUGF0aH0uIFRoZSBkb3dubG9hZAorCSAqIHByb2dyZXNzIG1heSBiZSB0cmFjZWQgd2l0aCBhIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgICAgICAgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSB0YXJnZXQgICAgICAgICAgIE11c3QgYmUgYSBkaXJlY3RvcnkuCisJICogQHBhcmFtIGZpbGVMaW5rICAgICAgICAgVGhlIHtAY29kZSBGaWxlTGlua30gdG8gZG93bmxvYWQuCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgVGhlIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBkb3dubG9hZCBmaWxlLgorCSAqLworCXZvaWQgZG93bmxvYWQoRW50aXR5IGVudGl0eSwgUGF0aCB0YXJnZXQsIEZpbGVMaW5rIGZpbGVMaW5rLCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIE9wZW5zIGFuIHtAY29kZSBJbnB1dFN0cmVhbX0gZm9yIGdpdmVuIHtAbGluayBGaWxlTGlua30uIFRoZSByZXR1cm5lZCBzdHJlYW0KKwkgKiBzaG91bGQgYmUgY29uc3VtZWQgd2l0aCBhIHRyeS13aXRoLXJlc291cmNlcyBzdGF0ZW1lbnQgdG8gZW5zdXJlIHRoZSBzdHJlYW0KKwkgKiBpcyBjbG9zZWQgcHJvcGVybHksIGUuZzoKKwkgKgorCSAqIDxwcmU+CisJICogdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG9wZW5TdHJlYW0oZW50aXR5LCBmaWxlTGluaykpIHsKKwkgKiAJLy8gZG8gc29tZXRoaW5nIHVzZWZ1bAorCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHBhcmFtIGZpbGVMaW5rIFRoZSB7QGNvZGUgRmlsZUxpbmt9IHRvIGJlIHByb3ZpZGVkIGFzIGEgc3RyZWFtLgorCSAqIEByZXR1cm4gQSBjb25zdW1hYmxlIHtAY29kZSBJbnB1dFN0cmVhbX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHByb3ZpZGUgYXMgc3RyZWFtLgorCSAqLworCWRlZmF1bHQgSW5wdXRTdHJlYW0gb3BlblN0cmVhbShFbnRpdHkgZW50aXR5LCBGaWxlTGluayBmaWxlTGluaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG9wZW5TdHJlYW0oZW50aXR5LCBmaWxlTGluaywgbnVsbCk7CisJfQorCisJLyoqCisJICogT3BlbnMgYW4ge0Bjb2RlIElucHV0U3RyZWFtfSBmb3IgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfS4gVGhlIHByb2dyZXNzIG9mIHRoZQorCSAqIHN0cmVhbSBjb25zdW1wdGlvbiBtYXkgYmUgdHJhY2VkIHdpdGggYSBwcm9ncmVzcyBsaXN0ZW5lci4gVGhlIHJldHVybmVkCisJICogc3RyZWFtIHNob3VsZCBiZSBjb25zdW1lZCB3aXRoIGEgdHJ5LXdpdGgtcmVzb3VyY2VzIHN0YXRlbWVudCB0byBlbnN1cmUgdGhlCisJICogc3RyZWFtIGlzIGNsb3NlZCBwcm9wZXJseSwgZS5nOgorCSAqCisJICogPHByZT4KKwkgKiB0cnkgKElucHV0U3RyZWFtIGlzID0gb3BlblN0cmVhbShlbnRpdHksIGZpbGVMaW5rKSkgeworCSAqIAkvLyBkbyBzb21ldGhpbmcgdXNlZnVsCisJICogfQorCSAqIDwvcHJlPgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgICAgICAgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSBmaWxlTGluayAgICAgICAgIFRoZSB7QGNvZGUgRmlsZUxpbmt9IHRvIGJlIHByb3ZpZGVkIGFzIGEgc3RyZWFtLgorCSAqIEBwYXJhbSBwcm9ncmVzc0xpc3RlbmVyIFRoZSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKiBAcmV0dXJuIEEgY29uc3VtYWJsZSB7QGNvZGUgSW5wdXRTdHJlYW19IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBwcm92aWRlIGFzIHN0cmVhbS4KKwkgKi8KKwlJbnB1dFN0cmVhbSBvcGVuU3RyZWFtKEVudGl0eSBlbnRpdHksIEZpbGVMaW5rIGZpbGVMaW5rLCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIExvYWRzIHRoZSBmaWxlIHNpemUgZm9yIGdpdmVuIHtAbGluayBGaWxlTGlua30uIFRoZSBmaWxlIHNpemUgaXMgc3RvcmVkIGluCisJICogdGhlIGdpdmVuIHtAY29kZSBGaWxlTGlua30uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5ICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSBmaWxlTGluayBUaGUge0Bjb2RlIEZpbGVMaW5rfSB3aG9zZSBmaWxlIHNpemUgaXMgcmVxdWVzdGVkLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIGZpbGUgc2l6ZS4KKwkgKi8KKwl2b2lkIGxvYWRTaXplKEVudGl0eSBlbnRpdHksIEZpbGVMaW5rIGZpbGVMaW5rKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5uZXIgY2xhc3NlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEEge0BsaW5rIEZpbGVTZXJ2aWNlfSBjb25zdW1lciBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGdldCBub3RpZmllZAorCSAqIGFib3V0IHN0cmVhbSBvciBkb3dubG9hZCBwcm9ncmVzcy4KKwkgKi8KKwlARnVuY3Rpb25hbEludGVyZmFjZQorCWludGVyZmFjZSBQcm9ncmVzc0xpc3RlbmVyIHsKKworCQkvKioKKwkJICogUHJvZ3Jlc3Mgbm90aWZpY2F0aW9uLgorCQkgKgorCQkgKiBAcGFyYW0gYnl0ZXMgICBOdW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMgc2luY2UgbGFzdCBub3RpZmljYXRpb24uCisJCSAqIEBwYXJhbSBwZXJjZW50IFRoZSBvdmVyYWxsIHBlcmNlbnRhZ2UsIHdoZXJlIHBlcmNlbnQgcCAmaXNpbjsgWzAuMCwgMS4wXS4KKwkJICovCisJCXZvaWQgcHJvZ3Jlc3MoaW50IGJ5dGVzLCBmbG9hdCBwZXJjZW50KTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0FueVR5cGVWYWx1ZXNCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvQW55VHlwZVZhbHVlc0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGNlYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0FueVR5cGVWYWx1ZXNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GaWxlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKKworLyoqCisgKiBUaGlzIGJ1aWxkZXIgYWRkcyB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IG9mIHR5cGVzIGxpc3RlZCBiZWxvdy4KKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGFkZCBhIHNlcXVlbmNlIHdoZXJlIGFsbCBvZiBpdHMgdmFsdWVzIGFyZSB2YWxpZC4KKyAqIEFkZGl0aW9uYWxseSBpdCBpcyBwb3NzaWJsZSB0byBwcm92aWRlIGEgdmFsaWRpdHkgZmxhZyBmb3IgZWFjaCBzaW5nbGUgdmFsdWUuCisgKiBJbiBlaXRoZXIgY2FzZSBuZWl0aGVyIHZhbHVlcyBub3IgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gYmUge0Bjb2RlCisgKiBudWxsfS4gRnVydGhlcm1vcmUgaWYgdmFsdWVzIGFuZCBmbGFncyBhcmUgZ2l2ZW4sIHRoZW4gdGhlaXIgbGVuZ3RoIG11c3QgYmUKKyAqIGVxdWFsLgorICoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNTVFJJTkd9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNEQVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjQk9PTEVBTn08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0JZVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNTSE9SVH08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0lOVEVHRVJ9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNMT05HfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRkxPQVR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNET1VCTEV9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFX1NUUkVBTX08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUX0NPTVBMRVh9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNET1VCTEVfQ09NUExFWH08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZJTEVfTElOS308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0JMT0J9PC9saT4KKyAqIDwvdWw+CisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbnlUeXBlVmFsdWVzQnVpbGRlciBleHRlbmRzIENvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IGdpdmVuIHZhbHVlcyB3aWxsIGJlIGFkZGVkIHRvLgorCSAqLworCUFueVR5cGVWYWx1ZXNCdWlsZGVyKFdyaXRlUmVxdWVzdCB3cml0ZVJlcXVlc3QpIHsKKwkJc3VwZXIod3JpdGVSZXF1ZXN0KTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBTdHJpbmd9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIGdsb2JhbAorCSAqIHZhbGlkaXR5IGZsYWcsIHdoaWNoIG1lYW5zIHRoZSBnaXZlbiBzZXF1ZW5jZSBkb2VzIG5vdCBjb250YWluIGFueQorCSAqIHtAY29kZSBudWxsfSB2YWx1ZXMuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgU3RyaW5nfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIHN0cmluZ1ZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuU1RSSU5HLCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IFdyaXRlUmVxdWVzdEZpbmFsaXplcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgU3RyaW5nfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSB2YWxpZGl0eQorCSAqIGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgU3RyaW5nfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcGFyYW0gZmxhZ3MgIFRoZSB2YWxpZGl0eSBmbGFncyBmb3IgZWFjaCB7QGNvZGUgU3RyaW5nfSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIHN0cmluZ1ZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5TVFJJTkcsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFdyaXRlUmVxdWVzdEZpbmFsaXplcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgTG9jYWxEYXRlVGltZX0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEKKwkgKiBnbG9iYWwgdmFsaWRpdHkgZmxhZywgd2hpY2ggbWVhbnMgdGhlIGdpdmVuIHNlcXVlbmNlIGRvZXMgbm90IGNvbnRhaW4gYW55CisJICoge0Bjb2RlIG51bGx9IHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBMb2NhbERhdGVUaW1lfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgSW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW5kZXBlbmRlbnRCdWlsZGVyIGRhdGVWYWx1ZXMoTG9jYWxEYXRlVGltZVtdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5EQVRFLCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgTG9jYWxEYXRlVGltZX0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEKKwkgKiB2YWxpZGl0eSBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIExvY2FsRGF0ZVRpbWV9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBMb2NhbERhdGVUaW1lfSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgSW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW5kZXBlbmRlbnRCdWlsZGVyIGRhdGVWYWx1ZXMoTG9jYWxEYXRlVGltZVtdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkRBVEUsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgYm9vbGVhbn0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgZ2xvYmFsCisJICogdmFsaWRpdHkgZmxhZy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBib29sZWFufSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIGJvb2xlYW5WYWx1ZXMoYm9vbGVhbltdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5CT09MRUFOLCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IFdyaXRlUmVxdWVzdEZpbmFsaXplcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgYm9vbGVhbn0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgdmFsaWRpdHkKKwkgKiBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGJvb2xlYW59IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBib29sZWFufSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIGJvb2xlYW5WYWx1ZXMoYm9vbGVhbltdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkJPT0xFQU4sIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFdyaXRlUmVxdWVzdEZpbmFsaXplcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgYnl0ZVtdfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLCB3aGljaCBtZWFucyB0aGUgZ2l2ZW4gc2VxdWVuY2UgZG9lcyBub3QgY29udGFpbiBhbnkKKwkgKiB7QGNvZGUgbnVsbH0gdmFsdWVzLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGJ5dGVbXX0gYXJyYXkgc2VxdWVuY2UuCisJICogQHJldHVybiBUaGUge0BsaW5rIFdyaXRlUmVxdWVzdEZpbmFsaXplcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFdyaXRlUmVxdWVzdEZpbmFsaXplciBieXRlU3RyZWFtVmFsdWVzKGJ5dGVbXVtdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5CWVRFX1NUUkVBTSwgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGJ5dGVbXX0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgdmFsaWRpdHkKKwkgKiBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGJ5dGVbXX0gYXJyYXkgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZ3MgZm9yIGVhY2gge0Bjb2RlIGJ5dGVbXX0gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFdyaXRlUmVxdWVzdEZpbmFsaXplcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFdyaXRlUmVxdWVzdEZpbmFsaXplciBieXRlU3RyZWFtVmFsdWVzKGJ5dGVbXVtdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkJZVEVfU1RSRUFNLCB2YWx1ZXMsIGZsYWdzKTsKKwkJcmV0dXJuIG5ldyBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLCB3aGljaCBtZWFucyB0aGUgZ2l2ZW4gc2VxdWVuY2UgZG9lcyBub3QgY29udGFpbiBhbnkKKwkgKiB7QGNvZGUgbnVsbH0gdmFsdWVzLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIEZpbGVMaW5rfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIGZpbGVMaW5rVmFsdWVzKEZpbGVMaW5rW10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZJTEVfTElOSywgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYQorCSAqIHZhbGlkaXR5IGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgRmlsZUxpbmt9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBGaWxlTGlua30gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFdyaXRlUmVxdWVzdEZpbmFsaXplcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFdyaXRlUmVxdWVzdEZpbmFsaXplciBmaWxlTGlua1ZhbHVlcyhGaWxlTGlua1tdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZJTEVfTElOSywgdmFsdWVzLCBmbGFncyk7CisJCXJldHVybiBuZXcgV3JpdGVSZXF1ZXN0RmluYWxpemVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvLyBUT0RPOiBpcyBpdCBwb3NzaWJsZSB0byBwcm92aWRlIGEgYmxvYiBmb3IgZWFjaCByb3cgb3IgaXMgdGhlIGJsb2IgZm9yCisJLy8gdGhlIHdob2xlIGNvbHVtbj8hCisJLy8gd2UgYXNzdW1lIHRoZSBsYXR0ZXIgLSBvbmUgYmxvYiBmb3IgdGhlIHdob2xlIGNvbHVtbiEKKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIGJsb2JWYWx1ZShPYmplY3QgdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkJMT0IsIHZhbHVlcyk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkLiIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0Jhc2VWYWx1ZXNCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvQmFzZVZhbHVlc0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmRhODU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0Jhc2VWYWx1ZXNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworCisvKioKKyAqIFRoaXMgaXMgYSBiYXNlIHZhbHVlcyBidWlsZGVyIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGNvbmZpZ3VyaW5nIHZhbHVlcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworYWJzdHJhY3QgY2xhc3MgQmFzZVZhbHVlc0J1aWxkZXIgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgV3JpdGVSZXF1ZXN0IHdyaXRlUmVxdWVzdDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IGdpdmVuIHZhbHVlcyBhbmQgY29ycmVzcG9uZGluZworCSAqICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFNjYWxhclR5cGV9IHdpbGwgYmUgYXBwbGllZCB0by4KKwkgKi8KKwlCYXNlVmFsdWVzQnVpbGRlcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXRoaXMud3JpdGVSZXF1ZXN0ID0gd3JpdGVSZXF1ZXN0OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcm90ZWN0ZWQgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4gdmFsdWUgc2VxdWVuY2UgYW5kIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFNjYWxhclR5cGV9IGFzCisJICogdGhlIHJhdyB7QGNvZGUgU2NhbGFyVHlwZX0uCisJICoKKwkgKiBAcGFyYW0gc2NhbGFyVHlwZSBUaGUge0Bjb2RlIFNjYWxhclR5cGV9LgorCSAqIEBwYXJhbSB2YWx1ZXMgICAgIFRoZSBhcnJheSB2YWx1ZSBzZXF1ZW5jZSBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoCisJICogICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHtAY29kZSBTY2FsYXJUeXBlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZSBzY2FsYXJUeXBlLCBPYmplY3QgdmFsdWVzKSB7CisJCWlmICh2YWx1ZXMgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWVzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIG51bGwuIik7CisJCX0KKworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRSYXdTY2FsYXJUeXBlKHNjYWxhclR5cGUpOworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRWYWx1ZXModmFsdWVzKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHZhbHVlIHNlcXVlbmNlLCBhc3NvY2lhdGVkIHZhbGlkaXR5IGZsYWdzIGFuZCBzZXRzIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcge0BsaW5rIFNjYWxhclR5cGV9IGFzIHRoZSByYXcge0Bjb2RlIFNjYWxhclR5cGV9LgorCSAqCisJICogQHBhcmFtIHNjYWxhclR5cGUgVGhlIHtAY29kZSBTY2FsYXJUeXBlfS4KKwkgKiBAcGFyYW0gdmFsdWVzICAgICBUaGUgYXJyYXkgdmFsdWUgc2VxdWVuY2UgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aAorCSAqICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB7QGNvZGUgU2NhbGFyVHlwZX0uCisJICogQHBhcmFtIGZsYWdzICAgICAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHZhbHVlIGluIHRoZSB2YWx1ZXMgc2VxdWVuY2UuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUgc2NhbGFyVHlwZSwgT2JqZWN0IHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCBmbGFncyA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHZhbHVlcyBub3IgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gYmUgbnVsbC4iKTsKKwkJfSBlbHNlIGlmIChBcnJheS5nZXRMZW5ndGgodmFsdWVzKSAhPSBmbGFncy5sZW5ndGgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxlbmd0aCBvZiB2YWx1ZXMgYW5kIGZsYWdzIG11c3QgYmUgZXF1YWwuIik7CisJCX0KKworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRSYXdTY2FsYXJUeXBlKHNjYWxhclR5cGUpOworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRWYWx1ZXModmFsdWVzLCBmbGFncyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgV3JpdGVSZXF1ZXN0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgV3JpdGVSZXF1ZXN0IGdldFdyaXRlUmVxdWVzdCgpIHsKKwkJcmV0dXJuIHdyaXRlUmVxdWVzdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Db21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0NvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlMjUzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Db21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRvdWJsZUNvbXBsZXg7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZsb2F0Q29tcGxleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKKworLyoqCisgKiBUaGlzIGJ1aWxkZXIgYWRkcyB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IG9mIHR5cGVzIGxpc3RlZCBiZWxvdy4KKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGFkZCBhIHNlcXVlbmNlIHdoZXJlIGFsbCBvZiBpdHMgdmFsdWVzIGFyZSB2YWxpZC4KKyAqIEFkZGl0aW9uYWxseSBpdCBpcyBwb3NzaWJsZSB0byBwcm92aWRlIGEgdmFsaWRpdHkgZmxhZyBmb3IgZWFjaCBzaW5nbGUgdmFsdWUuCisgKiBJbiBlaXRoZXIgY2FzZSBuZWl0aGVyIHZhbHVlcyBub3IgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gYmUge0Bjb2RlCisgKiBudWxsfS4gRnVydGhlcm1vcmUgaWYgdmFsdWVzIGFuZCBmbGFncyBhcmUgZ2l2ZW4sIHRoZW4gdGhlaXIgbGVuZ3RoIG11c3QgYmUKKyAqIGVxdWFsLgorICoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRkxPQVRfQ09NUExFWH08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0RPVUJMRV9DT01QTEVYfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgQ29tcGxleE51bWVyaWNhbFZhbHVlc0J1aWxkZXIgZXh0ZW5kcyBOdW1lcmljYWxWYWx1ZXNCdWlsZGVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IGdpdmVuIHZhbHVlcyB3aWxsIGJlIGFkZGVkIHRvLgorCSAqLworCUNvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyKFdyaXRlUmVxdWVzdCB3cml0ZVJlcXVlc3QpIHsKKwkJc3VwZXIod3JpdGVSZXF1ZXN0KTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBGbG9hdENvbXBsZXh9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhCisJICogZ2xvYmFsIHZhbGlkaXR5IGZsYWcsIHdoaWNoIG1lYW5zIHRoZSBnaXZlbiBzZXF1ZW5jZSBkb2VzIG5vdCBjb250YWluIGFueQorCSAqIHtAY29kZSBudWxsfSB2YWx1ZXMuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgRmxvYXRDb21wbGV4fSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0QnVpbGRlciBmbG9hdENvbXBsZXhWYWx1ZXMoRmxvYXRDb21wbGV4W10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZMT0FUX0NPTVBMRVgsIHZhbHVlcyk7CisJCXJldHVybiBuZXcgVW5pdEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIEZsb2F0Q29tcGxleH0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEKKwkgKiB2YWxpZGl0eSBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIEZsb2F0Q29tcGxleH0gYXJyYXkgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZ3MgZm9yIGVhY2gge0Bjb2RlIEZsb2F0Q29tcGxleH0gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEJ1aWxkZXIgZmxvYXRDb21wbGV4VmFsdWVzKEZsb2F0Q29tcGxleFtdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZMT0FUX0NPTVBMRVgsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFVuaXRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBEb3VibGVDb21wbGV4fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYQorCSAqIGdsb2JhbCB2YWxpZGl0eSBmbGFnLCB3aGljaCBtZWFucyB0aGUgZ2l2ZW4gc2VxdWVuY2UgZG9lcyBub3QgY29udGFpbiBhbnkKKwkgKiB7QGNvZGUgbnVsbH0gdmFsdWVzLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIERvdWJsZUNvbXBsZXh9IGFycmF5IHNlcXVlbmNlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGZpbmFsIFVuaXRCdWlsZGVyIGRvdWJsZUNvbXBsZXhWYWx1ZXMoRG91YmxlQ29tcGxleFtdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWCwgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBVbml0QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgRG91YmxlQ29tcGxleH0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEKKwkgKiB2YWxpZGl0eSBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIERvdWJsZUNvbXBsZXh9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBEb3VibGVDb21wbGV4fSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0QnVpbGRlciBkb3VibGVDb21wbGV4VmFsdWVzKERvdWJsZUNvbXBsZXhbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWCwgdmFsdWVzLCBmbGFncyk7CisJCXJldHVybiBuZXcgVW5pdEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0V4dGVybmFsQ29tcG9uZW50LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvRXh0ZXJuYWxDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmMyMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0V4dGVybmFsQ29tcG9uZW50LmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworcHVibGljIGZpbmFsIGNsYXNzIEV4dGVybmFsQ29tcG9uZW50IHsKKworCS8vIFRPRE8KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9JbmRlcGVuZGVudEJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9JbmRlcGVuZGVudEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTBhMzdlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0luZGVwZW5kZW50QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworCisvKioKKyAqIFRoaXMgYnVpbGRlciBhbGxvd3MgdG8gY29uZmlndXJlIG51bWVyaWNhbGx5IHNvcnRhYmxlIG1lYXN1cmVkIHZhbHVlcyB0byBiZQorICogaW5kZXBlbmRlbnQsIHdoaWNoIG1lYW5zIHRoZSBtZWFzdXJlZCB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aG9zZSBvZiBvdGhlcgorICoge0BsaW5rIENoYW5uZWx9cyB3aXRoaW4gdGhlaXIgY29tbW9uIHtAbGluayBDaGFubmVsR3JvdXB9LiBUaGUgbnVtZXJpY2FsbHkKKyAqIHNvcnRhYmxlIHR5cGVzIGFyZSBsaXN0ZWQgYmVsb3c6CisgKgorICogPHVsPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0RBVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgSW5kZXBlbmRlbnRCdWlsZGVyIGV4dGVuZHMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9LCB3aG9zZSBtZWFzdXJlZCB2YWx1ZXMgb2YgdGhlCisJICogICAgICAgICAgICAgICAgICAgICB1bmRlcmx5aW5nIHtAbGluayBDaGFubmVsfSBtYXkgYmUgbWFya2VkIGFzIGluZGVwZW5kZW50LgorCSAqLworCUluZGVwZW5kZW50QnVpbGRlcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXN1cGVyKHdyaXRlUmVxdWVzdCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVHJpZ2dlcnMgdGhlIG1lYXN1cmVkIHZhbHVlcyBvZiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ2hhbm5lbH0gdG8gYmUKKwkgKiBpbmRlcGVuZGVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBXcml0ZVJlcXVlc3RGaW5hbGl6ZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIgaW5kZXBlbmRlbnQoKSB7CisJCWdldFdyaXRlUmVxdWVzdCgpLnNldEluZGVwZW5kZW50KCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFRyaWdnZXJzIHRoZSBtZWFzdXJlZCB2YWx1ZXMgb2YgdGhlIHVuZGVybHlpbmcge0BsaW5rIENoYW5uZWx9IHRvIGJlCisJICogaW5kZXBlbmRlbnQgb3Igbm90LCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHNwZWNpZmllZC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBXcml0ZVJlcXVlc3RGaW5hbGl6ZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIgaW5kZXBlbmRlbnQoYm9vbGVhbiBpbmRlcGVuZGVudCkgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRJbmRlcGVuZGVudChpbmRlcGVuZGVudCk7CisJCXJldHVybiB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL051bWVyaWNhbFZhbHVlc0J1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9OdW1lcmljYWxWYWx1ZXNCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhYWYxMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9OdW1lcmljYWxWYWx1ZXNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKKworLyoqCisgKiBUaGlzIGJ1aWxkZXIgYWRkcyB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IG9mIHR5cGVzIGxpc3RlZCBiZWxvdy4KKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGFkZCBhIHNlcXVlbmNlIHdoZXJlIGFsbCBvZiBpdHMgdmFsdWVzIGFyZSB2YWxpZC4KKyAqIEFkZGl0aW9uYWxseSBpdCBpcyBwb3NzaWJsZSB0byBwcm92aWRlIGEgdmFsaWRpdHkgZmxhZyBmb3IgZWFjaCBzaW5nbGUgdmFsdWUuCisgKiBJbiBlaXRoZXIgY2FzZSBuZWl0aGVyIHZhbHVlcyBub3IgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gYmUge0Bjb2RlCisgKiBudWxsfS4gRnVydGhlcm1vcmUgaWYgdmFsdWVzIGFuZCBmbGFncyBhcmUgZ2l2ZW4sIHRoZW4gdGhlaXIgbGVuZ3RoIG11c3QgYmUKKyAqIGVxdWFsLgorICoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgTnVtZXJpY2FsVmFsdWVzQnVpbGRlciBleHRlbmRzIEJhc2VWYWx1ZXNCdWlsZGVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IGdpdmVuIHZhbHVlcyB3aWxsIGJlIGFkZGVkIHRvLgorCSAqLworCU51bWVyaWNhbFZhbHVlc0J1aWxkZXIoV3JpdGVSZXF1ZXN0IHdyaXRlUmVxdWVzdCkgeworCQlzdXBlcih3cml0ZVJlcXVlc3QpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGJ5dGV9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIGdsb2JhbAorCSAqIHZhbGlkaXR5IGZsYWcuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkgc2VxdWVuY2UuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGJ5dGVWYWx1ZXMoYnl0ZVtdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5CWVRFLCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGJ5dGV9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIHZhbGlkaXR5CisJICogZmxhZyBmb3IgZWFjaCBnaXZlbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBieXRlfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcGFyYW0gZmxhZ3MgIFRoZSB2YWxpZGl0eSBmbGFncyBmb3IgZWFjaCB7QGNvZGUgYnl0ZX0gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGJ5dGVWYWx1ZXMoYnl0ZVtdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkJZVEUsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIHNob3J0fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIHNob3J0fSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEluZGVwZW5kZW50QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGZpbmFsIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIgc2hvcnRWYWx1ZXMoc2hvcnRbXSB2YWx1ZXMpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuU0hPUlQsIHZhbHVlcyk7CisJCXJldHVybiBuZXcgVW5pdEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgc2hvcnR9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIHZhbGlkaXR5CisJICogZmxhZyBmb3IgZWFjaCBnaXZlbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBzaG9ydH0gYXJyYXkgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZ3MgZm9yIGVhY2gge0Bjb2RlIHNob3J0fSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEluZGVwZW5kZW50QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGZpbmFsIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIgc2hvcnRWYWx1ZXMoc2hvcnRbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5TSE9SVCwgdmFsdWVzLCBmbGFncyk7CisJCXJldHVybiBuZXcgVW5pdEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgaW50fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGludH0gYXJyYXkgc2VxdWVuY2UuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGludGVnZXJWYWx1ZXMoaW50W10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLklOVEVHRVIsIHZhbHVlcyk7CisJCXJldHVybiBuZXcgVW5pdEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgaW50fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSB2YWxpZGl0eQorCSAqIGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgaW50fSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcGFyYW0gZmxhZ3MgIFRoZSB2YWxpZGl0eSBmbGFncyBmb3IgZWFjaCB7QGNvZGUgaW50fSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEluZGVwZW5kZW50QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGZpbmFsIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIgaW50ZWdlclZhbHVlcyhpbnRbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5JTlRFR0VSLCB2YWx1ZXMsIGZsYWdzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBsb25nfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGxvbmd9IGFycmF5IHNlcXVlbmNlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0SW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEluZGVwZW5kZW50QnVpbGRlciBsb25nVmFsdWVzKGxvbmdbXSB2YWx1ZXMpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuTE9ORywgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBsb25nfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSB2YWxpZGl0eQorCSAqIGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgbG9uZ30gYXJyYXkgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZ3MgZm9yIGVhY2gge0Bjb2RlIGxvbmd9IHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0SW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEluZGVwZW5kZW50QnVpbGRlciBsb25nVmFsdWVzKGxvbmdbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5MT05HLCB2YWx1ZXMsIGZsYWdzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBmbG9hdH0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgZ2xvYmFsCisJICogdmFsaWRpdHkgZmxhZy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBmbG9hdH0gYXJyYXkgc2VxdWVuY2UuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGZsb2F0VmFsdWVzKGZsb2F0W10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZMT0FULCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGZsb2F0fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSB2YWxpZGl0eQorCSAqIGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgZmxvYXR9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBmbG9hdH0gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGZsb2F0VmFsdWVzKGZsb2F0W10gdmFsdWVzLCBib29sZWFuW10gZmxhZ3MpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuRkxPQVQsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGRvdWJsZX0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgZ2xvYmFsCisJICogdmFsaWRpdHkgZmxhZy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBkb3VibGV9IGFycmF5IHNlcXVlbmNlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0SW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEluZGVwZW5kZW50QnVpbGRlciBkb3VibGVWYWx1ZXMoZG91YmxlW10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkRPVUJMRSwgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBkb3VibGV9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIHZhbGlkaXR5CisJICogZmxhZyBmb3IgZWFjaCBnaXZlbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBkb3VibGV9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBkb3VibGV9IHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0SW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEluZGVwZW5kZW50QnVpbGRlciBkb3VibGVWYWx1ZXMoZG91YmxlW10gdmFsdWVzLCBib29sZWFuW10gZmxhZ3MpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuRE9VQkxFLCB2YWx1ZXMsIGZsYWdzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1JlYWRSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzN2E3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMjY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9ucyB0byBsb2FkIG1lYXN1cmVkIHZhbHVlcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlYWRSZXF1ZXN0IHsKKwlwdWJsaWMgZW51bSBWYWx1ZXNNb2RlIHsKKwkJLyoqCisJCSAqIE1lYXN1cmVkVmFsdWVzIHdpbGwgY29udGFpbiB0aGUgZmluYWwgdmFsdWVzLCBjYWxjdWxhdGVkIGZvciBub24tZXhwbGljaXQKKwkJICogc2VxdWVuY2UgcmVwcmVzZW50YXRpb25zIHVzaW5nIGdlbmVyYXRpb24gcGFyYW1ldGVycyBhbmQsIGlmIGFwcGxpY2FibGUsIHRoZQorCQkgKiByYXcgdmFsdWVzLiBObyBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgYXJlIHJldHVybmVkIGluIHRoZSByZXN1bHRpbmcKKwkJICogTWVhc3VyZWRWYWx1ZXMsIHtAbGluayBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSB3aWxsIGJlIEVYUExJQ0lULgorCQkgKi8KKwkJQ0FMQ1VMQVRFRCwKKwkJLyoqCisJCSAqIE1lYXN1cmVkVmFsdWVzIHdpbGwgY29udGFpbiB0aGUgKHJhdykgdmFsdWVzIGFuZCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgYXMKKwkJICogcHJlc2VudCBpbiB0aGUgc3RvcmFnZS4KKwkJICovCisJCVNUT1JBR0UKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBNYXA8Q2hhbm5lbCwgVW5pdD4gY2hhbm5lbHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwOworCisJcHJpdmF0ZSBib29sZWFuIGxvYWRBbGxDaGFubmVsczsKKworCXByaXZhdGUgaW50IHJlcXVlc3RTaXplID0gMTAwXzAwMDsKKwlwcml2YXRlIGludCBzdGFydEluZGV4OworCisJcHJpdmF0ZSBWYWx1ZXNNb2RlIHZhbHVlc01vZGUgPSBWYWx1ZXNNb2RlLkNBTENVTEFURUQ7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gcmVhZFJlcXVlc3QgVGhlIHByZXZpb3VzIHtAbGluayBSZWFkUmVxdWVzdH0uCisJICovCisJUmVhZFJlcXVlc3QoUmVhZFJlcXVlc3QgcmVhZFJlcXVlc3QpIHsKKwkJdGhpcyhyZWFkUmVxdWVzdC5nZXRDaGFubmVsR3JvdXAoKSk7CisJCWNoYW5uZWxzLnB1dEFsbChyZWFkUmVxdWVzdC5nZXRDaGFubmVscygpKTsKKwkJbG9hZEFsbENoYW5uZWxzID0gcmVhZFJlcXVlc3QubG9hZEFsbENoYW5uZWxzOworCQlyZXF1ZXN0U2l6ZSA9IHJlYWRSZXF1ZXN0LmdldFJlcXVlc3RTaXplKCk7CisJCXN0YXJ0SW5kZXggPSByZWFkUmVxdWVzdC5nZXRTdGFydEluZGV4KCkgKyByZWFkUmVxdWVzdC5nZXRSZXF1ZXN0U2l6ZSgpOworCQl2YWx1ZXNNb2RlID0gcmVhZFJlcXVlc3QuZ2V0VmFsdWVzTW9kZSgpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNoYW5uZWxHcm91cCBUaGUge0BsaW5rIENoYW5uZWxHcm91cH0gaXMgdGhlIHNvdXJjZSBlbnRpdHkgdG8gYWNjZXNzCisJICogICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZCB2YWx1ZXMuCisJICovCisJcHJpdmF0ZSBSZWFkUmVxdWVzdChDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwKSB7CisJCXRoaXMuY2hhbm5lbEdyb3VwID0gY2hhbm5lbEdyb3VwOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFJlYWRSZXF1ZXN0QnVpbGRlcn0gd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIENoYW5uZWxHcm91cH0KKwkgKiBhcyB0aGUgc291cmNlIGVudGl0eSBmb3IgdGhlIHJlcXVlc3RlZCBtZWFzdXJlZCB2YWx1ZXMuCisJICoKKwkgKiA8cHJlPgorCSAqIFJlYWRSZXF1ZXN0IHJlYWRSZXF1ZXN0MSA9IFJlYWRSZXF1ZXN0LmNyZWF0ZShDaGFubmVsR3JvdXApLmFsbENoYW5uZWxzKCkgLy8gbG9hZAorCSAqIAkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZXMKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb2YKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYWxsCisJICogCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlbGF0ZWQKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2hhbm5lbHMKKwkgKiAJCS5hbGxWYWx1ZXMoKSAvLyBsb2FkIGFsbCB2YWx1ZXMgb2YgZWFjaCBjaGFubmVsCisJICogCQkuZ2V0KCk7CisJICoKKwkgKiBSZWFkUmVxdWVzdCByZWFkUmVxdWVzdDIgPSBSZWFkUmVxdWVzdC5jcmVhdGUoQ2hhbm5lbEdyb3VwKS5jaGFubmVscyhjaGFubmVsMSwgY2hhbm5lbDIpIC8vIGxvYWQKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1lYXN1cmVkCisJICogCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZXMKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCisJICogCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGVzZQorCSAqIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2hhbm5lbHMKKwkgKiAJCS5yZXF1ZXN0U2l6ZSgxXzAwMCkgLy8gbG9hZCAxMDAwIHZhbHVlcyBvZiBlYWNoIGNoYW5uZWwgKGRlZmF1bHQKKwkgKiAJCQkJCQkJLy8gaXMgMTAwXzAwMCkKKwkgKiAJCS5nZXQoKTsKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSBjaGFubmVsR3JvdXAgVXNlZCB0byBhY2Nlc3MgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUge0BsaW5rIFJlYWRSZXF1ZXN0QnVpbGRlcn0uCisJICovCisJcHVibGljIHN0YXRpYyBSZWFkUmVxdWVzdEJ1aWxkZXIgY3JlYXRlKENoYW5uZWxHcm91cCBjaGFubmVsR3JvdXApIHsKKwkJcmV0dXJuIG5ldyBSZWFkUmVxdWVzdEJ1aWxkZXIobmV3IFJlYWRSZXF1ZXN0KGNoYW5uZWxHcm91cCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHtAbGluayBDaGFubmVsfXMgd2hvc2UgdmFsdWVzIHdpbGwgYmUgbG9hZGVkIGFuZCB0aGUKKwkgKiBjb3JyZXNwb25kaW5nIHtAbGluayBVbml0fSBjb25maWd1cmF0aW9uLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIE1hcH0gaXMgZW1wdHksIGlmIHRoaXMgcmVxdWVzdCBpcyBjb25maWd1cmVkIHRvCisJICogICAgICAgICBsb2FkIHZhbHVlcyBvZiBhbGwgcmVsYXRlZCB7QGNvZGUgQ2hhbm5lbH1zLgorCSAqLworCXB1YmxpYyBNYXA8Q2hhbm5lbCwgVW5pdD4gZ2V0Q2hhbm5lbHMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoY2hhbm5lbHMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBDaGFubmVsR3JvdXB9IHdoaWNoIHdpbGwgYmUgdXNlZCBhcyB0aGUgc291cmNlIGVudGl0eSB0bworCSAqIGFjY2VzcyBtZWFzdXJlZCB2YWx1ZXMuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBtZWFzdXJlZCB2YWx1ZXMgc291cmNlLCB0aGUge0Bjb2RlIENoYW5uZWxHcm91cH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENoYW5uZWxHcm91cCBnZXRDaGFubmVsR3JvdXAoKSB7CisJCXJldHVybiBjaGFubmVsR3JvdXA7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdG8gbG9hZCBtZWFzdXJlZCB2YWx1ZXMgb2YgYWxsIHJlbGF0ZWQge0BsaW5rIENoYW5uZWx9cy4KKwkgKgorCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJlcXVlc3QgaXMgY29uZmlndXJlZCB0byBsb2FkIHZhbHVlcyBvZiBhbGwge0Bjb2RlCisJICogCQlDaGFubmVsfXMuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMb2FkQWxsQ2hhbm5lbHMoKSB7CisJCXJldHVybiBsb2FkQWxsQ2hhbm5lbHM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhbHVlcyB0aGF0IGFyZSBsb2FkZWQgcGVyIHtAbGluayBDaGFubmVsfSAuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdmFsdWVzIHBlciB7QGNvZGUgQ2hhbm5lbH0gcGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0UmVxdWVzdFNpemUoKSB7CisJCXJldHVybiByZXF1ZXN0U2l6ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvdmVyYWxsIGluZGV4IG9mIHRoZSBtZWFzdXJlZCB2YWx1ZXMgd2l0aGluIHRoZSB1bmRlcmx5aW5nCisJICoge0BsaW5rIENoYW5uZWxHcm91cH0uIFRoaXMgaW5kZXggaXMgdXNlZCB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdCBhbmQKKwkgKiBtZWFucyBob3cgbWFueSB2YWx1ZXMgb2YgdGhlIHZhbHVlcyBzZXF1ZW5jZXMgd2lsbCBiZSBza2lwcGVkLgorCSAqCisJICogQHJldHVybiBUaGUgb3ZlcmFsbCBzdGFydCBpbmRleCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgaW50IGdldFN0YXJ0SW5kZXgoKSB7CisJCXJldHVybiBzdGFydEluZGV4OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtsaW5rIFZhbHVlc01vZGV9IGZvciBtZWFzdXJlZCB2YWx1ZXMgcmV0cmlldmFsLgorCSAqCisJICogQHJldHVybiBUaGUgdmFsdWVzTW9kZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVmFsdWVzTW9kZSBnZXRWYWx1ZXNNb2RlKCkgeworCQlyZXR1cm4gdmFsdWVzTW9kZTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUGFja2FnZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQWRkcyBhIG5ldyB7QGxpbmsgQ2hhbm5lbH0gd2hvc2UgbWVhc3VyZWQgdmFsdWVzIGhhdmUgdG8gYmUgbG9hZGVkLiBUaGUKKwkgKiBtZWFzdXJlZCB2YWx1ZXMgd2lsbCBiZSByZXRyaWV2ZWQgaW4gdGhlIHVuaXQgdGhleSB3ZXJlIHN0b3JlZC4KKwkgKgorCSAqIEBwYXJhbSBjaGFubmVsIFRoaXMge0Bjb2RlIENoYW5uZWx9IGhhcyB0byByZWxhdGVkIHRvIHRoZSB1bmRlcmx5aW5nCisJICogICAgICAgICAgICAgICAge0BsaW5rIENoYW5uZWxHcm91cH0uCisJICovCisJdm9pZCBhZGRDaGFubmVsKENoYW5uZWwgY2hhbm5lbCkgeworCQlhZGRDaGFubmVsKGNoYW5uZWwsIGNoYW5uZWwuZ2V0VW5pdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgbmV3IHtAbGluayBDaGFubmVsfSB3aG9zZSBtZWFzdXJlZCB2YWx1ZXMgaGF2ZSB0byBiZSBsb2FkZWQuIFRoZQorCSAqIG1lYXN1cmVkIHZhbHVlcyB3aWxsIGJlIHJldHJpZXZlZCBpbiB0aGUgZ2l2ZW4gdW5pdC4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBUaGUgcHJvY2Vzc2luZyBvZiB0aGlzIHJlcXVlc3QgbWF5IGZhaWwgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvCisJICogY29udmVydCB0aGUgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIGNoYW5uZWwgVGhpcyB7QGNvZGUgQ2hhbm5lbH0gaGFzIHRvIHJlbGF0ZWQgdG8gdGhlIHVuZGVybHlpbmcKKwkgKiAgICAgICAgICAgICAgICB7QGxpbmsgQ2hhbm5lbEdyb3VwfS4KKwkgKiBAcGFyYW0gdW5pdCAgICB7QGNvZGUgVW5pdH0gdGhlIG1lYXN1cmVkIHZhbHVlcyBoYXZlIHRvIGJlIGxvYWRlZCBpbi4KKwkgKi8KKwl2b2lkIGFkZENoYW5uZWwoQ2hhbm5lbCBjaGFubmVsLCBVbml0IHVuaXQpIHsKKwkJY2hhbm5lbHMucHV0KGNoYW5uZWwsIHVuaXQpOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhpcyByZXF1ZXN0IHRvIHJldHJpZXZlIG1lYXN1cmVkIHZhbHVlcyBvZiBhbGwgcmVsYXRlZAorCSAqIHtAbGluayBDaGFubmVsfXMuCisJICovCisJdm9pZCBzZXRMb2FkQWxsQ2hhbm5lbHMoKSB7CisJCWxvYWRBbGxDaGFubmVscyA9IHRydWU7CisJCWNoYW5uZWxzLmNsZWFyKCk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbnVtYmVyIG9mIHZhbHVlcyB0aGF0IHdpbGwgYmUgbG9hZGVkIHBlciB7QGxpbmsgQ2hhbm5lbH0gd2hpbGUKKwkgKiBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdC4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBJZiB0aGUgcmVxdWVzdCBzaXplIGlzIHplcm8sIHRoZW4gYWxsIGF2YWlsYWJsZSBtZWFzdXJlZCB2YWx1ZXMKKwkgKiB3aWxsIGJlIGxvYWRlZCBmb3IgZWFjaCBjb25maWd1cmVkIHtAbGluayBDaGFubmVsfS4KKwkgKgorCSAqIEBwYXJhbSByZXF1ZXN0U2l6ZSBUaGUgbnVtYmVyIG9mIHZhbHVlcyBsb2FkZWQgcGVyIHtAY29kZSBDaGFubmVsfS4KKwkgKi8KKwl2b2lkIHNldFJlcXVlc3RTaXplKGludCByZXF1ZXN0U2l6ZSkgeworCQl0aGlzLnJlcXVlc3RTaXplID0gcmVxdWVzdFNpemU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbnVtYmVyIG9mIHZhbHVlcyB0aGF0IHdpbGwgYmUgc2tpcHBlZC4KKwkgKgorCSAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBudW1iZXIgb2YgdmFsdWVzIHRoYXQgd2lsbCBiZSBza2lwcGVkLgorCSAqLworCXZvaWQgc2V0U3RhcnRJbmRleChpbnQgc3RhcnRJbmRleCkgeworCQl0aGlzLnN0YXJ0SW5kZXggPSBzdGFydEluZGV4OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHtAbGluayBWYWx1ZXNNb2RlfSBmb3IgbWVhc3VyZWQgdmFsdWVzIHJldHJpZXZhbC4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWVzTW9kZSBUaGUge0BsaW5rIFZBbHVlc01vZGV9IHRvIHNldC4KKwkgKi8KKwl2b2lkIHNldFZhbHVlc01vZGUoVmFsdWVzTW9kZSB2YWx1ZXNNb2RlKSB7CisJCXRoaXMudmFsdWVzTW9kZSA9IHZhbHVlc01vZGU7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgYXJlIHN0aWxsIG1vcmUgdmFsdWVzIHRvIHJldHJpZXZlLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgdmFsdWVzIHRvIHJldHJpZXZlLgorCSAqLworCWJvb2xlYW4gaGFzTmV4dCgpIHsKKwkJcmV0dXJuIGdldFN0YXJ0SW5kZXgoKSArIGdldFJlcXVlc3RTaXplKCkgPCBnZXRDaGFubmVsR3JvdXAoKS5nZXROdW1iZXJPZlZhbHVlcygpLmludFZhbHVlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvUmVhZFJlcXVlc3RCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvUmVhZFJlcXVlc3RCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0NmJjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGEuUmVhZFJlcXVlc3QuVmFsdWVzTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVW5pdDsKKworLyoqCisgKiBCdWlsZHMgbWVhc3VyZWQgdmFsdWVzIHJlYWQgcmVxdWVzdCBjb25maWd1cmF0aW9ucy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlYWRSZXF1ZXN0QnVpbGRlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBSZWFkUmVxdWVzdCByZWFkUmVxdWVzdDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSByZWFkUmVxdWVzdCBUaGUge0BsaW5rIFJlYWRSZXF1ZXN0fSB0aGF0IHdpbGwgYmUgY29uZmlndXJlZC4KKwkgKi8KKwlSZWFkUmVxdWVzdEJ1aWxkZXIoUmVhZFJlcXVlc3QgcmVhZFJlcXVlc3QpIHsKKwkJdGhpcy5yZWFkUmVxdWVzdCA9IHJlYWRSZXF1ZXN0OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBSZWFkUmVxdWVzdH0gdG8gcmV0cmlldmUgbWVhc3VyZWQgdmFsdWVzIG9mIGFsbCByZWxhdGVkCisJICoge0BsaW5rIENoYW5uZWx9cy4KKwkgKgorCSAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdEJ1aWxkZXIgYWxsQ2hhbm5lbHMoKSB7CisJCXJlYWRSZXF1ZXN0LnNldExvYWRBbGxDaGFubmVscygpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBDaGFubmVsfXMgdG8gdGhlIHVuZGVybHlpbmcge0BsaW5rIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiB7QGNvZGUgQ2hhbm5lbH1zIGFkZGVkIHdpdGggdGhpcyBtZXRob2Qgd2lsbCBiZSBpZ25vcmVkLCBvbmNlCisJICoge0BsaW5rICNhbGxDaGFubmVscygpfSB3YXMgY2FsbGVkLgorCSAqCisJICogQHBhcmFtIGNoYW5uZWxzIFRoZSB7QGNvZGUgQ2hhbm5lbH1zIHdob3NlIG1lYXN1cmVkIHZhbHVlcyB3aWxsIGJlIGxvYWRlZC4KKwkgKiBAcmV0dXJuIFRoaXMgYnVpbGRlciBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUmVhZFJlcXVlc3RCdWlsZGVyIGNoYW5uZWxzKExpc3Q8Q2hhbm5lbD4gY2hhbm5lbHMpIHsKKwkJY2hhbm5lbHMuZm9yRWFjaChyZWFkUmVxdWVzdDo6YWRkQ2hhbm5lbCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIENoYW5uZWx9cyB0byB0aGUgdW5kZXJseWluZyB7QGxpbmsgUmVhZFJlcXVlc3R9LgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IHtAY29kZSBDaGFubmVsfXMgYWRkZWQgd2l0aCB0aGlzIG1ldGhvZCB3aWxsIGJlIGlnbm9yZWQsIG9uY2UKKwkgKiB7QGxpbmsgI2FsbENoYW5uZWxzKCl9IHdhcyBjYWxsZWQuCisJICoKKwkgKiBAcGFyYW0gY2hhbm5lbHMgVGhlIHtAY29kZSBDaGFubmVsfXMgd2hvc2UgbWVhc3VyZWQgdmFsdWVzIHdpbGwgYmUgbG9hZGVkLgorCSAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdEJ1aWxkZXIgY2hhbm5lbHMoQ2hhbm5lbC4uLiBjaGFubmVscykgeworCQlBcnJheXMuc3RyZWFtKGNoYW5uZWxzKS5mb3JFYWNoKHJlYWRSZXF1ZXN0OjphZGRDaGFubmVsKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgQ2hhbm5lbH0gdG8gdGhlIHVuZGVybHlpbmcge0BsaW5rIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiB7QGNvZGUgQ2hhbm5lbH0gYWRkZWQgd2l0aCB0aGlzIG1ldGhvZCB3aWxsIGJlIGlnbm9yZWQsIG9uY2UKKwkgKiB7QGxpbmsgI2FsbENoYW5uZWxzKCl9IHdhcyBjYWxsZWQuCisJICoKKwkgKiBAcGFyYW0gY2hhbm5lbCBUaGUge0Bjb2RlIENoYW5uZWx9IHdob3NlIG1lYXN1cmVkIHZhbHVlcyB3aWxsIGJlIGxvYWRlZC4KKwkgKiBAcGFyYW0gdW5pdCAgICBUaGUgdW5pdCBvZiB0aGUgbG9hZGVkIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAcmV0dXJuIFRoaXMgYnVpbGRlciBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUmVhZFJlcXVlc3RCdWlsZGVyIGNoYW5uZWwoQ2hhbm5lbCBjaGFubmVsLCBVbml0IHVuaXQpIHsKKwkJcmVhZFJlcXVlc3QuYWRkQ2hhbm5lbChjaGFubmVsLCB1bml0KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUgdmFsdWVzTW9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWVzTW9kZSB7QGxpbmsgVmFsdWVzTW9kZX0gdG8gdXNlIGZvciB0aGUgcmVhZCByZXF1ZXN0LgorCSAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdEJ1aWxkZXIgdmFsdWVzTW9kZShSZWFkUmVxdWVzdC5WYWx1ZXNNb2RlIHZhbHVlc01vZGUpIHsKKwkJcmVhZFJlcXVlc3Quc2V0VmFsdWVzTW9kZSh2YWx1ZXNNb2RlKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFJlYWRSZXF1ZXN0fSB0byBsb2FkIGFsbCBtZWFzdXJlZCB2YWx1ZXMgb2YgZWFjaAorCSAqIGNvbmZpZ3VyZWQge0BsaW5rIENoYW5uZWx9IGFuZCByZXR1cm5zIHRoZSBjb25maWd1cmVkIHtAY29kZQorCSAqIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBCZWZvcmUgY2FsbGluZyB0aGlzIHRoZSB7QGNvZGUgQ2hhbm5lbH1zIHdob3NlIG1lYXN1cmVkIHZhbHVlcworCSAqIGhhdmUgdG8gYmUgbG9hZGVkIG11c3QgYmUgY29uZmlndXJlZC4KKwkgKgorCSAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdCBhbGxWYWx1ZXMoKSB7CisJCXJlYWRSZXF1ZXN0LnNldFN0YXJ0SW5kZXgoMCk7CisJCXJlYWRSZXF1ZXN0LnNldFJlcXVlc3RTaXplKDApOworCQlyZXR1cm4gcmVhZFJlcXVlc3Q7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFJlYWRSZXF1ZXN0fSB0byBsb2FkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHZhbHVlcyBmb3IKKwkgKiBlYWNoIHtAbGluayBDaGFubmVsfS4gdGhpcyBpcyBhIHRlcm1pbmFsIG9wZXJhdGlvbiByZXR1cm5pbmcgdGhlIGJ1aWx0CisJICoge0BsaW5rIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBJZiB0aGUgcmVxdWVzdCBzaXplIGlzIHplcm8sIHRoZW4gYWxsIGF2YWlsYWJsZSBtZWFzdXJlZCB2YWx1ZXMKKwkgKiB3aWxsIGJlIGxvYWRlZCBmb3IgZWFjaCBjb25maWd1cmVkIHtAbGluayBDaGFubmVsfS4KKwkgKgorCSAqIEBwYXJhbSByZXF1ZXN0U2l6ZSBUaGUgcmVxdWVzdCBzaXplLgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBSZWFkUmVxdWVzdH0KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgdGhlIHJlcXVlc3Qgc2l6ZSBpcyBzbWFsbGVyIHRoYW4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdCB2YWx1ZXMoaW50IHJlcXVlc3RTaXplKSB7CisJCXJlYWRSZXF1ZXN0LnNldFN0YXJ0SW5kZXgoMCk7CisJCXJlYWRSZXF1ZXN0LnNldFJlcXVlc3RTaXplKHJlcXVlc3RTaXplKTsKKwkJcmV0dXJuIHJlYWRSZXF1ZXN0OworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBSZWFkUmVxdWVzdH0gdG8gbG9hZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB2YWx1ZXMKKwkgKiBmcm9tIGEgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGZvciBlYWNoIHtAbGluayBDaGFubmVsfS4gdGhpcyBpcyBhIHRlcm1pbmFsCisJICogb3BlcmF0aW9uIHJldHVybmluZyB0aGUgYnVpbHQge0BsaW5rIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBJZiB0aGUgcmVxdWVzdCBzaXplIGlzIHplcm8sIHRoZW4gYWxsIGF2YWlsYWJsZSBtZWFzdXJlZCB2YWx1ZXMKKwkgKiB3aWxsIGJlIGxvYWRlZCBmb3IgZWFjaCBjb25maWd1cmVkIHtAbGluayBDaGFubmVsfS4KKwkgKgorCSAqIEBwYXJhbSBzdGFydEluZGV4ICBUaGUgc3RhcnQgaW5kZXguCisJICogQHBhcmFtIHJlcXVlc3RTaXplIFRoZSByZXF1ZXN0IHNpemUuCisJICogQHJldHVybiB0aGUge0BsaW5rIFJlYWRSZXF1ZXN0fQorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB0aGUgcmVxdWVzdCBzaXplIGlzIHNtYWxsZXIgdGhhbiAwCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIHN0YXJ0IGluZGV4IGlzIHNtYWxsZXIgdGhhbiAwLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdCB2YWx1ZXMoaW50IHN0YXJ0SW5kZXgsIGludCByZXF1ZXN0U2l6ZSkgeworCQlyZWFkUmVxdWVzdC5zZXRTdGFydEluZGV4KHN0YXJ0SW5kZXgpOworCQlyZWFkUmVxdWVzdC5zZXRSZXF1ZXN0U2l6ZShyZXF1ZXN0U2l6ZSk7CisJCXJldHVybiByZWFkUmVxdWVzdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIHtAbGluayBSZWFkUmVxdWVzdEl0ZXJhYmxlfSB0byBpdGVyYXRlIG92ZXIgYWxsIGF2YWlsYWJsZQorCSAqIHtAbGluayBSZWFkUmVxdWVzdH1zLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFJlYWRSZXF1ZXN0SXRlcmFibGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdEl0ZXJhYmxlIGNyZWF0ZUl0ZXJhYmxlKCkgeworCQlyZXR1cm4gbmV3IFJlYWRSZXF1ZXN0SXRlcmFibGUocmVhZFJlcXVlc3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1JlYWRSZXF1ZXN0SXRlcmFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdEl0ZXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiOGM3OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdEl0ZXJhYmxlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIGFuIHJlYWQgcmVxdWVzdCBpdGVyYWJsZSBmb3IgY29tZm9ydGFibGUgcHJvY2Vzc2luZyBvZiBzdWJzZXF1ZW50CisgKiB7QGxpbmsgUmVhZFJlcXVlc3R9cworICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVhZFJlcXVlc3RJdGVyYWJsZSBpbXBsZW1lbnRzIEl0ZXJhYmxlPFJlYWRSZXF1ZXN0PiwgSXRlcmF0b3I8UmVhZFJlcXVlc3Q+IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIFJlYWRSZXF1ZXN0IHJlYWRSZXF1ZXN0OworCXByaXZhdGUgaW50IGNvdW50OworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHJlYWRSZXF1ZXN0IFRoZSB7QGxpbmsgUmVhZFJlcXVlc3R9LgorCSAqLworCVJlYWRSZXF1ZXN0SXRlcmFibGUoUmVhZFJlcXVlc3QgcmVhZFJlcXVlc3QpIHsKKwkJdGhpcy5yZWFkUmVxdWVzdCA9IHJlYWRSZXF1ZXN0OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworCQlyZXR1cm4gY291bnQgPT0gMCB8fCByZWFkUmVxdWVzdC5oYXNOZXh0KCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZWFkUmVxdWVzdCBuZXh0KCkgeworCQlpZiAoaGFzTmV4dCgpKSB7CisJCQlyZWFkUmVxdWVzdCA9IGNvdW50ID09IDAgPyByZWFkUmVxdWVzdCA6IG5ldyBSZWFkUmVxdWVzdChyZWFkUmVxdWVzdCk7CisJCQljb3VudCsrOworCQkJcmV0dXJuIHJlYWRSZXF1ZXN0OworCQl9CisKKwkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIlN1YnNlcXVlbnQgcmVhZCByZXF1ZXN0IGlzIG5vdCBhdmFpbGFibGUuIik7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxSZWFkUmVxdWVzdD4gaXRlcmF0b3IoKSB7CisJCXJldHVybiB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1VuaXRCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvVW5pdEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Q4YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1VuaXRCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworCisvKioKKyAqIFRoaXMgYnVpbGRlciBhbGxvd3MgdG8gc3BlY2lmeSBhIHNvdXJjZSB7QGxpbmsgVW5pdH0gd2hpY2ggaXMgZGlmZmVyZW50IHRvCisgKiB0aGUgb3JpZ2luIHtAY29kZSBVbml0fSBvZiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ2hhbm5lbH0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVbml0QnVpbGRlciBleHRlbmRzIFdyaXRlUmVxdWVzdEZpbmFsaXplciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSwgd2hvc2UgbWVhc3VyZWQgdmFsdWUncyBzb3VyY2UKKwkgKiAgICAgICAgICAgICAgICAgICAgIHtAbGluayBVbml0fSBtYXkgYmUgZGVmaW5lZC4KKwkgKi8KKwlVbml0QnVpbGRlcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXN1cGVyKHdyaXRlUmVxdWVzdCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogU2V0cyBhIHNvdXJjZSB7QGxpbmsgVW5pdH0gZm9yIHRoZSBwcmV2aW91c2x5IGRlZmluZWQgbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIHNvdXJjZVVuaXQgVGhlIHNvdXJjZSB7QGNvZGUgVW5pdH0uCisJICogQHJldHVybiBUaGUge0BsaW5rIFdyaXRlUmVxdWVzdEZpbmFsaXplcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFdyaXRlUmVxdWVzdEZpbmFsaXplciBzb3VyY2VVbml0KFVuaXQgc291cmNlVW5pdCkgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRTb3VyY2VVbml0KHNvdXJjZVVuaXQpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Vbml0SW5kZXBlbmRlbnRCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvVW5pdEluZGVwZW5kZW50QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTEyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvVW5pdEluZGVwZW5kZW50QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworCisvKioKKyAqIFRoaXMgYnVpbGRlciBhbGxvd3MgdG8gc3BlY2lmeSBhIHNvdXJjZSB7QGxpbmsgVW5pdH0gd2hpY2ggaXMgZGlmZmVyZW50IHRvCisgKiB0aGUgb3JpZ2luIHtAY29kZSBVbml0fSBvZiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ2hhbm5lbH0uIEluIEFkZGl0aW9uIHRvCisgKiB0aGF0IHRoaXMgYnVpbGRlciBhbGxvd3MgdG8gY29uZmlndXJlIG51bWVyaWNhbGx5IHNvcnRhYmxlIG1lYXN1cmVkIHZhbHVlcyB0bworICogYmUgaW5kZXBlbmRlbnQsIHdoaWNoIG1lYW5zIHRoZSBtZWFzdXJlZCB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aG9zZSBvZgorICogb3RoZXIge0BsaW5rIENoYW5uZWx9cyB3aXRoaW4gdGhlaXIgY29tbW9uIHtAbGluayBDaGFubmVsR3JvdXB9LiBUaGUKKyAqIG51bWVyaWNhbGx5IHNvcnRhYmxlIHR5cGVzIGFyZSBsaXN0ZWQgYmVsb3c6CisgKgorICogPHVsPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0RBVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVW5pdEluZGVwZW5kZW50QnVpbGRlciBleHRlbmRzIEluZGVwZW5kZW50QnVpbGRlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aG9zZSBtZWFzdXJlZCB2YWx1ZXMgc291cmNlCisJICogICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVW5pdH0gbWF5IGJlIGNoYW5nZWQgb3IgbWFya2VkIGFzIGluZGVwZW5kZW50LgorCSAqLworCVVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoV3JpdGVSZXF1ZXN0IHdyaXRlUmVxdWVzdCkgeworCQlzdXBlcih3cml0ZVJlcXVlc3QpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFNldHMgYSBzb3VyY2Uge0BsaW5rIFVuaXR9IGZvciB0aGUgcHJldmlvdXNseSBkZWZpbmVkIG1lYXN1cmVkIHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2VVbml0IFRoZSBzb3VyY2Uge0Bjb2RlIFVuaXR9LgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbmRlcGVuZGVudEJ1aWxkZXIgc291cmNlVW5pdChVbml0IHNvdXJjZVVuaXQpIHsKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0U291cmNlVW5pdChzb3VyY2VVbml0KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyYzA3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Xcml0ZVJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDM3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkF4aXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNjYWxhclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNlcXVlbmNlUmVwcmVzZW50YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlVuaXQ7CisKKy8qKgorICogSG9sZHMgcmVxdWlyZWQgZGF0YSB0byB3cml0ZSBtYXNzIGRhdGEuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXcml0ZVJlcXVlc3QgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgTGlzdDxFeHRlcm5hbENvbXBvbmVudD4gZXh0ZXJuYWxDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwOworCXByaXZhdGUgZmluYWwgQ2hhbm5lbCBjaGFubmVsOworCXByaXZhdGUgZmluYWwgQXhpc1R5cGUgYXhpc1R5cGU7CisKKwlwcml2YXRlIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwlwcml2YXRlIGRvdWJsZVtdIGdlbmVyYXRpb25QYXJhbWV0ZXJzOworCXByaXZhdGUgYm9vbGVhbiBpbmRlcGVuZGVudDsKKworCXByaXZhdGUgU2NhbGFyVHlwZSByYXdTY2FsYXJUeXBlOworCXByaXZhdGUgT2JqZWN0IHZhbHVlczsKKwlwcml2YXRlIGJvb2xlYW4gYWxsVmFsaWQ7CisJcHJpdmF0ZSBib29sZWFuW10gZmxhZ3M7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY2hhbm5lbEdyb3VwIFRoZSB7QGxpbmsgQ2hhbm5lbEdyb3VwfSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqIEBwYXJhbSBjaGFubmVsICAgICAgVGhlIHtAbGluayBDaGFubmVsfSBzcGVjaWZpZWQgbWFzcyBkYXRhIHdpbGwgYmUgZGVkaWNhdGVkCisJICogICAgICAgICAgICAgICAgICAgICB0by4KKwkgKiBAcGFyYW0gYXhpc1R5cGUgICAgIFRoZSB7QGxpbmsgQXhpc1R5cGV9IG9mIHRoZSB3cml0dGVuIG1hc3MgZGF0YS4KKwkgKi8KKwlwcml2YXRlIFdyaXRlUmVxdWVzdChDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwLCBDaGFubmVsIGNoYW5uZWwsIEF4aXNUeXBlIGF4aXNUeXBlKSB7CisJCXRoaXMuY2hhbm5lbEdyb3VwID0gY2hhbm5lbEdyb3VwOworCQl0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworCQl0aGlzLmF4aXNUeXBlID0gYXhpc1R5cGU7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogU3RhcnRzIGEgbmV3IHtAbGluayBXcml0ZVJlcXVlc3R9IGJ5IHJldHVybmluZyBhIHtAbGluayBXcml0ZVJlcXVlc3RCdWlsZGVyfS4KKwkgKgorCSAqIEBwYXJhbSBjaGFubmVsR3JvdXAgVGhlIHtAbGluayBDaGFubmVsR3JvdXB9IGZvciB0aGlzIHJlcXVlc3QuCisJICogQHBhcmFtIGNoYW5uZWwgICAgICBUaGUge0BsaW5rIENoYW5uZWx9IHNwZWNpZmllZCBtYXNzIGRhdGEgd2lsbCBiZSBkZWRpY2F0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgIHRvLgorCSAqIEBwYXJhbSBheGlzVHlwZSAgICAgVGhlIHtAbGluayBBeGlzVHlwZX0gb2YgdGhlIHdyaXR0ZW4gbWFzcyBkYXRhLgorCSAqIEByZXR1cm4gQSB7QGNvZGUgV3JpdGVSZXF1ZXN0QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIHN0YXRpYyBXcml0ZVJlcXVlc3RCdWlsZGVyIGNyZWF0ZShDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwLCBDaGFubmVsIGNoYW5uZWwsIEF4aXNUeXBlIGF4aXNUeXBlKSB7CisJCXJldHVybiBuZXcgV3JpdGVSZXF1ZXN0QnVpbGRlcihuZXcgV3JpdGVSZXF1ZXN0KGNoYW5uZWxHcm91cCwgY2hhbm5lbCwgYXhpc1R5cGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2hhbm5lbEdyb3VwfSBvZiB0aGlzIHJlcXVlc3QuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ2hhbm5lbEdyb3VwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ2hhbm5lbEdyb3VwIGdldENoYW5uZWxHcm91cCgpIHsKKwkJcmV0dXJuIGNoYW5uZWxHcm91cDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2hhbm5lbH0gb2YgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENoYW5uZWx9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDaGFubmVsIGdldENoYW5uZWwoKSB7CisJCXJldHVybiBjaGFubmVsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBBeGlzVHlwZX0gb2YgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEF4aXNUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQXhpc1R5cGUgZ2V0QXhpc1R5cGUoKSB7CisJCXJldHVybiBheGlzVHlwZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2VxdWVuY2VSZXByZXNlbnRhdGlvbn0gb2YgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIGdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKSB7CisJCXJldHVybiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBvZiB0aGlzIHJlcXVlc3QuIFRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkCisJICogYXJyYXkgZGVwZW5kcyBvbiB0aGUge0BsaW5rIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IG9mIHRoaXMgcmVxdWVzdC4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5PVEU6PC9iPiBJbiBjYXNlIG9mIGFuIGltcGxpY2l0IHNlcXVlbmNlIHJlcHJlc2VudGF0aW9uIHRoaXMgbWV0aG9kIHdpbGwKKwkgKiBhbHdheXMgcmV0dXJuIGFuIGVtcHR5IGFycmF5IHNpbmNlIHRoZXNlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBhcmUgY29ycmVjdGx5CisJICogdHlwZWQgYW5kIHN0b3JlZCBhcyBtZWFzdXJlZCB2YWx1ZXMuCisJICoKKwkgKiBAcmV0dXJuIElmIG5vbmUgYXZhaWxhYmxlLCB0aGVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBkb3VibGVbXSBnZXRHZW5lcmF0aW9uUGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIGdlbmVyYXRpb25QYXJhbWV0ZXJzID09IG51bGwgPyBuZXcgZG91YmxlWzBdIDogZ2VuZXJhdGlvblBhcmFtZXRlcnMuY2xvbmUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbmRlcGVuZGVudCBmbGFnIG9mIHRoaXMgcmVxdWVzdC4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1lYXN1cmVkIHZhbHVlcyBkbyBub3QgZGVwZW5kIG9uIHRob3NlIG9mCisJICogICAgICAgICBvdGhlciB7QGxpbmsgQ2hhbm5lbH1zIHdpdGhpbiB0aGVpciBjb21tb24ge0BsaW5rIENoYW5uZWxHcm91cH0uCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbmRlcGVuZGVudCgpIHsKKwkJcmV0dXJuIGluZGVwZW5kZW50OworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgcmVxdWVzdCBoYXMgbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB7QGxpbmsgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNpc0V4dGVybmFsKCl9CisJICogICAgICAgICByZXR1cm5zIHtAY29kZSBmYWxzZX0uCisJICogQHNlZSAjaGFzRXh0ZXJuYWxDb21wb25lbnRzKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNWYWx1ZXMoKSB7CisJCXJldHVybiAhZ2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbigpLmlzRXh0ZXJuYWwoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdG9yZWQgbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHJldHVybiBUaGUgbWVhc3VyZWQgdmFsdWVzIGFyZSByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYgdmFsdWVzIGFyZSBub3QgYXZhaWxhYmxlLgorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVzKCkgeworCQlpZiAoaGFzVmFsdWVzKCkpIHsKKwkJCXJldHVybiB2YWx1ZXM7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJWYWx1ZXMgYXJlIG5vdCBhdmFpbGFibGUuIik7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyByZXF1ZXN0IGhhcyBtZWFzdXJlZCB2YWx1ZXMsIHN0b3JlZCBpbiBleHRlcm5hbGx5IGxpbmtlZAorCSAqIGZpbGVzLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB7QGxpbmsgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNpc0V4dGVybmFsKCl9CisJICogICAgICAgICByZXR1cm5zIHtAY29kZSB0cnVlfS4KKwkgKiBAc2VlICNoYXNWYWx1ZXMoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0V4dGVybmFsQ29tcG9uZW50cygpIHsKKwkJcmV0dXJuIGdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKS5pc0V4dGVybmFsKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbnMgZm9yIG1lYXN1cmVkIHZhbHVlcyBzdG9yZWQgaW4gZXh0ZXJuYWxseQorCSAqIHJlZmVyZW5jZWQgZmlsZXMuCisJICogCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiBjb25maWd1cmF0aW9ucyBhcmUgbm90IGF2YWlsYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxFeHRlcm5hbENvbXBvbmVudD4gZ2V0RXh0ZXJuYWxDb21wb25lbnRzKCkgeworCQlpZiAoIWhhc0V4dGVybmFsQ29tcG9uZW50cygpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHRlcm5hbCBjb21wb25lbnRzIGFyZSBub3QgYXZhaWxhYmxlLiIpOworCQl9CisKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZXh0ZXJuYWxDb21wb25lbnRzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2NhbGFyVHlwZX0gb2YgdGhlIHN0b3JlZCBtZWFzdXJlZCB2YWx1ZSBzZXF1ZW5jZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJhdyB7QGNvZGUgU2NhbGFyVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFNjYWxhclR5cGUgZ2V0UmF3U2NhbGFyVHlwZSgpIHsKKwkJcmV0dXJuIHJhd1NjYWxhclR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCB7QGxpbmsgU2NhbGFyVHlwZX0gd2hpY2ggcmVmbGVjdHMgdGhlIGZpbmFsCisJICoge0Bjb2RlIFNjYWxhclR5cGV9IG9mIHRoZSBnZW5lcmF0ZWQgbWVhc3VyZWQgdmFsdWUgc2VxdWVuY2UuIElmCisJICoge0BsaW5rICNnZXRHZW5lcmF0aW9uUGFyYW1ldGVycygpfSByZXR1cm5zIGEgbm90IGVtcHR5IGFycmF5IGFuZAorCSAqIHtAbGluayAjZ2V0UmF3U2NhbGFyVHlwZSgpfSBpcyBhbiBpbnRlZ2VyIHR5cGUgKGJ5dGUsIHNob3J0LCBpbnQsIGxvbmcpLCB0aGVuCisJICogdGhlIHJldHVybmVkIHtAY29kZSBTY2FsYXJUeXBlfSBpcyBidW1wZWQgdG8gdGhlIG5leHQgc3VpdGFibGUgZmxvYXRpbmcgcG9pbnQKKwkgKiB0eXBlIGFzIGxpc3RlZCBiZWxvdzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjQllURX0gLSZndDsge0BsaW5rIFNjYWxhclR5cGUjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9IC0mZ3Q7IHtAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0lOVEVHRVJ9IC0mZ3Q7IHtAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0xPTkd9IC0mZ3Q7IHtAbGluayBTY2FsYXJUeXBlI0RPVUJMRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFRoZSBjYWxjdWxhdGVkIHtAY29kZSBTY2FsYXJUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU2NhbGFyVHlwZSBnZXRDYWxjdWxhdGVkU2NhbGFyVHlwZSgpIHsKKwkJaWYgKGdldEdlbmVyYXRpb25QYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCAmJiBnZXRSYXdTY2FsYXJUeXBlKCkuaXNJbnRlZ2VyVHlwZSgpKSB7CisJCQlyZXR1cm4gZ2V0UmF3U2NhbGFyVHlwZSgpLmlzTG9uZygpID8gU2NhbGFyVHlwZS5ET1VCTEUgOiBTY2FsYXJUeXBlLkZMT0FUOworCQl9CisKKwkJcmV0dXJuIGdldFJhd1NjYWxhclR5cGUoKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBhbGwgbWVhc3VyZWQgdmFsdWVzIHdpdGhpbiB0aGUgd2hvbGUgc2VxdWVuY2UgYXJlIHZhbGlkLiBJZgorCSAqIHRoaXMgbWV0aG9kIHJldHVybnMge0Bjb2RlIHRydWV9LCB0aGVuIHtAbGluayAjZ2V0RmxhZ3MoKX0gd2lsbCByZXR1cm4gYW4KKwkgKiBlbXB0eSBhcnJheS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgYWxsIG1lYXN1cmVkIHZhbHVlcyBhcmUgdmFsaWQuCisJICogQHNlZSAjZ2V0RmxhZ3MoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGFyZUFsbFZhbGlkKCkgeworCQlyZXR1cm4gYWxsVmFsaWQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsaWRpdHkgZmxhZ3Mgc2VxdWVuY2UgZm9yIHRoZSBzdG9yZWQgbWVhc3VyZWQgdmFsdWVzLiBJZgorCSAqIHtAbGluayAjYXJlQWxsVmFsaWQoKX0gcmV0dXJucyB7QGNvZGUgZmFsc2V9IHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIGFycmF5CisJICogd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIG1lYXN1cmVkIHZhbHVlcyBzZXF1ZW5jZSwgd2hlcmUgZWFjaCBmbGFnCisJICogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgbWVhc3VyZWQgdmFsdWUgaXMgdmFsaWQgb3Igbm90LgorCSAqCisJICogQHJldHVybiBUaGUgdmFsaWRpdHkgZmxhZ3Mgc2VxdWVuY2UgaXMgcmV0dXJuZWQuCisJICogQHNlZSAjYWxsVmFsaWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbltdIGdldEZsYWdzKCkgeworCQlyZXR1cm4gZmxhZ3MuY2xvbmUoKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUGFja2FnZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogU2V0cyB0aGUge0BsaW5rIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IGZvciB0aGlzIHJlcXVlc3QuCisJICoKKwkgKiBAcGFyYW0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbiBUaGUge0BsaW5rIFNlcXVlbmNlUmVwcmVzZW50YXRpb259LgorCSAqLworCXZvaWQgc2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbihTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIHNlcXVlbmNlUmVwcmVzZW50YXRpb24pIHsKKwkJdGhpcy5zZXF1ZW5jZVJlcHJlc2VudGF0aW9uID0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIGdlbmVyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHBhcmFtIGdlbmVyYXRpb25QYXJhbWV0ZXJzIFRoZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnMuCisJICovCisJdm9pZCBzZXRHZW5lcmF0aW9uUGFyYW1ldGVycyhkb3VibGVbXSBnZW5lcmF0aW9uUGFyYW1ldGVycykgeworCQl0aGlzLmdlbmVyYXRpb25QYXJhbWV0ZXJzID0gZ2VuZXJhdGlvblBhcmFtZXRlcnMuY2xvbmUoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBpbmRlcGVuZGVudCBmbGFnIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJdm9pZCBzZXRJbmRlcGVuZGVudCgpIHsKKwkJaW5kZXBlbmRlbnQgPSB0cnVlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGluZGVwZW5kZW50IGZsYWcgZm9yIHRoaXMgcmVxdWVzdCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkLgorCSAqIAorCSAqIEBwYXJhbSBpbmRlcGVuZGVudCBUaGUgaW5kZXBlbmRlbnQgZmxhZy4KKwkgKi8KKwl2b2lkIHNldEluZGVwZW5kZW50KGJvb2xlYW4gaW5kZXBlbmRlbnQpIHsKKwkJdGhpcy5pbmRlcGVuZGVudCA9IGluZGVwZW5kZW50OworCX0KKworCS8qKgorCSAqIFRyaWdnZXJzIGFuIGFkanVzdG1lbnQgb2YgdGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBhbmQgbW9kaWZpY2F0aW9uIG9mIHRoZQorCSAqIHtAbGluayBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSBvZiB0aGlzIHJlcXVlc3QgdG8gbWF0Y2ggdGhlIHtAbGluayBDaGFubmVsfXMKKwkgKiBkZWZhdWx0IHtAbGluayBVbml0fS4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2VVbml0IFRoZSB7QGxpbmsgVW5pdH0gb2YgdGhlIG1lYXN1cmVkIHZhbHVlcy4KKwkgKi8KKwl2b2lkIHNldFNvdXJjZVVuaXQoVW5pdCBzb3VyY2VVbml0KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ29udmVyc2lvbiBiZXR3ZWVuIHVuaXRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgcmF3IHtAbGluayBTY2FsYXJUeXBlfSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHBhcmFtIHJhd1NjYWxhclR5cGUgVGhlIHtAbGluayBTY2FsYXJUeXBlfS4KKwkgKi8KKwl2b2lkIHNldFJhd1NjYWxhclR5cGUoU2NhbGFyVHlwZSByYXdTY2FsYXJUeXBlKSB7CisJCXRoaXMucmF3U2NhbGFyVHlwZSA9IHJhd1NjYWxhclR5cGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbWVhc3VyZWQgdmFsdWVzIHNlcXVlbmNlIHdoZXJlIGVhY2ggdmFsdWUgaW4gdGhlIHNlcXVlbmNlIGlzCisJICogZXhwZWN0ZWQgdG8gYmUgdmFsaWQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSBtZWFzdXJlZCB2YWx1ZSBzZXF1ZW5jZS4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNoYXNWYWx1ZXMoKX0gcmV0dXJucworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBmYWxzZX0uCisJICovCisJdm9pZCBzZXRWYWx1ZXMoT2JqZWN0IHZhbHVlcykgeworCQlpZiAoaGFzVmFsdWVzKCkpIHsKKwkJCXRoaXMudmFsdWVzID0gdmFsdWVzOworCQkJYWxsVmFsaWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWVhc3VyZWQgdmFsdWVzIHN0b3JlZCBpbiBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcyBleHBlY3RlZC4iKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG1lYXN1cmVkIHZhbHVlcyBzZXF1ZW5jZSB3aGVyZSBlYWNoIHZhbHVlJ3MgdmFsaWRpdHkgaXMgc3BlY2lmaWVkIGluCisJICogdGhlIGdpdmVuIGZsYWdzIGFycmF5LgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUgbWVhc3VyZWQgdmFsdWUgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZyBzZXF1ZW5jZS4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNoYXNWYWx1ZXMoKX0gcmV0dXJucworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBmYWxzZX0uCisJICovCisJdm9pZCBzZXRWYWx1ZXMoT2JqZWN0IHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWlmIChoYXNWYWx1ZXMoKSkgeworCQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisJCQl0aGlzLmZsYWdzID0gZmxhZ3MuY2xvbmUoKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lYXN1cmVkIHZhbHVlcyBzdG9yZWQgaW4gZXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMgZXhwZWN0ZWQuIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgY29uZmlndXJhdGlvbiBmb3IgbWVhc3VyZWQgdmFsdWVzIHN0b3JlZCBpbiBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcy4KKwkgKgorCSAqIEBwYXJhbSBleHRlcm5hbENvbXBvbmVudCBUaGUgbmV3IGNvbmZpZ3VyYXRpb24uCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIGlmIHtAbGluayAjaGFzRXh0ZXJuYWxDb21wb25lbnRzKCl9CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyB7QGNvZGUgZmFsc2V9LgorCSAqLworCXZvaWQgYWRkRXh0ZXJuYWxDb21wb25lbnQoRXh0ZXJuYWxDb21wb25lbnQgZXh0ZXJuYWxDb21wb25lbnQpIHsKKwkJaWYgKGhhc0V4dGVybmFsQ29tcG9uZW50cygpKSB7CisJCQlleHRlcm5hbENvbXBvbmVudHMuYWRkKGV4dGVybmFsQ29tcG9uZW50KTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lYXN1cmVkIHZhbHVlcyBleHBlY3RlZCIpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1dyaXRlUmVxdWVzdEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjNmYjJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1dyaXRlUmVxdWVzdEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDI3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworCisvKioKKyAqIEJ1aWxkcyBtZWFzdXJlZCB2YWx1ZXMgd3JpdGUgcmVxdWVzdCBjb25maWd1cmF0aW9ucy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdyaXRlUmVxdWVzdEJ1aWxkZXIgZXh0ZW5kcyBCYXNlVmFsdWVzQnVpbGRlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aGljaCB3aWxsIGJlIGNvbmZpZ3VyZWQuCisJICovCisJV3JpdGVSZXF1ZXN0QnVpbGRlcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXN1cGVyKHdyaXRlUmVxdWVzdCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gdG8gY3JlYXRlIGFuIGV4cGxpY2l0IHNlcXVlbmNlIG9mCisJICogbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHJldHVybiBBbiB7QGxpbmsgQW55VHlwZVZhbHVlc0J1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqIEBzZWUgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNFWFBMSUNJVAorCSAqLworCXB1YmxpYyBBbnlUeXBlVmFsdWVzQnVpbGRlciBleHBsaWNpdCgpIHsKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbihTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lUKTsKKwkJcmV0dXJuIG5ldyBBbnlUeXBlVmFsdWVzQnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gdG8gY3JlYXRlIGFuIGltcGxpY2l0IGNvbnN0YW50IHNlcXVlbmNlCisJICogb2YgbWVhc3VyZWQgdmFsdWVzLiBBbiBpbXBsaWNpdCBzZXF1ZW5jZSBhbGxvd3Mgb25seSBudW1lcmljYWwKKwkgKiB7QGxpbmsgU2NhbGFyVHlwZX1zIGFzIGxpc3RlZCBiZWxvdzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjQllURX08L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNTSE9SVH08L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0xPTkd9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBHaXZlbiBvZmZzZXQgd2lsbCBiZSBjYXN0IHRvIGFuIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB0eXBlLgorCSAqCisJICogQHBhcmFtIHNjYWxhclR5cGUgVGhlIHtAY29kZSBTY2FsYXJUeXBlfSBvZiBlYWNoIHNpbmdsZSBtZWFzdXJlZCB2YWx1ZSBpbiB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS4KKwkgKiBAcGFyYW0gb2Zmc2V0ICAgICBUaGUgY29uc3RhbnQgdmFsdWUuCisJICogQHJldHVybiBBbiB7QGxpbmsgVW5pdEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB7QGNvZGUgU2NhbGFyVHlwZX0gaXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLgorCSAqIEBzZWUgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNJTVBMSUNJVF9DT05TVEFOVAorCSAqLworCXB1YmxpYyBVbml0QnVpbGRlciBpbXBsaWNpdENvbnN0YW50KFNjYWxhclR5cGUgc2NhbGFyVHlwZSwgZG91YmxlIG9mZnNldCkgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uSU1QTElDSVRfQ09OU1RBTlQpOworCisJCU9iamVjdCB2YWx1ZXM7CisJCWlmIChzY2FsYXJUeXBlLmlzQnl0ZSgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIG9mZnNldCB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNTaG9ydCgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgc2hvcnRbXSB7IChzaG9ydCkgb2Zmc2V0IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc0ludGVnZXIoKSkgeworCQkJdmFsdWVzID0gbmV3IGludFtdIHsgKGludCkgb2Zmc2V0IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc0xvbmcoKSkgeworCQkJdmFsdWVzID0gbmV3IGxvbmdbXSB7IChsb25nKSBvZmZzZXQgfTsKKwkJfSBlbHNlIGlmIChzY2FsYXJUeXBlLmlzRmxvYXQoKSkgeworCQkJdmFsdWVzID0gbmV3IGZsb2F0W10geyAoZmxvYXQpIG9mZnNldCB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNEb3VibGUoKSkgeworCQkJdmFsdWVzID0gbmV3IGRvdWJsZVtdIHsgb2Zmc2V0IH07CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTY2FsYXIgdHlwZSAnIiArIHNjYWxhclR5cGUgKyAiJyBpcyBub3Qgc3VwcG9ydGVkLiIpOworCQl9CisJCWNyZWF0ZVZhbHVlcyhzY2FsYXJUeXBlLCB2YWx1ZXMpOworCisJCXJldHVybiBuZXcgVW5pdEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHRvIGNyZWF0ZSBhbiBpbXBsaWNpdCBsaW5lYXIgc2VxdWVuY2Ugb2YKKwkgKiBtZWFzdXJlZCB2YWx1ZXMuIEFuIGltcGxpY2l0IHNlcXVlbmNlIGFsbG93cyBvbmx5IG51bWVyaWNhbAorCSAqIHtAbGluayBTY2FsYXJUeXBlfXMgYXMgbGlzdGVkIGJlbG93OgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI1NIT1JUfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0lOVEVHRVJ9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNGTE9BVH08L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNET1VCTEV9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IEdpdmVuIHN0YXJ0IGFuZCBpbmNyZW1lbnQgd2lsbCBiZSBjYXN0IHRvIGFuIGFzc2lnbm1lbnQKKwkgKiBjb21wYXRpYmxlIHR5cGUuCisJICoKKwkgKiBAcGFyYW0gc2NhbGFyVHlwZSBUaGUge0Bjb2RlIFNjYWxhclR5cGV9IG9mIGVhY2ggc2luZ2xlIG1lYXN1cmVkIHZhbHVlIGluIHRoZQorCSAqICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLgorCSAqIEBwYXJhbSBzdGFydCAgICAgIFRoZSBzdGFydCB2YWx1ZSBvZiB0aGUgbGluZS4KKwkgKiBAcGFyYW0gaW5jcmVtZW50ICBUaGUgZ3JhZGllbnQgb2YgdGhlIGxpbmUuCisJICogQHJldHVybiBBbiB7QGxpbmsgVW5pdEluZGVwZW5kZW50QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHtAY29kZSBTY2FsYXJUeXBlfSBpcyBub3QKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuCisJICogQHNlZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uI0lNUExJQ0lUX0xJTkVBUgorCSAqLworCXB1YmxpYyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGltcGxpY2l0TGluZWFyKFNjYWxhclR5cGUgc2NhbGFyVHlwZSwgZG91YmxlIHN0YXJ0LCBkb3VibGUgaW5jcmVtZW50KSB7CisJCWdldFdyaXRlUmVxdWVzdCgpLnNldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5JTVBMSUNJVF9MSU5FQVIpOworCisJCU9iamVjdCB2YWx1ZXM7CisJCWlmIChzY2FsYXJUeXBlLmlzQnl0ZSgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIHN0YXJ0LCAoYnl0ZSkgaW5jcmVtZW50IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc1Nob3J0KCkpIHsKKwkJCXZhbHVlcyA9IG5ldyBzaG9ydFtdIHsgKHNob3J0KSBzdGFydCwgKHNob3J0KSBpbmNyZW1lbnQgfTsKKwkJfSBlbHNlIGlmIChzY2FsYXJUeXBlLmlzSW50ZWdlcigpKSB7CisJCQl2YWx1ZXMgPSBuZXcgaW50W10geyAoaW50KSBzdGFydCwgKGludCkgaW5jcmVtZW50IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc0xvbmcoKSkgeworCQkJdmFsdWVzID0gbmV3IGxvbmdbXSB7IChsb25nKSBzdGFydCwgKGxvbmcpIGluY3JlbWVudCB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNGbG9hdCgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgZmxvYXRbXSB7IChmbG9hdCkgc3RhcnQsIChmbG9hdCkgaW5jcmVtZW50IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc0RvdWJsZSgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgZG91YmxlW10geyBzdGFydCwgaW5jcmVtZW50IH07CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTY2FsYXIgdHlwZSAnIiArIHNjYWxhclR5cGUgKyAiJyBpcyBub3Qgc3VwcG9ydGVkLiIpOworCQl9CisJCWNyZWF0ZVZhbHVlcyhzY2FsYXJUeXBlLCB2YWx1ZXMpOworCisJCXJldHVybiBuZXcgVW5pdEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gdG8gY3JlYXRlIGFuIGltcGxpY2l0IHNhdyBzZXF1ZW5jZSBvZgorCSAqIG1lYXN1cmVkIHZhbHVlcy4gQW4gaW1wbGljaXQgc2VxdWVuY2UgYWxsb3dzIG9ubHkgbnVtZXJpY2FsCisJICoge0BsaW5rIFNjYWxhclR5cGV9cyBhcyBsaXN0ZWQgYmVsb3c6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0JZVEV9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjSU5URUdFUn08L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNMT05HfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0RPVUJMRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gR2l2ZW4gc3RhcnQsIGluY3JlbWVudCBhbmQgdmFsdWVzUGVyU2F3IHdpbGwgYmUgY2FzdCB0byBhbgorCSAqIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB0eXBlLgorCSAqCisJICogQHBhcmFtIHNjYWxhclR5cGUgICBUaGUge0Bjb2RlIFNjYWxhclR5cGV9IG9mIGVhY2ggc2luZ2xlIG1lYXN1cmVkIHZhbHVlIGluCisJICogICAgICAgICAgICAgICAgICAgICB0aGUgc2VxdWVuY2UuCisJICogQHBhcmFtIHN0YXJ0ICAgICAgICBUaGUgc3RhcnQgdmFsdWUgb2YgZWFjaCBzYXcgY3ljbGUuCisJICogQHBhcmFtIGluY3JlbWVudCAgICBUaGUgaW5jcmVtZW50LgorCSAqIEBwYXJhbSB2YWx1ZXNQZXJTYXcgVGhlIG51bWJlciBvZiB2YWx1ZXMgcGVyIHNhdy4KKwkgKiBAcmV0dXJuIEFuIHtAbGluayBVbml0QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHtAY29kZSBTY2FsYXJUeXBlfSBpcyBub3QKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuCisJICogQHNlZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uI0lNUExJQ0lUX1NBVworCSAqLworCXB1YmxpYyBVbml0QnVpbGRlciBpbXBsaWNpdFNhdyhTY2FsYXJUeXBlIHNjYWxhclR5cGUsIGRvdWJsZSBzdGFydCwgZG91YmxlIGluY3JlbWVudCwgZG91YmxlIHZhbHVlc1BlclNhdykgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uSU1QTElDSVRfU0FXKTsKKworCQlPYmplY3QgdmFsdWVzOworCQlpZiAoc2NhbGFyVHlwZS5pc0J5dGUoKSkgeworCQkJdmFsdWVzID0gbmV3IGJ5dGVbXSB7IChieXRlKSBzdGFydCwgKGJ5dGUpIGluY3JlbWVudCwgKGJ5dGUpIHZhbHVlc1BlclNhdyB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNTaG9ydCgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgc2hvcnRbXSB7IChzaG9ydCkgc3RhcnQsIChzaG9ydCkgaW5jcmVtZW50LCAoc2hvcnQpIHZhbHVlc1BlclNhdyB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNJbnRlZ2VyKCkpIHsKKwkJCXZhbHVlcyA9IG5ldyBpbnRbXSB7IChpbnQpIHN0YXJ0LCAoaW50KSBpbmNyZW1lbnQsIChpbnQpIHZhbHVlc1BlclNhdyB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNMb25nKCkpIHsKKwkJCXZhbHVlcyA9IG5ldyBsb25nW10geyAobG9uZykgc3RhcnQsIChsb25nKSBpbmNyZW1lbnQsIChsb25nKSB2YWx1ZXNQZXJTYXcgfTsKKwkJfSBlbHNlIGlmIChzY2FsYXJUeXBlLmlzRmxvYXQoKSkgeworCQkJdmFsdWVzID0gbmV3IGZsb2F0W10geyAoZmxvYXQpIHN0YXJ0LCAoZmxvYXQpIGluY3JlbWVudCwgKGZsb2F0KSB2YWx1ZXNQZXJTYXcgfTsKKwkJfSBlbHNlIGlmIChzY2FsYXJUeXBlLmlzRG91YmxlKCkpIHsKKwkJCXZhbHVlcyA9IG5ldyBkb3VibGVbXSB7IHN0YXJ0LCBpbmNyZW1lbnQsIHZhbHVlc1BlclNhdyB9OworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2NhbGFyIHR5cGUgJyIgKyBzY2FsYXJUeXBlICsgIicgaXMgbm90IHN1cHBvcnRlZC4iKTsKKwkJfQorCQljcmVhdGVWYWx1ZXMoc2NhbGFyVHlwZSwgdmFsdWVzKTsKKworCQkvLyBOT1RFOiBpZiBpdCBldmVyIHNob3VsZCBiZSByZXF1aXJlZCB0byBtYWtlIGEgY2hhbm5lbCBvZiB0aGlzIHR5cGUKKwkJLy8gYW4gaW5kZXBlbmRlbnQgb25lLCB0aGVuIHJldHVybiBhbiBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGluc3RlYWQhCisJCXJldHVybiBuZXcgVW5pdEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHRvIGNyZWF0ZSBhIHJhdyBsaW5lYXIgc2VxdWVuY2Ugb2YKKwkgKiBtZWFzdXJlZCB2YWx1ZXMuCisJICoKKwkgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZm9yIGVhY2ggdmFsdWUuCisJICogQHBhcmFtIGZhY3RvciBUaGUgZmFjdG9yIGZvciBlYWNoIHZhbHVlLgorCSAqIEByZXR1cm4gQSB7QGxpbmsgQ29tcGxleE51bWVyaWNhbFZhbHVlc0J1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqIEBzZWUgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNSQVdfTElORUFSCisJICovCisJcHVibGljIENvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyIHJhd0xpbmVhcihkb3VibGUgb2Zmc2V0LCBkb3VibGUgZmFjdG9yKSB7CisJCWdldFdyaXRlUmVxdWVzdCgpLnNldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfTElORUFSKTsKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0R2VuZXJhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdIHsgb2Zmc2V0LCBmYWN0b3IgfSk7CisJCXJldHVybiBuZXcgQ29tcGxleE51bWVyaWNhbFZhbHVlc0J1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHRvIGNyZWF0ZSBhIHJhdyBwb2x5bm9taWFsIHNlcXVlbmNlIG9mCisJICogbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIGNvZWZmaWNpZW50cyBBdCBsZWFzdCAyIGNvZWZmaWNpZW50cyBtdXN0IGJlIHByb3ZpZGVkLgorCSAqIEByZXR1cm4gQSB7QGxpbmsgQ29tcGxleE51bWVyaWNhbFZhbHVlc0J1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBjb2VmZmljaWVudHMgYXJlIG1pc3Npbmcgb3IgdGhlaXIKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggaXMgbGVzcyB0aGFuIDIuCisJICogQHNlZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uI1JBV19QT0xZTk9NSUFMCisJICovCisJcHVibGljIENvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyIHJhd1BvbHlub21pYWwoZG91YmxlLi4uIGNvZWZmaWNpZW50cykgeworCQlpZiAoY29lZmZpY2llbnRzID09IG51bGwgfHwgY29lZmZpY2llbnRzLmxlbmd0aCA8IDIpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJDb2VmZmljaWVudHMgZWl0aGVyIG1pc3Npbmcgb3IgdGhlaXIgbGVuZ3RoIGlzICIgKyAiaW5jb25zaXRlbnQgd2l0aCBnaXZlbiBncmFkZSIpOworCQl9CisKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbihTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19QT0xZTk9NSUFMKTsKKworCQlkb3VibGVbXSBnZW5lcmF0aW9uUGFyYW1ldGVycyA9IG5ldyBkb3VibGVbY29lZmZpY2llbnRzLmxlbmd0aCArIDFdOworCQlnZW5lcmF0aW9uUGFyYW1ldGVyc1swXSA9IGNvZWZmaWNpZW50cy5sZW5ndGggLSAxOworCQlTeXN0ZW0uYXJyYXljb3B5KGNvZWZmaWNpZW50cywgMCwgZ2VuZXJhdGlvblBhcmFtZXRlcnMsIDEsIGNvZWZmaWNpZW50cy5sZW5ndGgpOworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRHZW5lcmF0aW9uUGFyYW1ldGVycyhnZW5lcmF0aW9uUGFyYW1ldGVycyk7CisKKwkJLy8gVE9ETzogY3VycmVudGx5IGl0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSBzdWNoIGEgY2hhbm5lbCBhcworCQkvLyBpbmRlcGVuZGVudAorCQkvLyBzaG91bGQgd2UgcHJldmVudCB0aGlzPyEKKwkJcmV0dXJuIG5ldyBDb21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gdG8gY3JlYXRlIGEgcmF3IGxpbmVhciBjYWxpYnJhdGVkCisJICogc2VxdWVuY2Ugb2YgbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIG9mZnNldCAgICAgIFRoZSBvZmZzZXQgZm9yIGVhY2ggdmFsdWUuCisJICogQHBhcmFtIGZhY3RvciAgICAgIFRoZSBmYWN0b3IgZm9yIGVhY2ggdmFsdWUuCisJICogQHBhcmFtIGNhbGlicmF0aW9uIFRoZSBjYWxpYnJhdGlvbiBmYWN0b3IuCisJICogQHJldHVybiBBIHtAbGluayBDb21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICogQHNlZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uI1JBV19MSU5FQVJfQ0FMSUJSQVRFRAorCSAqLworCXB1YmxpYyBDb21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlciByYXdMaW5lYXJDYWxpYnJhdGVkKGRvdWJsZSBvZmZzZXQsIGRvdWJsZSBmYWN0b3IsIGRvdWJsZSBjYWxpYnJhdGlvbikgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX0xJTkVBUl9DQUxJQlJBVEVEKTsKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0R2VuZXJhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdIHsgb2Zmc2V0LCBmYWN0b3IsIGNhbGlicmF0aW9uIH0pOworCQlyZXR1cm4gbmV3IENvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0RmluYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0RmluYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1Mjc2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Xcml0ZVJlcXVlc3RGaW5hbGl6ZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB0ZXJtaW5hbCB7QGxpbmsgV3JpdGVSZXF1ZXN0fSBidWlsZCBvcGVyYXRpb24gdG8KKyAqIHJldHJpZXZlIHRoZSBjb25maWd1cmVkIHtAY29kZSBXcml0ZVJlcXVlc3R9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgV3JpdGVSZXF1ZXN0RmluYWxpemVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIFdyaXRlUmVxdWVzdCB3cml0ZVJlcXVlc3Q7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSBjb25maWd1cmVkIHtAbGluayBXcml0ZVJlcXVlc3R9LgorCSAqLworCVdyaXRlUmVxdWVzdEZpbmFsaXplcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXRoaXMud3JpdGVSZXF1ZXN0ID0gd3JpdGVSZXF1ZXN0OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbmZpZ3VyZWQge0BsaW5rIFdyaXRlUmVxdWVzdH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIHtAY29kZSBXcml0ZVJlcXVlc3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBXcml0ZVJlcXVlc3QgYnVpbGQoKSB7CisJCXJldHVybiBnZXRXcml0ZVJlcXVlc3QoKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJvdGVjdGVkIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBXcml0ZVJlcXVlc3R9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBXcml0ZVJlcXVlc3QgZ2V0V3JpdGVSZXF1ZXN0KCkgeworCQlyZXR1cm4gd3JpdGVSZXF1ZXN0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0F4aXNUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQXhpc1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThlNjdlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0F4aXNUeXBlLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBheGlzIHR5cGUgZW51bWVyYXRpb24gYXMgZGVmaW5lZCBpbiB0aGUgQVNBTSBPRFMgTlZIIG1vZGVsLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDaGFubmVsCisgKi8KK3B1YmxpYyBjbGFzcyBBeGlzVHlwZSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWUgeworCisJLyoqCisJICogQSB7QGxpbmsgQ2hhbm5lbH0gb2YgdGhpcyB0eXBlIG1heSBiZSBkaXNwbGF5ZWQgYXMgdGhlIHgtYXhpcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXNUeXBlIFhfQVhJUyA9IG5ldyBBeGlzVHlwZSgiWF9BWElTIiwgMCk7CisKKwkvKioKKwkgKiBBIHtAbGluayBDaGFubmVsfSBvZiB0aGlzIHR5cGUgbWF5IGJlIGRpc3BsYXllZCBhcyB0aGUgeS1heGlzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQXhpc1R5cGUgWV9BWElTID0gbmV3IEF4aXNUeXBlKCJZX0FYSVMiLCAxKTsKKworCS8qKgorCSAqIEEge0BsaW5rIENoYW5uZWx9IG9mIHRoaXMgdHlwZSBtYXkgYmUgZGlzcGxheWVkIGFzIHRoZSB4LSBvciB5LWF4aXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzVHlwZSBYWV9BWElTID0gbmV3IEF4aXNUeXBlKCJYWV9BWElTIiwgMik7CisKKwlwcml2YXRlIEF4aXNUeXBlKFN0cmluZyBuYW1lLCBpbnQgb3JkaW5hbCkgeworCQlzdXBlcihuYW1lLCBvcmRpbmFsKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBheGlzIHR5cGUgaXMge0BsaW5rICNYX0FYSVN9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzWEF4aXMoKSB7CisJCXJldHVybiBYX0FYSVMgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBheGlzIHR5cGUgaXMge0BsaW5rICNZX0FYSVN9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzWUF4aXMoKSB7CisJCXJldHVybiBZX0FYSVMgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBheGlzIHR5cGUgaXMge0BsaW5rICNYWV9BWElTfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1hZQXhpcygpIHsKKwkJcmV0dXJuIFhZX0FYSVMgPT0gdGhpczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9CYXNlRW50aXR5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQmFzZUVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZWViOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQmFzZUVudGl0eS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBUaGlzIGlzIGEgYmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kZWxlZCBlbnRpdGllcy4gQVBJIGNvbnN1bWVycyBzaG91bGQKKyAqIG5ldmVyIHVzZSB0aGlzIGNsYXNzIGluIGFueSB3YXksIGluc3RlYWQgdGhlIG1vc3QgY29tbW9uIGludGVyZmFjZSBzaG91bGQgYmUKKyAqIHVzZWQgKGUuZy46IHtAbGluayBFbnRpdHl9LCB7QGxpbmsgQ29udGV4dERlc2NyaWJhYmxlfSwgZXRjLikuIEFQSSBwcm9kdWNlcnMKKyAqIG11c3QgbGV0IHRoZWlyIHtAY29kZSBFbnRpdHl9IGltcGxlbWVudGF0aW9ucyBleHRlbmQgdGhpcyBjbGFzcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBFbnRpdHkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgQ29yZSBjb3JlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgQmFzZUVudGl0eShDb3JlIGNvcmUpIHsKKwkJdGhpcy5jb3JlID0gY29yZTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldFNvdXJjZU5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRUeXBlTmFtZSgpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldElEKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldElEKCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBWYWx1ZSBnZXRWYWx1ZShTdHJpbmcgbmFtZSkgeworCQlWYWx1ZSB2YWx1ZSA9IGdldENvcmUoKS5nZXRWYWx1ZXMoKS5nZXQobmFtZSk7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJWYWx1ZSB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgZG9lcyBub3QgZXhpc3QiKTsKKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBNYXA8U3RyaW5nLCBWYWx1ZT4gZ2V0VmFsdWVzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGdldENvcmUoKS5nZXRWYWx1ZXMoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZyBwcmVmaXggPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJykudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChWYWx1ZTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIsIHByZWZpeCwgIikiKSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByb3RlY3RlZCBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW50ZXJuYWxseSBzdG9yZWQge0BsaW5rIENvcmV9LgorCSAqCisJICogQHJldHVybiBUaGUge0BsaW5rIENvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBDb3JlIGdldENvcmUoKSB7CisJCXJldHVybiBjb3JlOworCX0KKworCS8qKgorCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBleHRyYWN0IHtAbGluayBDb3JlfSBvZiBnaXZlbiB7QGxpbmsgRW50aXR5fS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIHtAY29kZSBFbnRpdHl9IHdob3NlIHtAY29kZSBDb3JlfSBpcyByZXF1aXJlZC4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ29yZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBDb3JlIGdldENvcmUoRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gKChCYXNlRW50aXR5KSBlbnRpdHkpLmdldENvcmUoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9CYXNlRW50aXR5RmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Jhc2VFbnRpdHlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkN2Y2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9CYXNlRW50aXR5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5DaGlsZHJlblN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5U3RvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYW4gYWJzdHJhY3QgZW50aXR5IGZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBuZXcgZW50aXRpZXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRW50aXR5RmFjdG9yeSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDaGFubmVsfS4gVGhlIG5hbWUgb2YgdGhlIHJldHVybmVkIHtAY29kZSBDaGFubmVsfSBpcworCSAqIHJldHJpZXZlZCBmcm9tIGdpdmVuIHtAbGluayBRdWFudGl0eX0uCisJICoKKwkgKiBAcGFyYW0gbWVhc3VyZW1lbnQgVGhlIHBhcmVudCB7QGxpbmsgTWVhc3VyZW1lbnR9LgorCSAqIEBwYXJhbSBxdWFudGl0eSAgICBUaGUge0Bjb2RlIFF1YW50aXR5fSBpcyB1c2VkIGZvciBkZWZhdWx0IGluaXRpYWxpemF0aW9uLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIENoYW5uZWx9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDaGFubmVsIGNyZWF0ZUNoYW5uZWwoTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQsIFF1YW50aXR5IHF1YW50aXR5KSB7CisJCXJldHVybiBjcmVhdGVDaGFubmVsKHF1YW50aXR5LmdldERlZmF1bHRDaGFubmVsTmFtZSgpLCBtZWFzdXJlbWVudCwgcXVhbnRpdHkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENoYW5uZWx9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENoYW5uZWx9LgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudCBUaGUgcGFyZW50IHtAbGluayBNZWFzdXJlbWVudH0uCisJICogQHBhcmFtIHF1YW50aXR5ICAgIFRoZSB7QGNvZGUgUXVhbnRpdHl9IGlzIHVzZWQgZm9yIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ2hhbm5lbH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENoYW5uZWwgY3JlYXRlQ2hhbm5lbChTdHJpbmcgbmFtZSwgTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQsIFF1YW50aXR5IHF1YW50aXR5KSB7CisJCUNoYW5uZWwgY2hhbm5lbCA9IG5ldyBDaGFubmVsKGNyZWF0ZUNvcmUoQ2hhbm5lbC5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKGNoYW5uZWwpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KG1lYXN1cmVtZW50KTsKKwkJZ2V0Q29yZShtZWFzdXJlbWVudCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZChjaGFubmVsKTsKKwkJZ2V0Q29yZShjaGFubmVsKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQocXVhbnRpdHkuZ2V0RGVmYXVsdFVuaXQoKSk7CisJCWdldENvcmUoY2hhbm5lbCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHF1YW50aXR5KTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCWNoYW5uZWwuc2V0TmFtZShuYW1lKTsKKwkJY2hhbm5lbC5zZXREZXNjcmlwdGlvbihxdWFudGl0eS5nZXREZXNjcmlwdGlvbigpKTsKKwkJY2hhbm5lbC5zZXRJbnRlcnBvbGF0aW9uKEludGVycG9sYXRpb24uTk9ORSk7CisJCWNoYW5uZWwuc2V0U2NhbGFyVHlwZShxdWFudGl0eS5nZXREZWZhdWx0U2NhbGFyVHlwZSgpKTsKKwkJY2hhbm5lbC5zZXRSYW5rKHF1YW50aXR5LmdldERlZmF1bHRSYW5rKCkpOworCQljaGFubmVsLnNldFR5cGVTaXplKHF1YW50aXR5LmdldERlZmF1bHRUeXBlU2l6ZSgpKTsKKworCQlyZXR1cm4gY2hhbm5lbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDaGFubmVsR3JvdXB9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENoYW5uZWxHcm91cH0uCisJICogQHBhcmFtIG51bWJlck9mVmFsdWVzIFRoZSBudW1iZXIgb2YgdmFsdWVzIHBlciBlYWNoIHJlbGF0ZWQge0BsaW5rIENoYW5uZWx9LgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudCAgICBUaGUgcGFyZW50IHtAbGluayBNZWFzdXJlbWVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ2hhbm5lbEdyb3VwfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgbnVtYmVyT2ZWYWx1ZXMgaXMgbmVnYXRpdmUuCisJICovCisJcHVibGljIENoYW5uZWxHcm91cCBjcmVhdGVDaGFubmVsR3JvdXAoU3RyaW5nIG5hbWUsIGludCBudW1iZXJPZlZhbHVlcywgTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQpIHsKKwkJaWYgKG51bWJlck9mVmFsdWVzIDwgMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVtYmVyIG9mIHZhbHVlcyBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiAwLiIpOworCQl9CisKKwkJQ2hhbm5lbEdyb3VwIGNoYW5uZWxHcm91cCA9IG5ldyBDaGFubmVsR3JvdXAoY3JlYXRlQ29yZShDaGFubmVsR3JvdXAuY2xhc3MpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShjaGFubmVsR3JvdXApLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KG1lYXN1cmVtZW50KTsKKwkJZ2V0Q29yZShtZWFzdXJlbWVudCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZChjaGFubmVsR3JvdXApOworCisJCS8vIHByb3BlcnRpZXMKKwkJY2hhbm5lbEdyb3VwLnNldE5hbWUobmFtZSk7CisJCWNoYW5uZWxHcm91cC5zZXROdW1iZXJPZlZhbHVlcyhJbnRlZ2VyLnZhbHVlT2YobnVtYmVyT2ZWYWx1ZXMpKTsKKworCQlyZXR1cm4gY2hhbm5lbEdyb3VwOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lYXN1cmVtZW50fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgTWVhc3VyZW1lbnR9LgorCSAqIEBwYXJhbSB0ZXN0U3RlcCAgICAgVGhlIHBhcmVudCB7QGxpbmsgVGVzdFN0ZXB9LgorCSAqIEBwYXJhbSBjb250ZXh0Um9vdHMge0BsaW5rIENvbnRleHRSb290fXMgY29udGFpbmluZyB0aGUgZGVzY3JpcHRpdmUgZGF0YS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBNZWFzdXJlbWVudH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIE1lYXN1cmVtZW50IGNyZWF0ZU1lYXN1cmVtZW50KFN0cmluZyBuYW1lLCBUZXN0U3RlcCB0ZXN0U3RlcCwgQ29udGV4dFJvb3QuLi4gY29udGV4dFJvb3RzKSB7CisJCU1lYXN1cmVtZW50IG1lYXN1cmVtZW50ID0gbmV3IE1lYXN1cmVtZW50KGNyZWF0ZUNvcmUoTWVhc3VyZW1lbnQuY2xhc3MpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShtZWFzdXJlbWVudCkuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQodGVzdFN0ZXApOworCQlnZXRDb3JlKHRlc3RTdGVwKS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKG1lYXN1cmVtZW50KTsKKwkJZm9yIChDb250ZXh0Um9vdCBjb250ZXh0Um9vdCA6IGNvbnRleHRSb290cykgeworCQkJZ2V0Q29yZShtZWFzdXJlbWVudCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KGNvbnRleHRSb290LCBjb250ZXh0Um9vdC5nZXRDb250ZXh0VHlwZSgpKTsKKwkJfQorCisJCS8vIHByb3BlcnRpZXMKKwkJbWVhc3VyZW1lbnQuc2V0TmFtZShuYW1lKTsKKwkJbWVhc3VyZW1lbnQuc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZS5ub3coKSk7CisKKwkJcmV0dXJuIG1lYXN1cmVtZW50OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFBhcmFtZXRlcn0gd2l0aCBpbml0aWFsaXplZCB3aXRoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJ9LgorCSAqIEBwYXJhbSB2YWx1ZSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJ9LgorCSAqIEBwYXJhbSB1bml0ICAgICAgICAgQW4gb3B0aW9uYWxseSByZWxhdGVkIHtAbGluayBVbml0fS4KKwkgKiBAcGFyYW0gcGFyYW1ldGVyU2V0IFRoZSBwYXJlbnQge0BsaW5rIFBhcmFtZXRlclNldH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUGFyYW1ldGVyfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgdGhlIHtAY29kZSBQYXJhbWV0ZXJTZXR9IGFscmVhZHkKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBhIHtAY29kZSBQYXJhbWV0ZXJ9IHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLgorCSAqIEBzZWUgUGFyYW1ldGVyI3NldE9iamVjdFZhbHVlKE9iamVjdCwgVW5pdCkKKwkgKi8KKwlwdWJsaWMgUGFyYW1ldGVyIGNyZWF0ZVBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBVbml0IHVuaXQsIFBhcmFtZXRlclNldCBwYXJhbWV0ZXJTZXQpIHsKKwkJaWYgKHBhcmFtZXRlclNldC5nZXRQYXJhbWV0ZXIobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmFtZXRlciB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihjcmVhdGVDb3JlKFBhcmFtZXRlci5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHBhcmFtZXRlcikuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQocGFyYW1ldGVyU2V0KTsKKwkJZ2V0Q29yZShwYXJhbWV0ZXJTZXQpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQocGFyYW1ldGVyKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXBhcmFtZXRlci5zZXROYW1lKG5hbWUpOworCQlwYXJhbWV0ZXIuc2V0T2JqZWN0VmFsdWUodmFsdWUsIHVuaXQpOworCisJCXJldHVybiBwYXJhbWV0ZXI7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUGFyYW1ldGVyU2V0fSBmb3IgZ2l2ZW4ge0BsaW5rIE1lYXN1cmVtZW50fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJTZXR9LgorCSAqIEBwYXJhbSB2ZXJzaW9uICAgICBWZXJzaW9uIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJTZXR9LgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudCBUaGUgb3duaW5nIHtAY29kZSBNZWFzdXJlbWVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUGFyYW1ldGVyU2V0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUGFyYW1ldGVyU2V0IGNyZWF0ZVBhcmFtZXRlclNldChTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24sIE1lYXN1cmVtZW50IG1lYXN1cmVtZW50KSB7CisJCVBhcmFtZXRlclNldCBwYXJhbWV0ZXJTZXQgPSBuZXcgUGFyYW1ldGVyU2V0KGNyZWF0ZUNvcmUoUGFyYW1ldGVyU2V0LmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUocGFyYW1ldGVyU2V0KS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChtZWFzdXJlbWVudCk7CisJCWdldENvcmUobWVhc3VyZW1lbnQpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQocGFyYW1ldGVyU2V0KTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXBhcmFtZXRlclNldC5zZXROYW1lKG5hbWUpOworCQlwYXJhbWV0ZXJTZXQuc2V0VmVyc2lvbih2ZXJzaW9uKTsKKworCQlyZXR1cm4gcGFyYW1ldGVyU2V0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFBhcmFtZXRlclNldH0gZm9yIGdpdmVuIHtAbGluayBDaGFubmVsfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFBhcmFtZXRlclNldH0uCisJICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgUGFyYW1ldGVyU2V0fS4KKwkgKiBAcGFyYW0gY2hhbm5lbCBUaGUgb3duaW5nIHtAY29kZSBDaGFubmVsfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJTZXR9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBQYXJhbWV0ZXJTZXQgY3JlYXRlUGFyYW1ldGVyU2V0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwgQ2hhbm5lbCBjaGFubmVsKSB7CisJCVBhcmFtZXRlclNldCBwYXJhbWV0ZXJTZXQgPSBuZXcgUGFyYW1ldGVyU2V0KGNyZWF0ZUNvcmUoUGFyYW1ldGVyU2V0LmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUocGFyYW1ldGVyU2V0KS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChjaGFubmVsKTsKKwkJZ2V0Q29yZShjaGFubmVsKS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKHBhcmFtZXRlclNldCk7CisKKwkJLy8gcHJvcGVydGllcworCQlwYXJhbWV0ZXJTZXQuc2V0TmFtZShuYW1lKTsKKwkJcGFyYW1ldGVyU2V0LnNldFZlcnNpb24odmVyc2lvbik7CisKKwkJcmV0dXJuIHBhcmFtZXRlclNldDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBQaHlzaWNhbERpbWVuc2lvbn0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQaHlzaWNhbERpbWVuc2lvbn0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUGh5c2ljYWxEaW1lbnNpb259IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBQaHlzaWNhbERpbWVuc2lvbiBjcmVhdGVQaHlzaWNhbERpbWVuc2lvbihTdHJpbmcgbmFtZSkgeworCQlQaHlzaWNhbERpbWVuc2lvbiBwaHlzaWNhbERpbWVuc2lvbiA9IG5ldyBQaHlzaWNhbERpbWVuc2lvbihjcmVhdGVDb3JlKFBoeXNpY2FsRGltZW5zaW9uLmNsYXNzKSk7CisKKwkJLy8gcHJvcGVydGllcworCQlwaHlzaWNhbERpbWVuc2lvbi5zZXROYW1lKG5hbWUpOworCQlwaHlzaWNhbERpbWVuc2lvbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDApKTsKKwkJcGh5c2ljYWxEaW1lbnNpb24uc2V0TWFzcyhJbnRlZ2VyLnZhbHVlT2YoMCkpOworCQlwaHlzaWNhbERpbWVuc2lvbi5zZXRUaW1lKEludGVnZXIudmFsdWVPZigwKSk7CisJCXBoeXNpY2FsRGltZW5zaW9uLnNldFRlbXBlcmF0dXJlKEludGVnZXIudmFsdWVPZigwKSk7CisJCXBoeXNpY2FsRGltZW5zaW9uLnNldEN1cnJlbnQoSW50ZWdlci52YWx1ZU9mKDApKTsKKwkJcGh5c2ljYWxEaW1lbnNpb24uc2V0TW9sYXJBbW91bnQoSW50ZWdlci52YWx1ZU9mKDApKTsKKwkJcGh5c2ljYWxEaW1lbnNpb24uc2V0THVtaW5vdXNJbnRlbnNpdHkoSW50ZWdlci52YWx1ZU9mKDApKTsKKwkJcGh5c2ljYWxEaW1lbnNpb24uc2V0QW5nbGUoSW50ZWdlci52YWx1ZU9mKDApKTsKKworCQlyZXR1cm4gcGh5c2ljYWxEaW1lbnNpb247CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUXVhbnRpdHl9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFF1YW50aXR5fS4KKwkgKiBAcGFyYW0gZGVmYXVsdFVuaXQgVGhlIGRlZmF1bHQge0BsaW5rIFVuaXR9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFF1YW50aXR5fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUXVhbnRpdHkgY3JlYXRlUXVhbnRpdHkoU3RyaW5nIG5hbWUsIFVuaXQgZGVmYXVsdFVuaXQpIHsKKwkJUXVhbnRpdHkgcXVhbnRpdHkgPSBuZXcgUXVhbnRpdHkoY3JlYXRlQ29yZShRdWFudGl0eS5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHF1YW50aXR5KS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQoZGVmYXVsdFVuaXQpOworCisJCS8vIHByb3BlcnRpZXMKKwkJcXVhbnRpdHkuc2V0TmFtZShuYW1lKTsKKwkJcXVhbnRpdHkuc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZS5ub3coKSk7CisJCXF1YW50aXR5LnNldERlZmF1bHRSYW5rKEludGVnZXIudmFsdWVPZigxKSk7CisJCXF1YW50aXR5LnNldERlZmF1bHREaW1lbnNpb24obmV3IGludFtdIHsgMCB9KTsKKwkJcXVhbnRpdHkuc2V0RGVmYXVsdFR5cGVTaXplKEludGVnZXIudmFsdWVPZigxKSk7CisJCXF1YW50aXR5LnNldERlZmF1bHRDaGFubmVsTmFtZShuYW1lKTsKKwkJcXVhbnRpdHkuc2V0RGVmYXVsdFNjYWxhclR5cGUoU2NhbGFyVHlwZS5GTE9BVCk7CisKKwkJcXVhbnRpdHkuZ2V0VmFsdWUoIlZlcnNpb24iKS5zZXQoIjEiKTsKKwkJcXVhbnRpdHkuZ2V0VmFsdWUoIlZhbGlkRmxhZyIpLnNldChWZXJzaW9uU3RhdGUuVkFMSUQpOworCisJCXJldHVybiBxdWFudGl0eTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0fSB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSBsb2dnZWQgaW4ge0BsaW5rIFVzZXJ9LCBpZgorCSAqIHRoZXJlIGlzIG9uZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZXN0IGNyZWF0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJVGVzdCB0ZXN0ID0gbmV3IFRlc3QoY3JlYXRlQ29yZShUZXN0LmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCU9wdGlvbmFsPFVzZXI+IHJlc3BvbnNpYmxlUGVyc29uID0gZ2V0TG9nZ2VkSW5Vc2VyKCk7CisJCWlmIChyZXNwb25zaWJsZVBlcnNvbi5pc1ByZXNlbnQoKSkgeworCQkJLy8gbWF5IGJlIG51bGwgaWYgdXNlciBlbnRpdGllcyBhcmUgbm90IGF2YWlsYWJsZQorCQkJZ2V0Q29yZSh0ZXN0KS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQocmVzcG9uc2libGVQZXJzb24uZ2V0KCkpOworCQl9CisKKwkJLy8gcHJvcGVydGllcworCQl0ZXN0LnNldE5hbWUobmFtZSk7CisJCXRlc3Quc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZS5ub3coKSk7CisKKwkJcmV0dXJuIHRlc3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdFN0ZXB9LgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVGVzdFN0ZXB9LgorCSAqIEBwYXJhbSB0ZXN0IFRoZSBwYXJlbnQge0BsaW5rIFRlc3R9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVzdFN0ZXAgY3JlYXRlVGVzdFN0ZXAoU3RyaW5nIG5hbWUsIFRlc3QgdGVzdCkgeworCQlUZXN0U3RlcCB0ZXN0U3RlcCA9IG5ldyBUZXN0U3RlcChjcmVhdGVDb3JlKFRlc3RTdGVwLmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodGVzdFN0ZXApLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KHRlc3QpOworCQlnZXRDb3JlKHRlc3QpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQodGVzdFN0ZXApOworCisJCS8vIHByb3BlcnRpZXMKKwkJdGVzdFN0ZXAuc2V0TmFtZShuYW1lKTsKKwkJdGVzdFN0ZXAuc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZS5ub3coKSk7CisJCXRlc3RTdGVwLnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7CisKKwkJaWYgKHRlc3QuZ2V0SUQoKSAhPSBudWxsICYmIHRlc3QuZ2V0SUQoKS5sZW5ndGgoKSA+IDApIHsKKwkJCS8vIGhpZ2hlc3Qgc29ydCBpbmRleCBpbiB1c2Ugd2lsbCBiZSBxdWVyaWVkIGJlZm9yZSB3cml0dGVuCisJCQl0ZXN0U3RlcC5zZXRTb3J0SW5kZXgoSW50ZWdlci52YWx1ZU9mKC0xKSk7CisJCX0gZWxzZSB7CisJCQl0ZXN0U3RlcC5zZXRTb3J0SW5kZXgobmV4dEluZGV4KGdldENvcmUodGVzdCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmdldChUZXN0U3RlcC5jbGFzcykpKTsKKwkJfQorCisJCXJldHVybiB0ZXN0U3RlcDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBVbml0fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBVbml0fS4KKwkgKiBAcGFyYW0gcGh5c2ljYWxEaW1lbnNpb24gVGhlIHtAbGluayBQaHlzaWNhbERpbWVuc2lvbn0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVW5pdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFVuaXQgY3JlYXRlVW5pdChTdHJpbmcgbmFtZSwgUGh5c2ljYWxEaW1lbnNpb24gcGh5c2ljYWxEaW1lbnNpb24pIHsKKwkJVW5pdCB1bml0ID0gbmV3IFVuaXQoY3JlYXRlQ29yZShVbml0LmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodW5pdCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHBoeXNpY2FsRGltZW5zaW9uKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXVuaXQuc2V0TmFtZShuYW1lKTsKKwkJdW5pdC5zZXRPZmZzZXQoRG91YmxlLnZhbHVlT2YoMEQpKTsKKwkJdW5pdC5zZXRGYWN0b3IoRG91YmxlLnZhbHVlT2YoMUQpKTsKKworCQlyZXR1cm4gdW5pdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBVc2VyfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVXNlcn0uCisJICogQHBhcmFtIGdpdmVuTmFtZSBHaXZlbiBuYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBVc2VyfS4KKwkgKiBAcGFyYW0gc3VybmFtZSAgIFN1cm5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFVzZXJ9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFVzZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBVc2VyIGNyZWF0ZVVzZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBnaXZlbk5hbWUsIFN0cmluZyBzdXJuYW1lKSB7CisJCVVzZXIgdXNlciA9IG5ldyBVc2VyKGNyZWF0ZUNvcmUoVXNlci5jbGFzcykpOworCisJCS8vIHByb3BlcnRpZXMKKwkJdXNlci5zZXROYW1lKG5hbWUpOworCQl1c2VyLnNldEdpdmVuTmFtZShnaXZlbk5hbWUpOworCQl1c2VyLnNldFN1cm5hbWUoc3VybmFtZSk7CisKKwkJcmV0dXJuIHVzZXI7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByb3RlY3RlZCBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udGV4dFJvb3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENvbnRleHRSb290fS4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGUge0BsaW5rIENvbnRleHRUeXBlfSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgQ29udGV4dFJvb3R9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIENvbnRleHRSb290fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29udGV4dFJvb3QgY3JlYXRlQ29udGV4dFJvb3QoU3RyaW5nIG5hbWUsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCUNvbnRleHRSb290IGNvbnRleHRSb290ID0gbmV3IENvbnRleHRSb290KGNyZWF0ZUNvcmUoQ29udGV4dFJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSk7CisKKwkJLy8gcHJvcGVydGllcworCQljb250ZXh0Um9vdC5zZXROYW1lKG5hbWUpOworCQljb250ZXh0Um9vdC5zZXRWZXJzaW9uKFN0cmluZy52YWx1ZU9mKDApKTsKKworCQlyZXR1cm4gY29udGV4dFJvb3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgQ29udGV4dENvbXBvbmVudH0uCisJICogQHBhcmFtIGNvbnRleHRSb290IFRoZSBwYXJlbnQge0BsaW5rIENvbnRleHRSb290fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29udGV4dENvbXBvbmVudCBjcmVhdGVDb250ZXh0Q29tcG9uZW50KFN0cmluZyBuYW1lLCBDb250ZXh0Um9vdCBjb250ZXh0Um9vdCkgeworCQlDb250ZXh0Q29tcG9uZW50IGNvbnRleHRDb21wb25lbnQgPSBuZXcgQ29udGV4dENvbXBvbmVudChjcmVhdGVDb3JlKG5hbWUsIENvbnRleHRDb21wb25lbnQuY2xhc3MpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShjb250ZXh0Q29tcG9uZW50KS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChjb250ZXh0Um9vdCk7CisJCWdldENvcmUoY29udGV4dFJvb3QpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQoY29udGV4dENvbXBvbmVudCk7CisKKwkJLy8gcHJvcGVydGllcworCQljb250ZXh0Q29tcG9uZW50LnNldE5hbWUobmFtZSk7CisKKwkJcmV0dXJuIGNvbnRleHRDb21wb25lbnQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udGV4dFNlbnNvcn0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0U2Vuc29yfS4KKwkgKiBAcGFyYW0gY29udGV4dENvbXBvbmVudCBUaGUgcGFyZW50IHtAbGluayBDb250ZXh0Q29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0U2Vuc29yfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29udGV4dFNlbnNvciBjcmVhdGVDb250ZXh0U2Vuc29yKFN0cmluZyBuYW1lLCBDb250ZXh0Q29tcG9uZW50IGNvbnRleHRDb21wb25lbnQpIHsKKwkJQ29udGV4dFNlbnNvciBjb250ZXh0U2Vuc29yID0gbmV3IENvbnRleHRTZW5zb3IoY3JlYXRlQ29yZShuYW1lLCBDb250ZXh0U2Vuc29yLmNsYXNzKSk7CisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKGNvbnRleHRTZW5zb3IpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KGNvbnRleHRDb21wb25lbnQpOworCQlnZXRDb3JlKGNvbnRleHRDb21wb25lbnQpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQoY29udGV4dFNlbnNvcik7CisKKwkJLy8gcHJvcGVydGllcworCQljb250ZXh0U2Vuc29yLnNldE5hbWUobmFtZSk7CisKKwkJcmV0dXJuIGNvbnRleHRTZW5zb3I7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmV4dCB1c2FibGUgc29ydCBpbmRleCBmb3IgZ2l2ZW4ge0Bjb2RlIExpc3R9IG9mCisJICoge0BsaW5rIFNvcnRhYmxlfXMuCisJICoKKwkgKiBAcGFyYW0gc29ydGFibGVzIFRoZSB7QGNvZGUgU29ydGFibGV9IHdob3NlIG1heCBzb3J0IGluZGV4IHdpbGwgYmUgc2VhcmNoZWQuCisJICogQHJldHVybiB7QGNvZGUgMX0gaXMgcmV0dXJuZWQgaWYgZ2l2ZW4ge0Bjb2RlIExpc3R9IGlzIGVtcHR5LCBvdGhlcndpc2UgdGhlCisJICogICAgICAgICBtYXggc29ydCBpbmRleCBpbmNyZWFzZWQgYnkgMSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgbmV4dEluZGV4KExpc3Q8PyBleHRlbmRzIFNvcnRhYmxlPiBzb3J0YWJsZXMpIHsKKwkJT3B0aW9uYWw8SW50ZWdlcj4gbWF4SW5kZXggPSBzb3J0YWJsZXMuc3RyZWFtKCkubWF4KFNvcnRhYmxlLkNPTVBBUkFUT1IpLm1hcChTb3J0YWJsZTo6Z2V0U29ydEluZGV4KTsKKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZihtYXhJbmRleC5pc1ByZXNlbnQoKSA/IG1heEluZGV4LmdldCgpLmludFZhbHVlKCkgKyAxIDogMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENoaWxkcmVuU3RvcmV9IGZvciBnaXZlbiB7QGxpbmsgQmFzZUVudGl0eX0uIFBsZWFzZSBiZQorCSAqIGF3YXJlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgaXMgc3ViamVjdCB0byB0aGUgYWRhcHRlciBjcmVhdGluZyBpdC4KKwkgKiBJdCBpcyB1cCB0byB0aGUgYWRhcHRlciB0byBkZWNpZGUgd2hpY2ggcmVsYXRlZCBlbnRpdGllcyBhcmUgaW5jbHVkZWQuIEFzCisJICogdGhlcmUgYXJlIGFkYXB0ZXIgc3BlY2lmaWMgZGV0YWlscyB0byB0aGUgY29udGVudHMgb2YgdGhlIHN0b3JlIGl0IHNob3VsZCBiZQorCSAqIHByb3RlY3RlZCBmcm9tIGV4dGVybmFsIGFjY2Vzcy4gVGhlcmVmb3JlIGJ5IGRlY2xhcmluZyB0aGlzIG1ldGhvZCBwcm90ZWN0ZWQsCisJICogdGhlIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSBpcyBoaWRkZW4gZnJvbSBvdGhlciBjbGFzc2VzIHNpbmNlIHRoZSBvbmx5IGNsYXNzZXMKKwkgKiB3aGljaCBjYW4gYWNjZXNzIHRoZW0gKG91dHNpZGUgdGhpcyBwYWNrYWdlKSBhcmUgZGVyaXZhdGl2ZXMgb2YKKwkgKiBCYXNlRW50aXR5RmFjdG9yeSwgYW5kIGl0IGlzIHRocm91Z2ggc3VjaCBkZXJpdmF0aXZlcyB0aGF0IEJhc2VFbnRpdHkncworCSAqIFN0b3JlcyBzaG91bGQgYmUgYWNjZXNzZWQgZWxzZXdoZXJlIGlmIG5lZWRlZC4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIHtAY29kZSBCYXNlRW50aXR5fSB3aG9zZSB7QGNvZGUgQ2hpbGRyZW5TdG9yZX0gd2lsbCBiZQorCSAqICAgICAgICAgICAgICAgcmV0dXJuZWQuCisJICogQHJldHVybiBUaGUge0Bjb2RlIENoaWxkcmVuU3RvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgQ2hpbGRyZW5TdG9yZSBnZXRDaGlsZHJlblN0b3JlKEJhc2VFbnRpdHkgZW50aXR5KSB7CisJCXJldHVybiBnZXRDb3JlKGVudGl0eSkuZ2V0Q2hpbGRyZW5TdG9yZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG11dGFibGUge0BsaW5rIEVudGl0eVN0b3JlfSBmb3IgZ2l2ZW4ge0BsaW5rIEJhc2VFbnRpdHl9LiBQbGVhc2UKKwkgKiBiZSBhd2FyZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIGlzIHN1YmplY3QgdG8gdGhlIGFkYXB0ZXIgY3JlYXRpbmcKKwkgKiBpdC4gSXQgaXMgdXAgdG8gdGhlIGFkYXB0ZXIgdG8gZGVjaWRlIHdoaWNoIHJlbGF0ZWQgZW50aXRpZXMgYXJlIGluY2x1ZGVkLiBBcworCSAqIHRoZXJlIGFyZSBhZGFwdGVyIHNwZWNpZmljIGRldGFpbHMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdG9yZSBpdCBzaG91bGQgYmUKKwkgKiBwcm90ZWN0ZWQgZnJvbSBleHRlcm5hbCBhY2Nlc3MuIFRoZXJlZm9yZSBieSBkZWNsYXJpbmcgdGhpcyBtZXRob2QgcHJvdGVjdGVkLAorCSAqIHRoZSByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgaXMgaGlkZGVuIGZyb20gb3RoZXIgY2xhc3NlcyBzaW5jZSB0aGUgb25seSBjbGFzc2VzCisJICogd2hpY2ggY2FuIGFjY2VzcyB0aGVtIChvdXRzaWRlIHRoaXMgcGFja2FnZSkgYXJlIGRlcml2YXRpdmVzIG9mCisJICogQmFzZUVudGl0eUZhY3RvcnksIGFuZCBpdCBpcyB0aHJvdWdoIHN1Y2ggZGVyaXZhdGl2ZXMgdGhhdCBCYXNlRW50aXR5J3MKKwkgKiBTdG9yZXMgc2hvdWxkIGJlIGFjY2Vzc2VkIGVsc2V3aGVyZSBpZiBuZWVkZWQuCisJICogCisJICoKKwkgKiBAcGFyYW0gZW50aXR5IFRoZSB7QGNvZGUgQmFzZUVudGl0eX0gd2hvc2Uge0Bjb2RlIENoaWxkcmVuU3RvcmV9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgIHJldHVybmVkLgorCSAqIEByZXR1cm4gVGhlIG11dGFibGUge0Bjb2RlIEVudGl0eVN0b3JlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEVudGl0eVN0b3JlIGdldE11dGFibGVTdG9yZShCYXNlRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gZ2V0Q29yZShlbnRpdHkpLmdldE11dGFibGVTdG9yZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBlcm1hbmVudCB7QGxpbmsgRW50aXR5U3RvcmV9IGZvciBnaXZlbiB7QGxpbmsgQmFzZUVudGl0eX0uCisJICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgaXMgc3ViamVjdCB0byB0aGUgYWRhcHRlcgorCSAqIGNyZWF0aW5nIGl0LiBJdCBpcyB1cCB0byB0aGUgYWRhcHRlciB0byBkZWNpZGUgd2hpY2ggcmVsYXRlZCBlbnRpdGllcyBhcmUKKwkgKiBpbmNsdWRlZC4gQXMgdGhlcmUgYXJlIGFkYXB0ZXIgc3BlY2lmaWMgZGV0YWlscyB0byB0aGUgY29udGVudHMgb2YgdGhlIHN0b3JlCisJICogaXQgc2hvdWxkIGJlIHByb3RlY3RlZCBmcm9tIGV4dGVybmFsIGFjY2Vzcy4gVGhlcmVmb3JlIGJ5IGRlY2xhcmluZyB0aGlzCisJICogbWV0aG9kIHByb3RlY3RlZCwgdGhlIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSBpcyBoaWRkZW4gZnJvbSBvdGhlciBjbGFzc2VzCisJICogc2luY2UgdGhlIG9ubHkgY2xhc3NlcyB3aGljaCBjYW4gYWNjZXNzIHRoZW0gKG91dHNpZGUgdGhpcyBwYWNrYWdlKSBhcmUKKwkgKiBkZXJpdmF0aXZlcyBvZiBCYXNlRW50aXR5RmFjdG9yeSwgYW5kIGl0IGlzIHRocm91Z2ggc3VjaCBkZXJpdmF0aXZlcyB0aGF0CisJICogQmFzZUVudGl0eSdzIFN0b3JlcyBzaG91bGQgYmUgYWNjZXNzZWQgZWxzZXdoZXJlIGlmIG5lZWRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5IFRoZSB7QGNvZGUgQmFzZUVudGl0eX0gd2hvc2Uge0Bjb2RlIENoaWxkcmVuU3RvcmV9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgIHJldHVybmVkLgorCSAqIEByZXR1cm4gVGhlIHBlcm1hbmVudCB7QGNvZGUgRW50aXR5U3RvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRW50aXR5U3RvcmUgZ2V0UGVybWFuZW50U3RvcmUoQmFzZUVudGl0eSBlbnRpdHkpIHsKKwkJcmV0dXJuIGdldENvcmUoZW50aXR5KS5nZXRQZXJtYW5lbnRTdG9yZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMge0BsaW5rIENvcmV9IG9mIGdpdmVuIHtAbGluayBFbnRpdHl9LiBVc2VzIHByb3RlY3RlZCBtZXRob2QgZnJvbQorCSAqIEJhc2VFbnRpdHksIHdoaWNoIGlzIGFjY2Vzc2libGUgaGVyZSBhcyBCYXNlRW50aXR5IHJlc2lkZXMgaW4gdGhlIHNhbWUKKwkgKiBwYWNrYWdlIGFzIEJhc2VFbnRpdHlGYWN0b3J5LiBCeSBkZWNsYXJpbmcgdGhpcyBtZXRob2QgcHJvdGVjdGVkLCB0aGUKKwkgKiBDb3JlLXJlbGF0ZWQgZnVuY3Rpb25hbGl0eSBpcyBoaWRkZW4gZnJvbSBvdGhlciBjbGFzc2VzIHNpbmNlIHRoZSBvbmx5CisJICogY2xhc3NlcyB3aGljaCBjYW4gYWNjZXNzIHRoZW0gKG91dHNpZGUgdGhpcyBwYWNrYWdlKSBhcmUgZGVyaXZhdGl2ZXMgb2YKKwkgKiBCYXNlRW50aXR5RmFjdG9yeSwgYW5kIGl0IGlzIHRocm91Z2ggc3VjaCBkZXJpdmF0aXZlcyB0aGF0IGEgQmFzZUVudGl0eSdzCisJICogQ29yZSBzaG91bGQgYmUgYWNjZXNzZWQgZWxzZXdoZXJlIGlmIG5lZWRlZC4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIHtAY29kZSBCYXNlRW50aXR5fSB3aG9zZSB7QGNvZGUgQ29yZX0gaXMgcmVxdWlyZWQuCisJICogQHJldHVybiBUaGUge0Bjb2RlIENvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29yZSBnZXRDb3JlKEJhc2VFbnRpdHkgZW50aXR5KSB7CisJCXJldHVybiBlbnRpdHkuZ2V0Q29yZSgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQmFzZUVudGl0eX0gKG9yIGRlcml2YXRpdmUpIHdpdGggY29yZSBhcyB0aGUKKwkgKiBpbnN0YW5jZSdzIHtAbGluayBDb3JlfS4gQnkgZGVjbGFyaW5nIHRoaXMgbWV0aG9kIHByb3RlY3RlZCwgdGhlIENvcmUtcmVsYXRlZAorCSAqIGZ1bmN0aW9uYWxpdHkgaXMgaGlkZGVuIGZyb20gb3RoZXIgY2xhc3NlcyBzaW5jZSB0aGUgb25seSBjbGFzc2VzIHdoaWNoIGNhbgorCSAqIGFjY2VzcyB0aGVtIChvdXRzaWRlIHRoaXMgcGFja2FnZSkgYXJlIGRlcml2YXRpdmVzIG9mIEJhc2VFbnRpdHlGYWN0b3J5LCBhbmQKKwkgKiBpdCBpcyB0aHJvdWdoIHN1Y2ggZGVyaXZhdGl2ZXMgdGhhdCBhIEJhc2VFbnRpdHkncyBDb3JlIHNob3VsZCBiZSBhY2Nlc3NlZAorCSAqIGVsc2V3aGVyZSBpZiBuZWVkZWQuIDxicj4KKwkgKiA8YnI+CisJICogVGhpcyBtZXRob2QgYWNjZXNzZXMgdGhlICh1c3VhbGx5IHByb3RlY3RlZCkgQ29uc3RydWN0b3IoQ29yZSkgb2YgY2xhenosIHNvCisJICogdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzIGFuZCBjYWxsCisJICogc3VwZXIuY3JlYXRlQmFzZUVudGl0eSgpIGlmIHRoYXQgY29uc3RydWN0b3IgaXMgaW52aXNpYmxlIGZyb20gdGhlIGRlcml2ZWQKKwkgKiBjbGFzcy4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlLCBtdXN0IGV4dGVuZCB7QGxpbmsgQmFzZUVudGl0eX0uCisJICogQHBhcmFtIGNvcmUgIFRoZSB7QGxpbmsgQ29yZX0gdG8gdXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZS4KKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlLgorCSAqLworCXByb3RlY3RlZCA8VCBleHRlbmRzIEJhc2VFbnRpdHk+IFQgY3JlYXRlQmFzZUVudGl0eShDbGFzczxUPiBjbGF6eiwgQ29yZSBjb3JlKSB7CisJCXRyeSB7CisJCQlDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA9IGNsYXp6LmdldERlY2xhcmVkQ29uc3RydWN0b3IoQ29yZS5jbGFzcyk7CisJCQl0cnkgeworCQkJCXJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShjb3JlKTsKKwkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXhjKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGFjY2VzcyBDb25zdHJ1Y3RvcihDb3JlKSBvZiBjbGFzcyAnIiArIGNsYXp6LmdldE5hbWUoKSArICInISIpOworCQkJfQorCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhjLmdldE1lc3NhZ2UoKSwgZXhjKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBVc2VyfSB3aGljaCBpcyBib3VuZCB0byB0aGUgY3VycmVudCBzZXNzaW9uLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHtAY29kZSBVc2VyfSBlbnRpdGllcyBkbyBub3QgZXhpc3QuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IE9wdGlvbmFsPFVzZXI+IGdldExvZ2dlZEluVXNlcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyB7QGxpbmsgQ29yZX0gZm9yIGdpdmVuIGVudGl0eSBjbGFzcy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZW50aXR5IGNsYXNzIHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFRoZSBlbnRpdHkgY2xhc3MuCisJICogQHJldHVybiBBIG5ldyB7QGNvZGUgQ29yZX0gaW5zdGFuY2UgaXMgcmV0dXJuZWQuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IDxUIGV4dGVuZHMgRW50aXR5PiBDb3JlIGNyZWF0ZUNvcmUoQ2xhc3M8VD4gZW50aXR5Q2xhc3MpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyB7QGxpbmsgQ29yZX0gZm9yIGdpdmVuIGVudGl0eSBjbGFzcyBhbmQge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZW50aXR5IGNsYXNzIHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFRoZSBlbnRpdHkgY2xhc3MuCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9LgorCSAqIEByZXR1cm4gQSBuZXcge0Bjb2RlIENvcmV9IGluc3RhbmNlIGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCA8VCBleHRlbmRzIEVudGl0eT4gQ29yZSBjcmVhdGVDb3JlKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBDb3JlfSBmb3IgZ2l2ZW4gZW50aXR5IGNsYXNzIGFuZCB0eXBlIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGVudGl0eSBjbGFzcyB0eXBlLgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVGhlIGVudGl0eSBjbGFzcy4KKwkgKiBAcmV0dXJuIEEgbmV3IHtAY29kZSBDb3JlfSBpbnN0YW5jZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgPFQgZXh0ZW5kcyBFbnRpdHk+IENvcmUgY3JlYXRlQ29yZShTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gZW50aXR5Q2xhc3MpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQmFzZVBhcmFtZXRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Jhc2VQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzI2YzFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Jhc2VQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDQ0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYW4gYWJzdHJhY3QgcGFyYW1ldGVyIHdoaWNoIGhvbGRzIGEgdmFsdWUgd2l0aCBvbmUgb2YgdGhlCisgKiBzdXBwb3J0ZWQge0BsaW5rIFZhbHVlVHlwZX1zIGxpc3RlZCBiZWxvdy4gVGhlIHZhbHVlIGlzIGludGVybmFsbHkgc3RvcmVkIGluCisgKiBpdHMge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24uIEFueSBtb2RlbGVkIGVudGl0eSB3aXRoIHN1Y2ggYSB1c2UgY2FzZQorICogc2hvdWxkIGV4dGVuZHMgdGhpcyBjbGFzcy4gQVBJIGNvbnN1bWVycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMgY2xhc3MgaW4gYW55CisgKiB3YXksIGluc3RlYWQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIGhhdmUgdG8gYmUgdXNlZC4KKyAqCisgKiA8dWw+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNTVFJJTkd9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RBVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JPT0xFQU59PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JZVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI1NIT1JUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNMT05HfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGTE9BVH08L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjRE9VQkxFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGTE9BVF9DT01QTEVYfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNET1VCTEVfQ09NUExFWH08L2xpPgorICogPC91bD4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgI2dldFZpcnR1YWxWYWx1ZSgpCisgKiBAc2VlICNzZXRPYmplY3RWYWx1ZShPYmplY3QsIFVuaXQpCisgKiBAc2VlICNzZXRTdHJpbmdWYWx1ZShTdHJpbmcpCisgKiBAc2VlICNzZXREYXRlVmFsdWUoTG9jYWxEYXRlVGltZSkKKyAqIEBzZWUgI3NldEJvb2xlYW5WYWx1ZShCb29sZWFuKQorICogQHNlZSAjc2V0Qnl0ZVZhbHVlKEJ5dGUsIFVuaXQpCisgKiBAc2VlICNzZXRTaG9ydFZhbHVlKFNob3J0LCBVbml0KQorICogQHNlZSAjc2V0SW50ZWdlclZhbHVlKEludGVnZXIsIFVuaXQpCisgKiBAc2VlICNzZXRMb25nVmFsdWUoTG9uZywgVW5pdCkKKyAqIEBzZWUgI3NldEZsb2F0VmFsdWUoRmxvYXQsIFVuaXQpCisgKiBAc2VlICNzZXREb3VibGVWYWx1ZShEb3VibGUsIFVuaXQpCisgKiBAc2VlICNzZXRGbG9hdENvbXBsZXhWYWx1ZShGbG9hdENvbXBsZXgsIFVuaXQpCisgKiBAc2VlICNzZXREb3VibGVDb21wbGV4VmFsdWUoRG91YmxlQ29tcGxleCwgVW5pdCkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VQYXJhbWV0ZXIgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTY2FsYXJUeXBlLCBGdW5jdGlvbjxTdHJpbmcsIE9iamVjdD4+IFNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQID0gbmV3IEhhc2hNYXA8PigpOworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBhdHRyU2NhbGFyVHlwZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBhdHRyVmFsdWU7CisKKwlzdGF0aWMgeworCQlTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5wdXQoU2NhbGFyVHlwZS5TVFJJTkcsIHYgLT4gdik7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkRBVEUsIHYgLT4gTG9jYWxEYXRlVGltZS5wYXJzZSh2LCBWYWx1ZS5MT0NBTF9EQVRFX1RJTUVfRk9STUFUVEVSKSk7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkJPT0xFQU4sIEJvb2xlYW46OnZhbHVlT2YpOworCQlTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5wdXQoU2NhbGFyVHlwZS5CWVRFLCBCeXRlOjp2YWx1ZU9mKTsKKwkJU0NBTEFSVFlQRV9GVU5DVElPTl9NQVAucHV0KFNjYWxhclR5cGUuU0hPUlQsIFNob3J0Ojp2YWx1ZU9mKTsKKwkJU0NBTEFSVFlQRV9GVU5DVElPTl9NQVAucHV0KFNjYWxhclR5cGUuSU5URUdFUiwgSW50ZWdlcjo6dmFsdWVPZik7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkxPTkcsIExvbmc6OnZhbHVlT2YpOworCQlTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5wdXQoU2NhbGFyVHlwZS5GTE9BVCwgRmxvYXQ6OnZhbHVlT2YpOworCQlTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5wdXQoU2NhbGFyVHlwZS5ET1VCTEUsIERvdWJsZTo6dmFsdWVPZik7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkZMT0FUX0NPTVBMRVgsIEZsb2F0Q29tcGxleDo6dmFsdWVPZik7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkRPVUJMRV9DT01QTEVYLCBEb3VibGVDb21wbGV4Ojp2YWx1ZU9mKTsKKwl9CisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGF0dHJTY2FsYXJUeXBlIE5hbWUgb2YgdGhlIHtAbGluayBTY2FsYXJUeXBlfSBhdHRyaWJ1dGUuCisJICogQHBhcmFtIGF0dHJWYWx1ZSAgICAgIE5hbWUgb2YgdGhlIHtAY29kZSBTdHJpbmd9IHZhbHVlIGF0dHJpYnV0ZS4KKwkgKiBAcGFyYW0gY29yZSAgICAgICAgICAgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgQmFzZVBhcmFtZXRlcihTdHJpbmcgYXR0clNjYWxhclR5cGUsIFN0cmluZyBhdHRyVmFsdWUsIENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwkJdGhpcy5hdHRyU2NhbGFyVHlwZSA9IGF0dHJTY2FsYXJUeXBlOworCQl0aGlzLmF0dHJWYWx1ZSA9IGF0dHJWYWx1ZTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgdmlydHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBhcmFtZXRlcidzIHZhbHVlLiBUaGlzIGlzIGRvbmUgYnkKKwkgKiBjb252ZXJ0aW5nIHRoZSBpbnRlcm5hbGx5IHN0b3JlZCB7QGNvZGUgU3RyaW5nfSB2YWx1ZSB0byB0eXBlIHNwZWNpZmllZCBieQorCSAqIHRoaXMgcGFyYW1ldGVyJ3Mge0BsaW5rIFZhbHVlVHlwZX0gKHRoZSBhbGxvd2VkIHR5cGVzIGFyZSBsaXN0ZWQgYmVsb3cpLiBUaGUKKwkgKiBuYW1lIG9mIHRoZSByZXR1cm5lZCB2aXJ0dWFsIHtAbGluayBWYWx1ZX0gaXMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbWV0ZXIuCisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjU1RSSU5HfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjREFURX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JPT0xFQU59PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjU0hPUlR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNJTlRFR0VSfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjTE9OR308L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRE9VQkxFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRkxPQVRfQ09NUExFWH08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRV9DT01QTEVYfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYSB2aXJ0dWFsIG9uZSBhbmQgaGVuY2UgaW50ZW5kZWQgZm9yCisJICogZGlzcGxheWluZyBwdXJwb3NlcyBvbmx5LiBUbyBjaGFuZ2UgdGhpcyBwYXJhbWV0ZXIncyB2YWx1ZSBvbmUgb2YgaXRzCisJICoge0Bjb2RlIHNldFhZVmFsdWV9IG1ldGhvZHMgaGFzIHRvIGJlIHVzZWQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBWYWx1ZX0gd2l0aCB0aGUgY29udmVydGVkIHZhbHVlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBWYWx1ZSBnZXRWaXJ0dWFsVmFsdWUoKSB7CisJCVNjYWxhclR5cGUgc2NhbGFyVHlwZSA9IGdldFNjYWxhclR5cGUoKTsKKwkJRnVuY3Rpb248U3RyaW5nLCBPYmplY3Q+IHR5cGVDb252ZXJ0ZXIgPSBTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5nZXQoc2NhbGFyVHlwZSk7CisKKwkJaWYgKHR5cGVDb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIFZhbHVlVHlwZS5VTktOT1dOLmNyZWF0ZShnZXROYW1lKCkpOworCQl9CisKKwkJVmFsdWUgcGFyYW1ldGVyVmFsdWUgPSBnZXRQYXJhbWV0ZXJWYWx1ZSgpOworCQlPYmplY3QgdmFsdWUgPSBwYXJhbWV0ZXJWYWx1ZS5pc1ZhbGlkKCkgPyB0eXBlQ29udmVydGVyLmFwcGx5KHBhcmFtZXRlclZhbHVlLmV4dHJhY3QoKSkgOiBudWxsOworCQlyZXR1cm4gc2NhbGFyVHlwZS50b1NpbmdsZVZhbHVlVHlwZSgpLmNyZWF0ZShnZXROYW1lKCksIGdldFVuaXROYW1lKCksIHBhcmFtZXRlclZhbHVlLmlzVmFsaWQoKSwgdmFsdWUpOworCX0KKworCS8qKgorCSAqIFRha2VzIGdpdmVuIHZhbHVlIGFuZCBkZXRlcm1pbmVzIGl0cyB0eXBlLiBGaW5hbGx5IHZhbHVlIGFuZCB0aGUgb3B0aW9uYWwKKwkgKiB7QGNvZGUgVW5pdH0gYXJlIHBhc3NlZCB0byB0aGUgY29ycmVzcG9uZGluZyB7QGNvZGUgc2V0WFlWYWx1ZShYWSl9IG1ldGhvZCBhcworCSAqIGxpc3RlZCBiZWxvdy4gVGhlIHZhbHVlIGlzIGFsbG93ZWQgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGZvbGxvd2luZyB0eXBlczoKKwkgKiB7QGNvZGUgU3RyaW5nfSwge0Bjb2RlIExvY2FsRGF0ZVRpbWV9LCB7QGNvZGUgQm9vbGVhbn0sIHtAY29kZSBCeXRlfSwKKwkgKiB7QGNvZGUgU2hvcnR9LCB7QGNvZGUgSW50ZWdlcn0sIHtAY29kZSBMb25nfSwge0Bjb2RlIEZsb2F0fSwge0Bjb2RlIERvdWJsZX0sCisJICoge0Bjb2RlIEZsb2F0Q29tcGxleH0gYW5kIHtAY29kZSBEb3VibGVDb21wbGV4fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBJZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIFN0cmluZ30sIHtAY29kZQorCSAqIExvY2FsRGF0ZVRpbWV9IG9yIGEge0Bjb2RlIEJvb2xlYW59LCB0aGVuIHRoZSBnaXZlbiB1bml0IGlzIGlnbm9yZWQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGFsbG93ZWQgdG8gYmUgbnVsbC4KKwkgKiBAcGFyYW0gdW5pdCAgVGhlIG9wdGlvbmFsbHkgcmVsYXRlZCB7QGNvZGUgVW5pdH0uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkLgorCSAqIEBzZWUgI3NldFN0cmluZ1ZhbHVlKFN0cmluZykKKwkgKiBAc2VlICNzZXREYXRlVmFsdWUoTG9jYWxEYXRlVGltZSkKKwkgKiBAc2VlICNzZXRCb29sZWFuVmFsdWUoQm9vbGVhbikKKwkgKiBAc2VlICNzZXRCeXRlVmFsdWUoQnl0ZSwgVW5pdCkKKwkgKiBAc2VlICNzZXRTaG9ydFZhbHVlKFNob3J0LCBVbml0KQorCSAqIEBzZWUgI3NldEludGVnZXJWYWx1ZShJbnRlZ2VyLCBVbml0KQorCSAqIEBzZWUgI3NldExvbmdWYWx1ZShMb25nLCBVbml0KQorCSAqIEBzZWUgI3NldEZsb2F0VmFsdWUoRmxvYXQsIFVuaXQpCisJICogQHNlZSAjc2V0RG91YmxlVmFsdWUoRG91YmxlLCBVbml0KQorCSAqIEBzZWUgI3NldEZsb2F0Q29tcGxleFZhbHVlKEZsb2F0Q29tcGxleCwgVW5pdCkKKwkgKiBAc2VlICNzZXREb3VibGVDb21wbGV4VmFsdWUoRG91YmxlQ29tcGxleCwgVW5pdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShPYmplY3QgdmFsdWUsIFVuaXQgdW5pdCkgeworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCXNldFN0cmluZ1ZhbHVlKChTdHJpbmcpIHZhbHVlKTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIHsKKwkJCXNldERhdGVWYWx1ZSgoTG9jYWxEYXRlVGltZSkgdmFsdWUpOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgeworCQkJc2V0Qm9vbGVhblZhbHVlKChCb29sZWFuKSB2YWx1ZSk7CisJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlKSB7CisJCQlzZXRCeXRlVmFsdWUoKEJ5dGUpIHZhbHVlLCB1bml0KTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7CisJCQlzZXRTaG9ydFZhbHVlKChTaG9ydCkgdmFsdWUsIHVuaXQpOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgeworCQkJc2V0SW50ZWdlclZhbHVlKChJbnRlZ2VyKSB2YWx1ZSwgdW5pdCk7CisJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7CisJCQlzZXRMb25nVmFsdWUoKExvbmcpIHZhbHVlLCB1bml0KTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7CisJCQlzZXRGbG9hdFZhbHVlKChGbG9hdCkgdmFsdWUsIHVuaXQpOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7CisJCQlzZXREb3VibGVWYWx1ZSgoRG91YmxlKSB2YWx1ZSwgdW5pdCk7CisJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdENvbXBsZXgpIHsKKwkJCXNldEZsb2F0Q29tcGxleFZhbHVlKChGbG9hdENvbXBsZXgpIHZhbHVlLCB1bml0KTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZUNvbXBsZXgpIHsKKwkJCXNldERvdWJsZUNvbXBsZXhWYWx1ZSgoRG91YmxlQ29tcGxleCkgdmFsdWUsIHVuaXQpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIlZhbHVlICciICsgdmFsdWUgKyAiJyBvZiB0eXBlICciICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiJyBpcyBub3Qgc3VwcG9ydGVkLiIpOworCQl9CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB2YWx1ZSB3aXRoIGdpdmVuIHtAY29kZSBTdHJpbmd9IHZhbHVlLiBBbnkgZXhpc3RpbmcgcmVsYXRpb24KKwkgKiB0byBhIHtAbGluayBVbml0fSB3aWxsIGJlIHJlbW92ZWQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICovCisJcHVibGljIHZvaWQgc2V0U3RyaW5nVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5TVFJJTkcpOworCQlnZXRQYXJhbWV0ZXJWYWx1ZSgpLnNldCh2YWx1ZSk7CisJCXNldFVuaXQobnVsbCk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB2YWx1ZSB3aXRoIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiBnaXZlbgorCSAqIHtAY29kZSBMb2NhbERhdGVUaW1lfS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUKKwkgKiByZW1vdmVkLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERhdGVWYWx1ZShMb2NhbERhdGVUaW1lIHZhbHVlKSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5EQVRFKTsKKwkJZ2V0UGFyYW1ldGVyVmFsdWUoKS5zZXQodmFsdWUuZm9ybWF0KFZhbHVlLkxPQ0FMX0RBVEVfVElNRV9GT1JNQVRURVIpKTsKKwkJc2V0VW5pdChudWxsKTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50IHZhbHVlIHdpdGggdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIGdpdmVuCisJICoge0Bjb2RlIEJvb2xlYW59LiBBbnkgZXhpc3RpbmcgcmVsYXRpb24gdG8gYSB7QGxpbmsgVW5pdH0gd2lsbCBiZSByZW1vdmVkLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWx1ZShCb29sZWFuIHZhbHVlKSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5CT09MRUFOKTsKKwkJZ2V0UGFyYW1ldGVyVmFsdWUoKS5zZXQodmFsdWUudG9TdHJpbmcoKSk7CisJCXNldFVuaXQobnVsbCk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB2YWx1ZSB3aXRoIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiBnaXZlbgorCSAqIHtAY29kZSBCeXRlfS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUgcmVwbGFjZWQgd2l0aAorCSAqIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0Qnl0ZVZhbHVlKEJ5dGUgdmFsdWUsIFVuaXQgdW5pdCkgeworCQlzZXRTY2FsYXJUeXBlKFNjYWxhclR5cGUuQllURSk7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQgdmFsdWUgd2l0aCB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgZ2l2ZW4KKwkgKiB7QGNvZGUgU2hvcnR9LiBBbnkgZXhpc3RpbmcgcmVsYXRpb24gdG8gYSB7QGxpbmsgVW5pdH0gd2lsbCBiZSByZXBsYWNlZCB3aXRoCisJICogdGhlIGdpdmVuIG9uZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlci4KKwkgKiBAcGFyYW0gdW5pdCAgVGhlIHJlbGF0aW9uIHRvIGEgdW5pdCBpcyBvcHRpb25hbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaG9ydFZhbHVlKFNob3J0IHZhbHVlLCBVbml0IHVuaXQpIHsKKwkJc2V0U2NhbGFyVHlwZShTY2FsYXJUeXBlLlNIT1JUKTsKKwkJZ2V0UGFyYW1ldGVyVmFsdWUoKS5zZXQodmFsdWUudG9TdHJpbmcoKSk7CisJCXNldFVuaXQodW5pdCk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB2YWx1ZSB3aXRoIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiBnaXZlbgorCSAqIHtAY29kZSBJbnRlZ2VyfS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUgcmVwbGFjZWQKKwkgKiB3aXRoIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0SW50ZWdlclZhbHVlKEludGVnZXIgdmFsdWUsIFVuaXQgdW5pdCkgeworCQlzZXRTY2FsYXJUeXBlKFNjYWxhclR5cGUuSU5URUdFUik7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQgdmFsdWUgd2l0aCB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgZ2l2ZW4KKwkgKiB7QGNvZGUgTG9uZ30uIEFueSBleGlzdGluZyByZWxhdGlvbiB0byBhIHtAbGluayBVbml0fSB3aWxsIGJlIHJlcGxhY2VkIHdpdGgKKwkgKiB0aGUgZ2l2ZW4gb25lLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLgorCSAqIEBwYXJhbSB1bml0ICBUaGUgcmVsYXRpb24gdG8gYSB1bml0IGlzIG9wdGlvbmFsLgorCSAqLworCXB1YmxpYyB2b2lkIHNldExvbmdWYWx1ZShMb25nIHZhbHVlLCBVbml0IHVuaXQpIHsKKwkJc2V0U2NhbGFyVHlwZShTY2FsYXJUeXBlLkxPTkcpOworCQlnZXRQYXJhbWV0ZXJWYWx1ZSgpLnNldCh2YWx1ZS50b1N0cmluZygpKTsKKwkJc2V0VW5pdCh1bml0KTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50IHZhbHVlIHdpdGggdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIGdpdmVuCisJICoge0Bjb2RlIEZsb2F0fS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUgcmVwbGFjZWQgd2l0aAorCSAqIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0RmxvYXRWYWx1ZShGbG9hdCB2YWx1ZSwgVW5pdCB1bml0KSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5GTE9BVCk7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQgdmFsdWUgd2l0aCB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgZ2l2ZW4KKwkgKiB7QGNvZGUgRG91YmxlfS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUgcmVwbGFjZWQgd2l0aAorCSAqIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUoRG91YmxlIHZhbHVlLCBVbml0IHVuaXQpIHsKKwkJc2V0U2NhbGFyVHlwZShTY2FsYXJUeXBlLkRPVUJMRSk7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQgdmFsdWUgd2l0aCB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgZ2l2ZW4KKwkgKiB7QGNvZGUgRmxvYXRDb21wbGV4fS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUKKwkgKiByZXBsYWNlZCB3aXRoIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0RmxvYXRDb21wbGV4VmFsdWUoRmxvYXRDb21wbGV4IHZhbHVlLCBVbml0IHVuaXQpIHsKKwkJc2V0U2NhbGFyVHlwZShTY2FsYXJUeXBlLkZMT0FUX0NPTVBMRVgpOworCQlnZXRQYXJhbWV0ZXJWYWx1ZSgpLnNldCh2YWx1ZS50b1N0cmluZygpKTsKKwkJc2V0VW5pdCh1bml0KTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50IHZhbHVlIHdpdGggdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIGdpdmVuCisJICoge0Bjb2RlIERvdWJsZUNvbXBsZXh9LiBBbnkgZXhpc3RpbmcgcmVsYXRpb24gdG8gYSB7QGxpbmsgVW5pdH0gd2lsbCBiZQorCSAqIHJlcGxhY2VkIHdpdGggdGhlIGdpdmVuIG9uZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlci4KKwkgKiBAcGFyYW0gdW5pdCAgVGhlIHJlbGF0aW9uIHRvIGEgdW5pdCBpcyBvcHRpb25hbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREb3VibGVDb21wbGV4VmFsdWUoRG91YmxlQ29tcGxleCB2YWx1ZSwgVW5pdCB1bml0KSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWCk7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgiKE5hbWUgPSAiKS5hcHBlbmQoZ2V0TmFtZSgpKTsKKworCQlzYi5hcHBlbmQoIiwgVmFsdWUgPSAiKTsKKwkJVmFsdWUgcGFyYW1ldGVyVmFsdWUgPSBnZXRQYXJhbWV0ZXJWYWx1ZSgpOworCQlpZiAocGFyYW1ldGVyVmFsdWUuaXNWYWxpZCgpKSB7CisJCQlzYi5hcHBlbmQoKFN0cmluZykgZ2V0UGFyYW1ldGVyVmFsdWUoKS5leHRyYWN0KCkpOworCQl9CisKKwkJT3B0aW9uYWw8VW5pdD4gdW5pdCA9IGdldFVuaXQoKTsKKwkJaWYgKHVuaXQuaXNQcmVzZW50KCkpIHsKKwkJCXNiLmFwcGVuZCgiIFsiKS5hcHBlbmQodW5pdC5nZXQoKS5nZXROYW1lKCkpLmFwcGVuZCgnXScpOworCQl9CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBWYWx1ZX0gb2YgdGhpcyBwYXJhbWV0ZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoaXMgcGFyYW1ldGVyJ3Mge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIFZhbHVlIGdldFBhcmFtZXRlclZhbHVlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoYXR0clZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzY2FsYXIgdmFsdWUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlci4KKwkgKgorCSAqIEByZXR1cm4gVGhpcyBwYXJhbWV0ZXIncyBzY2FsYXIgdHlwZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIFNjYWxhclR5cGUgZ2V0U2NhbGFyVHlwZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKGF0dHJTY2FsYXJUeXBlKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgc2NhbGFyIHR5cGUgZm9yIHRoaXMgcGFyYW1ldGVyLgorCSAqCisJICogQHBhcmFtIHNjYWxhclR5cGUgVGhlIG5ldyB7QGNvZGUgU2NhbGFyVHlwZX0uCisJICovCisJcHJpdmF0ZSB2b2lkIHNldFNjYWxhclR5cGUoU2NhbGFyVHlwZSBzY2FsYXJUeXBlKSB7CisJCWdldFZhbHVlKGF0dHJTY2FsYXJUeXBlKS5zZXQoc2NhbGFyVHlwZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRlZCB7QGxpbmsgVW5pdH0uIElmIG5vIHtAY29kZSBVbml0fSBpcyByZWxhdGVkLAorCSAqIGFuIGVtcHR5IHtAY29kZSBTdHJpbmd9IGlzIHJldHVybmVkIGluc3RlYWQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSByZWxhdGVkIHtAY29kZSBVbml0fSBpcyByZXR1cm5lZCBvciBhbiBlbXB0eQorCSAqICAgICAgICAge0Bjb2RlIFN0cmluZ30uCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pdE5hbWUoKSB7CisJCU9wdGlvbmFsPFVuaXQ+IHVuaXQgPSBnZXRVbml0KCk7CisJCWlmICh1bml0LmlzUHJlc2VudCgpKSB7CisJCQlyZXR1cm4gdW5pdC5nZXQoKS5nZXROYW1lKCk7CisJCX0KKworCQlyZXR1cm4gIiI7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBvcHRpb25hbGx5IHJlbGF0ZWQge0BsaW5rIFVuaXR9LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBubyB7QGNvZGUgVW5pdH0gaXMgcmVsYXRlZC4KKwkgKi8KKwlwcml2YXRlIE9wdGlvbmFsPFVuaXQ+IGdldFVuaXQoKSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVW5pdC5jbGFzcykpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQge0BsaW5rIFVuaXR9IHJlbGF0aW9uIHdpdGggdGhlIGdpdmVuIG9uZSwgaWYgdGhlIHtAY29kZQorCSAqIE9wdGlvbmFsfSBpcyBub3QgZW1wdHkuIE90aGVyd2lzZSBhbnkgY3VycmVudCByZWxhdGlvbnMgaXMgcmVtb3ZlZC4KKwkgKgorCSAqIEBwYXJhbSB1bml0IFRoZSBuZXcge0Bjb2RlIFVuaXR9IG1heSBiZSB7QGNvZGUgbnVsbH0uCisJICovCisJcHJpdmF0ZSB2b2lkIHNldFVuaXQoVW5pdCB1bml0KSB7CisJCWlmICh1bml0ID09IG51bGwpIHsKKwkJCWdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5yZW1vdmUoVW5pdC5jbGFzcyk7CisJCX0gZWxzZSB7CisJCQlnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHVuaXQpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ2hhbm5lbC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NoYW5uZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGNlMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NoYW5uZWwuamF2YQpAQCAtMCwwICsxLDI3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGNoYW5uZWwgZW50aXR5IHR5cGUuIEVudGl0aWVzIG9mIHRoaXMgdHlwZSBhcmUgYmFzZWQgb24KKyAqIHtAbGluayBRdWFudGl0eX1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBNZWFzdXJlbWVudAorICogQHNlZSBDaGFubmVsR3JvdXAKKyAqIEBzZWUgQ29udGV4dFNlbnNvcgorICogQHNlZSBQYXJhbWV0ZXJTZXQKKyAqLworcHVibGljIGNsYXNzIENoYW5uZWwgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSB7CisKKwkvLyBUT0RPIENoYW5uZWwgbWF5IGhhdmUgYSByZWxhdGlvbiB0byBhIHNlbnNvciEKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIE1lYXN1cmVtZW50fSBwYXJlbnQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPE1lYXN1cmVtZW50PiBQQVJFTlRfVFlQRV9NRUFTVVJFTUVOVCA9IE1lYXN1cmVtZW50LmNsYXNzOworCisJLyoqCisJICogVGhlIHtAbGluayBDaGFubmVsR3JvdXB9IHBhcmVudCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Q2hhbm5lbEdyb3VwPiBQQVJFTlRfVFlQRV9DSEFOTkVMR1JPVVAgPSBDaGFubmVsR3JvdXAuY2xhc3M7CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIFBhcmFtZXRlclNldH0gY2hpbGQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFBhcmFtZXRlclNldD4gQ0hJTERfVFlQRV9QQVJBTUVURVJTRVQgPSBQYXJhbWV0ZXJTZXQuY2xhc3M7CisKKwkvKioKKwkgKiBUaGUgJ01pbmltdW0nIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUlOSU1VTSA9ICJNaW5pbXVtIjsKKworCS8qKgorCSAqIFRoZSAnTWF4aW11bScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVhJTVVNID0gIk1heGltdW0iOworCisJLyoqCisJICogVGhlICdBdmVyYWdlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FWRVJBR0UgPSAiQXZlcmFnZSI7CisKKwkvKioKKwkgKiBUaGUgJ0RldmlhdGlvbicgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERVZJQVRJT04gPSAiRGV2aWF0aW9uIjsKKworCS8qKgorCSAqIFRoZSAnU2NhbGFyVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TQ0FMQVJfVFlQRSA9ICJEYXRhVHlwZSI7CisKKwkvKioKKwkgKiBUaGUgJ0ludGVycG9sYXRpb24nIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSU5URVJQT0xBVElPTiA9ICJJbnRlcnBvbGF0aW9uIjsKKworCS8qKgorCSAqIFRoZSAnUmFuaycgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SQU5LID0gIlJhbmsiOworCisJLyoqCisJICogVGhlICdUeXBlU2l6ZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UWVBFX1NJWkUgPSAiVHlwZVNpemUiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlDaGFubmVsKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1pbmltdW0gdmFsdWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIERvdWJsZSBnZXRNaW5pbXVtKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9NSU5JTVVNKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgbWluaW11bSB2YWx1ZSBmb3IgdGhpcyBjaGFubmVsLgorCSAqCisJICogQHBhcmFtIG1pbmltdW0gVGhlIG5ldyBtaW5pbXVtIHZhbHVlLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1pbmltdW0oRG91YmxlIG1pbmltdW0pIHsKKwkJZ2V0VmFsdWUoQVRUUl9NSU5JTVVNKS5zZXQobWluaW11bSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZhbHVlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBEb3VibGUgZ2V0TWF4aW11bSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUFYSU1VTSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IG1heGltdW0gdmFsdWUgZm9yIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEBwYXJhbSBtYXhpbXVtIFRoZSBuZXcgbWF4aW11bSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhpbXVtKERvdWJsZSBtYXhpbXVtKSB7CisJCWdldFZhbHVlKEFUVFJfTUFYSU1VTSkuc2V0KG1heGltdW0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhpcyBjaGFubmVsLgorCSAqCisJICogQHJldHVybiBUaGUgYXZlcmFnZSB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgRG91YmxlIGdldEF2ZXJhZ2UoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0FWRVJBR0UpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBhdmVyYWdlIHZhbHVlIGZvciB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcGFyYW0gYXZlcmFnZSBUaGUgbmV3IGF2ZXJhZ2UgdmFsdWUuCisJICovCisJcHVibGljIHZvaWQgc2V0QXZlcmFnZShEb3VibGUgYXZlcmFnZSkgeworCQlnZXRWYWx1ZShBVFRSX0FWRVJBR0UpLnNldChhdmVyYWdlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZXZpYXRpb24gdmFsdWUgb2YgdGhpcyBjaGFubmVsLgorCSAqCisJICogQHJldHVybiBUaGUgZGV2aWF0aW9uIHZhbHVlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBEb3VibGUgZ2V0RGV2aWF0aW9uKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERVZJQVRJT04pLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBkZXZpYXRpb24gdmFsdWUgZm9yIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEBwYXJhbSBkZXZpYXRpb24gVGhlIG5ldyBkZXZpYXRpb24gdmFsdWUuCisJICovCisJcHVibGljIHZvaWQgc2V0RGV2aWF0aW9uKERvdWJsZSBkZXZpYXRpb24pIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERVZJQVRJT04pLnNldChkZXZpYXRpb24pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBTY2FsYXJUeXBlfSBvZiB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgU2NhbGFyVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFNjYWxhclR5cGUgZ2V0U2NhbGFyVHlwZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfU0NBTEFSX1RZUEUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB7QGxpbmsgU2NhbGFyVHlwZX0gZm9yIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEBwYXJhbSBzY2FsYXJUeXBlIFRoZSBuZXcge0Bjb2RlIFNjYWxhclR5cGV9LgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB7QGNvZGUgU2NhbGFyVHlwZX0gaXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgU2NhbGFyVHlwZSNVTktOT1dOfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTY2FsYXJUeXBlKFNjYWxhclR5cGUgc2NhbGFyVHlwZSkgeworCQlpZiAoc2NhbGFyVHlwZS5pc1Vua25vd24oKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2NhbGFyIHR5cGUgY29uc3RhbnQgaXMgbm90IGFsbG93ZWQgdG8gYmUgJyIgKyBzY2FsYXJUeXBlICsgIicuIik7CisJCX0KKworCQlnZXRWYWx1ZShBVFRSX1NDQUxBUl9UWVBFKS5zZXQoc2NhbGFyVHlwZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEludGVycG9sYXRpb259IG9mIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBJbnRlcnBvbGF0aW9ufSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZXJwb2xhdGlvbiBnZXRJbnRlcnBvbGF0aW9uKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9JTlRFUlBPTEFUSU9OKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgaW50ZXJwb2xhdGlvbiBmb3IgdGhpcyBjaGFubmVsLgorCSAqCisJICogQHBhcmFtIGludGVycG9sYXRpb24gVGhlIG5ldyB7QGNvZGUgSW50ZXJwb2xhdGlvbn0uCisJICovCisJcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdGlvbihJbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24pIHsKKwkJZ2V0VmFsdWUoQVRUUl9JTlRFUlBPTEFUSU9OKS5zZXQoaW50ZXJwb2xhdGlvbik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmFuayBvZiB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByYW5rIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldFJhbmsoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1JBTkspLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyByYW5rIGZvciB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcGFyYW0gcmFuayBUaGUgbmV3IHJhbmsuCisJICovCisJcHVibGljIHZvaWQgc2V0UmFuayhJbnRlZ2VyIHJhbmspIHsKKwkJZ2V0VmFsdWUoQVRUUl9SQU5LKS5zZXQocmFuayk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdHlwZSBzaXplIG9mIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHR5cGUgc2l6ZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRUeXBlU2l6ZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfVFlQRV9TSVpFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgdHlwZSBzaXplIGZvciB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcGFyYW0gdHlwZVNpemUgVGhlIG5ldyB0eXBlIHNpemUuCisJICovCisJcHVibGljIHZvaWQgc2V0VHlwZVNpemUoSW50ZWdlciB0eXBlU2l6ZSkgeworCQlnZXRWYWx1ZShBVFRSX1RZUEVfU0laRSkuc2V0KHR5cGVTaXplKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWxhdGVkIHtAbGluayBVbml0fS4KKwkgKgorCSAqIEByZXR1cm4gUmVsYXRlZCB7QGNvZGUgVW5pdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFVuaXQgZ2V0VW5pdCgpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVW5pdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVsYXRlZCB7QGxpbmsgUXVhbnRpdHl9LgorCSAqCisJICogQHJldHVybiBSZWxhdGVkIHtAY29kZSBRdWFudGl0eX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFF1YW50aXR5IGdldFF1YW50aXR5KCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLmdldChRdWFudGl0eS5jbGFzcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ2hhbm5lbEdyb3VwLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ2hhbm5lbEdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkMWJjNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9DaGFubmVsR3JvdXAuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2hhbm5lbCBncm91cCBlbnRpdHkgdHlwZS4gSXQgYmVsb25ncyB0byBleGFjdGx5IG9uZQorICoge0BsaW5rIE1lYXN1cmVtZW50fSBhbmQgZ3JvdXBzIGEgc2V0IG9mIGl0cyB7QGxpbmsgQ2hhbm5lbH1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgQ2hhbm5lbEdyb3VwIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIHtAbGluayBNZWFzdXJlbWVudH0gcGFyZW50IHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxNZWFzdXJlbWVudD4gUEFSRU5UX1RZUEVfTUVBU1VSRU1FTlQgPSBNZWFzdXJlbWVudC5jbGFzczsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgQ2hhbm5lbH0gY2hpbGQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPENoYW5uZWw+IENISUxEX1RZUEVfQ0hBTk5FTCA9IENoYW5uZWwuY2xhc3M7CisKKwkvKioKKwkgKiBUaGUgJ051bWJlck9mVmFsdWVzJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05VTUJFUl9PRl9WQUxVRVMgPSAiU3ViTWF0cml4Tm9Sb3dzIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJQ2hhbm5lbEdyb3VwKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWVhc3VyZWQgdmFsdWVzIG9mIGVhY2ggcmVsYXRlZCB7QGxpbmsgQ2hhbm5lbH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbWVhc3VyZWQgdmFsdWVzIHBlciB7QGNvZGUgQ2hhbm5lbH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEludGVnZXIgZ2V0TnVtYmVyT2ZWYWx1ZXMoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX05VTUJFUl9PRl9WQUxVRVMpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBudW1iZXIgb2YgdmFsdWVzIGZvciB0aGlzIGNoYW5uZWwgZ3JvdXAuCisJICoKKwkgKiBAcGFyYW0gbnVtYmVyT2ZWYWx1ZXMgVGhlIG5ldyBudW1iZXIgb2YgdmFsdWVzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE51bWJlck9mVmFsdWVzKEludGVnZXIgbnVtYmVyT2ZWYWx1ZXMpIHsKKwkJZ2V0VmFsdWUoQVRUUl9OVU1CRVJfT0ZfVkFMVUVTKS5zZXQobnVtYmVyT2ZWYWx1ZXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRDb21wb25lbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Q29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3ZTY1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Q29tcG9uZW50LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29udGV4dCBjb21wb25lbnQgZW50aXR5IHR5cGVzLiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcworICogYXJlIG9ubHkgcHJvdmlkZWQgLyBtYW5hZ2VkIHZpYSB0aGUgb3duaW5nIGRlc2NyaXB0aXZlIHtAbGluayBDb250ZXh0Um9vdH0uCisgKiBBZGRpdGlvbmFsbHkgaWYgdGhlIG93bmluZyB7QGNvZGUgQ29udGV4dFJvb3R9IGlzIG9mIHR5cGUKKyAqIHtAbGluayBDb250ZXh0VHlwZSNURVNURVFVSVBNRU5UfSB0aGlzIGNvbnRleHQgY29tcG9uZW50IG1heSBoYXZlIHJlbGF0aW9ucworICogdG8ge0BsaW5rIENvbnRleHRTZW5zb3J9cyB3aG9zZSBuYW1lcyBoYXZlIHRvIGJlIHVuaXF1ZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIENvbnRleHRDb21wb25lbnQgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJQ29udGV4dENvbXBvbmVudChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRTZW5zb3J9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgQ29udGV4dFNlbnNvcn0uCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBhIHtAY29kZSBDb250ZXh0U2Vuc29yfSB3aXRoIGdpdmVuCisJICogICAgICAgICBuYW1lIGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxDb250ZXh0U2Vuc29yPiBnZXRDb250ZXh0U2Vuc29yKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBnZXRDb250ZXh0U2Vuc29ycygpLnN0cmVhbSgpLmZpbHRlcihjcyAtPiBjcy5uYW1lRXF1YWxzKG5hbWUpKS5maW5kQW55KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHtAbGluayBDb250ZXh0U2Vuc29yfXMgcmVsYXRlZCB0byB0aGlzIGNvbnRleHQKKwkgKiBjb21wb25lbnQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PENvbnRleHRTZW5zb3I+IGdldENvbnRleHRTZW5zb3JzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoQ29udGV4dFNlbnNvci5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRSb290fSB0aGlzIGNvbnRleHQgY29tcG9uZW50IGJlbG9uZ3MgdG8uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQge0BsaW5rIENvbnRleHRSb290fS4KKwkgKi8KKwlwdWJsaWMgQ29udGV4dFJvb3QgZ2V0Q29udGV4dFJvb3QoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoQ29udGV4dFJvb3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBDb250ZXh0U2Vuc29yfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB7QGNvZGUgQ29udGV4dFNlbnNvcn0gdGhhdCBoYXMgdG8gYmUgcmVtb3ZlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgQ29udGV4dFNlbnNvcn0gd2l0aCBnaXZlbiBuYW1lIGhhcworCSAqICAgICAgICAgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZUNvbnRleHRTZW5zb3IoU3RyaW5nIG5hbWUpIHsKKwkJT3B0aW9uYWw8Q29udGV4dFNlbnNvcj4gY2F0YWxvZ1NlbnNvciA9IGdldENvbnRleHRTZW5zb3IobmFtZSk7CisJCWlmIChjYXRhbG9nU2Vuc29yLmlzUHJlc2VudCgpKSB7CisJCQlnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLnJlbW92ZShjYXRhbG9nU2Vuc29yLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkubWFwKFZhbHVlOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKworCQlMaXN0PENvbnRleHRTZW5zb3I+IGNvbnRleHRTZW5zb3JzID0gZ2V0Q29udGV4dFNlbnNvcnMoKTsKKwkJaWYgKCFjb250ZXh0U2Vuc29ycy5pc0VtcHR5KCkpIHsKKwkJCXNiLmFwcGVuZCgiLCBDb250ZXh0U2Vuc29ycyA9ICIpLmFwcGVuZChjb250ZXh0U2Vuc29ycyk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0RGVzY3JpYmFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0RGVzY3JpYmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg0ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHREZXNjcmliYWJsZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkJhc2VFbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworCisvKioKKyAqIHtAbGluayBUZXN0U3RlcH0gYW5kIHtAbGluayBNZWFzdXJlbWVudH0gZW50aXR5IHR5cGVzIGltcGxlbWVudCB0aGlzCisgKiBpbnRlcmZhY2UgdG8gaW5kaWNhdGUgdGhlIGF2YWlsYWJpbGl0eSBvZiBkZXNjcmlwdGl2ZSBjb250ZXh0IGRhdGEuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIENvbnRleHRSb290CisgKiBAc2VlIENvbnRleHRDb21wb25lbnQKKyAqIEBzZWUgQ29udGV4dFNlbnNvcgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbnRleHREZXNjcmliYWJsZSBleHRlbmRzIEVudGl0eSB7CisJLyoqCisJICogUXVlcmllcyBhdmFpbGFibGUge0BsaW5rIENvbnRleHRUeXBlfSBmb3IgZ2l2ZW4ge0BsaW5rIENvbnRleHREZXNjcmliYWJsZX0uCisJICoKKwkgKiBAcGFyYW0gbWFuYWdlciBBbiBvYmplY3QgaW1wbGVtZW50aW5nIEJhc2VFbnRpdHlNYW5hZ2VyLgorCSAqIEByZXR1cm4ge0Bjb2RlIExpc3R9IGNvbnRhaW5zIHRoZSB7QGNvZGUgQ29udGV4dFR5cGV9IG9mIGVhY2ggcmVmZXJlbmNlZAorCSAqICAgICAgICAge0BsaW5rIENvbnRleHRSb290fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBxdWVyeSB0aGUgYXZhaWxhYmxlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBDb250ZXh0VHlwZX1zLgorCSAqLworCUxpc3Q8Q29udGV4dFR5cGU+IGxvYWRDb250ZXh0VHlwZXMoQmFzZUVudGl0eU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgcmVxdWVzdGVkIHtAbGluayBDb250ZXh0Um9vdH1zIGZvciBnaXZlbgorCSAqIHtAbGluayBDb250ZXh0RGVzY3JpYmFibGV9LgorCSAqCisJICogQHBhcmFtIG1hbmFnZXIgICAgICBBbiBvYmplY3QgaW1wbGVtZW50aW5nIEJhc2VFbnRpdHlNYW5hZ2VyLgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZXMgVGhlIHJlcXVlc3RlZCBjb250ZXh0IHR5cGVzLiBJZiBvbWl0dGVkLCBhbGwgdHlwZXMgYXJlIGJlCisJICogICAgICAgICAgICAgICAgICAgICBsb2FkZWQuCisJICogQHJldHVybiBUaGUgb3JkZXJlZCBjb250ZXh0cyBmb3IgZ2l2ZW4ge0Bjb2RlIFRlc3RTdGVwfSBvciB0aGUgbWVhc3VyZWQgb25lcworCSAqICAgICAgICAgZm9yIHtAY29kZSBNZWFzdXJlbWVudH0gYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIE1hcH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIHtAY29kZQorCSAqIAkJQ29udGV4dFJvb3R9ICAgICAgICBzLgorCSAqIEBzZWUgQ29udGV4dFR5cGUKKwkgKi8KKwlNYXA8Q29udGV4dFR5cGUsIENvbnRleHRSb290PiBsb2FkQ29udGV4dHMoQmFzZUVudGl0eU1hbmFnZXIgbWFuYWdlciwgQ29udGV4dFR5cGUuLi4gY29udGV4dFR5cGVzKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Um9vdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRSb290LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhNDUxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Um9vdC5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29udGV4dCByb290IGVudGl0eSB0eXBlcy4gVGhpcyBpcyB0aGUgcm9vdCBub2RlIG9mIHRoZQorICogZGVzY3JpcHRpdmUgY29tcG9uZW50IHN0cnVjdHVyZSBmb3IgYSB7QGxpbmsgQ29udGV4dFR5cGV9LiBUaGlzIGVsZW1lbnQgaXMKKyAqIHVzZWQgZm9yIGJvdGgsIG9yZGVyIGFuZCBtZWFzdXJlZCByZXN1bHQgZGVzY3JpcHRpb24gZGF0YS4gSWYgaXQgYmVsb25ncyB0bworICogYW4gb3JkZXIgZGVzY3JpcHRpb24sIHRoZW4gYSByZWxhdGlvbiB0byBhIHtAbGluayBUZXN0U3RlcH0gZXhpc3RzLiBPdGhlcndpc2UKKyAqIGl0IHJlcHJlc2VudHMgdGhlIGRlc2NyaXB0aW9uIG9mIGEgbWVhc3VyZW1lbnQgYW5kIHRoZXJlZm9yZSBoYXMgb25lIG9yZSBtb3JlCisgKiByZWxhdGlvbnMgdG8ge0BsaW5rIE1lYXN1cmVtZW50fXMuIEluIHRoZSBiYXNlIGFwcGxpY2F0aW9uIG1vZGVsIHRoZQorICogY29tcG9uZW50IHN0cnVjdHVyZSBpcyBwcm92aWRlZCBhcyBpcy4gQW4gZXh0ZW5zaW9uIG9mIHRoZSBiYXNlIGFwcGxpY2F0aW9uCisgKiBtb2RlbCBtYXkgZGVmaW5lIGEgdGVtcGxhdGUsIHRoZSBzdHJ1Y3R1cmUgb2YgY29udGFpbmVkCisgKiB7QGxpbmsgQ29udGV4dENvbXBvbmVudH1zIGFuZCB7QGxpbmsgQ29udGV4dFNlbnNvcn1zIHdpbGwgYmUgcmVzdHJpY3RlZCB0by4KKyAqIEFkZGl0aW9uYWxseSB0aGUgPGI+bmFtZXM8L2I+IG9mIGFsbCByZWxhdGVkIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fXMgaGF2ZQorICogdG8gYmUgdW5pcXVlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgQ29udGV4dFJvb3QgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ1ZlcnNpb24nIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJWZXJzaW9uIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlDb250ZXh0Um9vdChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJCWNvbnRleHRUeXBlID0gQ29udGV4dFR5cGUudmFsdWVPZihjb3JlLmdldFR5cGVOYW1lKCkudG9VcHBlckNhc2UoTG9jYWxlLlJPT1QpKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29udGV4dFR5cGV9IG9mIHRoaXMgY29udGV4dCByb290LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENvbnRleHRUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoKSB7CisJCXJldHVybiBjb250ZXh0VHlwZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIENvbnRleHRDb21wb25lbnR9IHdpdGgKKwkgKiAgICAgICAgIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPENvbnRleHRDb21wb25lbnQ+IGdldENvbnRleHRDb21wb25lbnQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldENvbnRleHRDb21wb25lbnRzKCkuc3RyZWFtKCkuZmlsdGVyKGNjIC0+IGNjLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIENvbnRleHRDb21wb25lbnR9cyByZWxhdGVkIHRvIHRoaXMgY29udGV4dCByb290LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxDb250ZXh0Q29tcG9uZW50PiBnZXRDb250ZXh0Q29tcG9uZW50cygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KENvbnRleHRDb21wb25lbnQuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBDb250ZXh0Q29tcG9uZW50fSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB7QGNvZGUgQ29udGV4dENvbXBvbmVudH0gdGhhdCBoYXZlIHRvIGJlIHJlbW92ZWQuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIENvbnRleHRDb21wb25lbnR9IHdpdGggZ2l2ZW4gbmFtZQorCSAqICAgICAgICAgaGFzIGJlZW4gcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb250ZXh0Q29tcG9uZW50KFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPENvbnRleHRDb21wb25lbnQ+IGNvbnRleHRDb21wb25lbnQgPSBnZXRDb250ZXh0Q29tcG9uZW50KG5hbWUpOworCQlpZiAoY29udGV4dENvbXBvbmVudC5pc1ByZXNlbnQoKSkgeworCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUoY29udGV4dENvbXBvbmVudC5nZXQoKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIENvbnRleHRTZW5zb3J9cyByZWxhdGVkIHRvIHRoZQorCSAqIHtAbGluayBDb250ZXh0Q29tcG9uZW50fXMsIHdoaWNoIGFyZSBoZWxkIGJ5IHRoaXMgY29udGV4dCByb290LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IHdpbGwgYWx3YXlzIGJlIGVtcHR5IGlmIHRoaXMgY29udGV4dCByb290CisJICogICAgICAgICBpcyBvZiB0eXBlIHtAbGluayBDb250ZXh0VHlwZSNVTklUVU5ERVJURVNUfSBvcgorCSAqICAgICAgICAge0BsaW5rIENvbnRleHRUeXBlI1RFU1RTRVFVRU5DRX0uCisJICovCisJcHVibGljIExpc3Q8Q29udGV4dFNlbnNvcj4gZ2V0Q29udGV4dFNlbnNvcnMoKSB7CisJCWlmICghZ2V0Q29udGV4dFR5cGUoKS5pc1Rlc3RFcXVpcG1lbnQoKSkgeworCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQl9CisKKwkJcmV0dXJuIGdldENvbnRleHRDb21wb25lbnRzKCkuc3RyZWFtKCkubWFwKENvbnRleHRDb21wb25lbnQ6OmdldENvbnRleHRTZW5zb3JzKS5jb2xsZWN0KEFycmF5TGlzdDo6bmV3LAorCQkJCUxpc3Q6OmFkZEFsbCwgTGlzdDo6YWRkQWxsKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoaXMgY29udGV4dCByb290LgorCSAqCisJICogQHJldHVybiBUaGUgdmVyc2lvbiBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1ZFUlNJT04pLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB2ZXJzaW9uIGZvciB0aGlzIGNvbnRleHQgcm9vdC4KKwkgKgorCSAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBuZXcgdmVyc2lvbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCWdldFZhbHVlKEFUVFJfVkVSU0lPTikuc2V0KHZlcnNpb24pOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoIkNvbnRleHRUeXBlID0gIikuYXBwZW5kKGdldENvbnRleHRUeXBlKCkpLmFwcGVuZCgiLCAiKTsKKwkJc2IuYXBwZW5kKGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChWYWx1ZTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisKKwkJTGlzdDxDb250ZXh0Q29tcG9uZW50PiBjb250ZXh0Q29tcG9uZW50cyA9IGdldENvbnRleHRDb21wb25lbnRzKCk7CisJCWlmICghY29udGV4dENvbXBvbmVudHMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgQ29udGV4dENvbXBvbmVudHMgPSAiKS5hcHBlbmQoY29udGV4dENvbXBvbmVudHMpOworCQl9CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFjY2VzcyB0aGUge0BsaW5rIENvbnRleHRSb290fXMgb2YgbmV3bHkgY3JlYXRlZAorCSAqIHtAbGluayBDb250ZXh0RGVzY3JpYmFibGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHREZXNjcmliYWJsZSBFaXRoZXIgYSB7QGxpbmsgVGVzdFN0ZXB9IG9yIGEge0BsaW5rIE1lYXN1cmVtZW50fS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ29udGV4dFJvb3R9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PENvbnRleHRSb290PiBvZihDb250ZXh0RGVzY3JpYmFibGUgY29udGV4dERlc2NyaWJhYmxlKSB7CisJCUxpc3Q8Q29udGV4dFJvb3Q+IGNvbnRleHRSb290cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlvZihjb250ZXh0RGVzY3JpYmFibGUsIENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpLmlmUHJlc2VudChjb250ZXh0Um9vdHM6OmFkZCk7CisJCW9mKGNvbnRleHREZXNjcmliYWJsZSwgQ29udGV4dFR5cGUuVEVTVFNFUVVFTkNFKS5pZlByZXNlbnQoY29udGV4dFJvb3RzOjphZGQpOworCQlvZihjb250ZXh0RGVzY3JpYmFibGUsIENvbnRleHRUeXBlLlRFU1RFUVVJUE1FTlQpLmlmUHJlc2VudChjb250ZXh0Um9vdHM6OmFkZCk7CisJCXJldHVybiBjb250ZXh0Um9vdHM7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBDb250ZXh0Um9vdH0gd2l0aCBnaXZlbiB7QGxpbmsgQ29udGV4dFR5cGV9IGZyb20gZ2l2ZW4KKwkgKiB7QGxpbmsgQ29udGV4dERlc2NyaWJhYmxlfS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0RGVzY3JpYmFibGUgRWl0aGVyIGEge0BsaW5rIFRlc3RTdGVwfSBvciBhIHtAbGluayBNZWFzdXJlbWVudH0uCisJICogQHBhcmFtIGNvbnRleHRUeXBlICAgICAgICBUaGUgcmVxdWVzdGVkIHtAY29kZSBDb250ZXh0VHlwZX0uCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIENvbnRleHRSb290fSB3aXRoIGdpdmVuCisJICogICAgICAgICB7QGNvZGUgQ29udGV4dFR5cGV9IGRvZXMgbm90IGV4aXN0LgorCSAqLworCXByaXZhdGUgc3RhdGljIE9wdGlvbmFsPENvbnRleHRSb290PiBvZihDb250ZXh0RGVzY3JpYmFibGUgY29udGV4dERlc2NyaWJhYmxlLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKGNvbnRleHREZXNjcmliYWJsZSkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KENvbnRleHRSb290LmNsYXNzLCBjb250ZXh0VHlwZSkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRTZW5zb3IuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0U2Vuc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlYTBmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0U2Vuc29yLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbnRleHQgc2Vuc29yIGVudGl0eSB0eXBlcy4gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MKKyAqIGFyZSBvbmx5IHByb3ZpZGVkIC8gbWFuYWdlZCB2aWEgdGhlIG93bmluZyB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0uIEEKKyAqIGNvbnRleHQgc2Vuc29yIG1heSBiZSByZWxhdGVkIHRvIGEge0BsaW5rIENoYW5uZWx9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgQ29udGV4dFNlbnNvciBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZWxldGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlDb250ZXh0U2Vuc29yKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gdGhpcyBjb250ZXh0IHNlbnNvciBiZWxvbmdzIHRvLgorCSAqCisJICogQHJldHVybiBUaGUgcGFyZW50IHtAbGluayBDb250ZXh0Q29tcG9uZW50fQorCSAqLworCXB1YmxpYyBDb250ZXh0Q29tcG9uZW50IGdldENvbnRleHRDb21wb25lbnQoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoQ29udGV4dENvbXBvbmVudC5jbGFzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ29udGV4dFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjVjZGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRUeXBlLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBDb250ZXh0IHR5cGUgZW51bWVyYXRpb24uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIENvbnRleHRSb290CisgKi8KK3B1YmxpYyBlbnVtIENvbnRleHRUeXBlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBFbnVtZXJhdGlvbnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBIHtAbGluayBDb250ZXh0Um9vdH0gb2YgdGhpcyB0eXBlIHVuaXRlcyBtZXRhIGRhdGEgb2YgdGhlIHVuaXQgdW5kZXIgdGVzdC4KKwkgKi8KKwlVTklUVU5ERVJURVNULAorCisJLyoqCisJICogQSB7QGxpbmsgQ29udGV4dFJvb3R9IG9mIHRoaXMgdHlwZSB1bml0ZXMgbWV0YSBkYXRhIG9mIHRoZSB0ZXN0IGNvbmRpdGlvbnMuCisJICovCisJVEVTVFNFUVVFTkNFLAorCisJLyoqCisJICogQSB7QGxpbmsgQ29udGV4dFJvb3R9IG9mIHRoaXMgdHlwZSB1bml0ZXMgbWV0YSBkYXRhIG9mIHRoZSB1c2VkIGVxdWlwbWVudAorCSAqIChoYXJkd2FyZSBhbmQgc2Vuc29ycykuCisJICovCisJVEVTVEVRVUlQTUVOVDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbnRleHQgdHlwZSBpcyB7QGxpbmsgI1VOSVRVTkRFUlRFU1R9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVW5pdFVuZGVyVGVzdCgpIHsKKwkJcmV0dXJuIFVOSVRVTkRFUlRFU1QgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb250ZXh0IHR5cGUgaXMge0BsaW5rICNURVNUU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVGVzdFNlcXVlbmNlKCkgeworCQlyZXR1cm4gVEVTVFNFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29udGV4dCB0eXBlIGlzIHtAbGluayAjVEVTVEVRVUlQTUVOVH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNUZXN0RXF1aXBtZW50KCkgeworCQlyZXR1cm4gVEVTVEVRVUlQTUVOVCA9PSB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0RhdGFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9EYXRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2MGVhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9EYXRhYmxlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIHtAbGluayBFbnRpdHl9IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgZ2V0dGVyIGFuZAorICogc2V0dGVyIG1ldGhvZHMgZm9yIHRoZSAnRGF0ZUNyZWF0ZWQnIGZpZWxkIG9mIGFuIGVudGl0eS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhYmxlIGV4dGVuZHMgRW50aXR5IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ0RhdGVDcmVhdGVkJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlTdHJpbmcgQVRUUl9EQVRFX0NSRUFURUQgPSAiRGF0ZUNyZWF0ZWQiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY3JlYXRpb24gdGltZSBzdGFtcCBvZiB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGNyZWF0aW9uIHRpbWUgc3RhbXAgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBMb2NhbERhdGVUaW1lIGdldERhdGVDcmVhdGVkKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9EQVRFX0NSRUFURUQpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXQgbmV3IGNyZWF0aW9uIHRpbWUgc3RhbXAgZm9yIHRoaXMgZW50aXR5LgorCSAqCisJICogQHBhcmFtIGRhdGVDcmVhdGVkIFRoZSBuZXcgY3JlYXRpb24gdGltZSBzdGFtcC4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZSBkYXRlQ3JlYXRlZCkgeworCQlnZXRWYWx1ZShBVFRSX0RBVEVfQ1JFQVRFRCkuc2V0KGRhdGVDcmVhdGVkKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9EZWxldGFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9EZWxldGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmEwZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0RlbGV0YWJsZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGltcGxlbWVudGluZyBlbnRpdHkgdHlwZXMgYXJlIGFsbG93ZWQKKyAqIHRvIGJlIGRlbGV0ZWQuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGVsZXRhYmxlIGV4dGVuZHMgRW50aXR5IHsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Rlc2NyaWJhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRGVzY3JpYmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODg1Njk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Rlc2NyaWJhYmxlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBleHRlbmRzIHRoZSB7QGxpbmsgRW50aXR5fSBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIGdldHRlciBhbmQKKyAqIHNldHRlciBtZXRob2RzIGZvciB0aGUgJ0Rlc2NyaXB0aW9uJyBmaWVsZCBvZiBhbiBlbnRpdHkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGVzY3JpYmFibGUgZXh0ZW5kcyBFbnRpdHkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnRGVzY3JpcHRpb24nIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCVN0cmluZyBBVFRSX0RFU0NSSVBUSU9OID0gIkRlc2NyaXB0aW9uIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0RFU0NSSVBUSU9OKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGVzY3JpcHRpb24gZm9yIHRoaXMgZW50aXR5LgorCSAqCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBuZXcgZGVzY3JpcHRpb24uCisJICovCisJZGVmYXVsdCB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlnZXRWYWx1ZShBVFRSX0RFU0NSSVBUSU9OKS5zZXQoZGVzY3JpcHRpb24pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0RvdWJsZUNvbXBsZXguamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Eb3VibGVDb21wbGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3YTI0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Eb3VibGVDb21wbGV4LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29tcGxleCB2YWx1ZSB3aXRoIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiB0eXBlCisgKiB7QGNvZGUgZG91YmxlfS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERvdWJsZUNvbXBsZXggeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgZG91YmxlIHJlOworCXByaXZhdGUgZmluYWwgZG91YmxlIGltOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHJlYWwgICAgICBUaGUgcmVhbCBwYXJ0LgorCSAqIEBwYXJhbSBpbWFnaW5hcnkgVGhlIGltYWdpbmFyeSBwYXJ0LgorCSAqLworCXB1YmxpYyBEb3VibGVDb21wbGV4KGRvdWJsZSByZWFsLCBkb3VibGUgaW1hZ2luYXJ5KSB7CisJCXJlID0gcmVhbDsKKwkJaW0gPSBpbWFnaW5hcnk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUGFyc2VzIGdpdmVuIHtAY29kZSBTdHJpbmd9IHdoZXJlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBhcmUgc2VwYXJhdGVkIGJ5CisJICogb25lIG9yIG1vcmUgYmxhbmtzLiBGdXJ0aGVybW9yZSBib3RoIG11c3QgYmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB0aGF0IGNhbgorCSAqIGJlIHBhcnNlZCBieSBjYWxsaW5nIHtAbGluayBEb3VibGUjdmFsdWVPZihTdHJpbmcpfS4KKwkgKgorCSAqIEBwYXJhbSBzIFRoZSB7QGNvZGUgU3RyaW5nfSB0byBiZSBwYXJzZWQuCisJICogQHJldHVybiBUaGUgcGFyc2VkIHtAbGluayBEb3VibGVDb21wbGV4fSB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHBhcnNlIHRoZSBjb21wbGV4IHZhbHVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRG91YmxlQ29tcGxleCB2YWx1ZU9mKFN0cmluZyBzKSB7CisJCVN0cmluZ1tdIHZhbHVlcyA9IHMuc3BsaXQoIiArIik7CisJCWlmICh2YWx1ZXMubGVuZ3RoICE9IDIpIHsKKwkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSBjb21wbGV4IHZhbHVlLiIpOworCQl9CisKKwkJcmV0dXJuIG5ldyBEb3VibGVDb21wbGV4KERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZXNbMF0pLCBEb3VibGUucGFyc2VEb3VibGUodmFsdWVzWzFdKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVhbCBwYXJ0IG9mIHRoaXMgY29tcGxleCB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJlYWwgcGFydCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZG91YmxlIHJlYWwoKSB7CisJCXJldHVybiByZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGlzIGNvbXBsZXggdmFsdWUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBpbWFnaW5hcnkgcGFydCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZG91YmxlIGltYWdpbmFyeSgpIHsKKwkJcmV0dXJuIGltOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBsZXggdmFsdWUuCisJICogVGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBibGFuay4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tcGxleCB2YWx1ZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQocmVhbCgpKS5hcHBlbmQoJyAnKS5hcHBlbmQoaW1hZ2luYXJ5KCkpLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW50aXR5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1N2Q0NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnRpdHkuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGhpcyBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFueSBtb2RlbGVkIGVudGl0eSB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIEVudGl0eSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhpcyB7QGNvZGUgQ29tcGFyYXRvcn0gY29tcGFyZXMgZW50aXRpZXMgYnkgdGhlaXIgbmFtZSBpbiBhc2NlbmRpbmcgb3JkZXIuCisJICovCisJQ29tcGFyYXRvcjxFbnRpdHk+IENPTVBBUkFUT1IgPSBDb21wYXJhdG9yLmNvbXBhcmluZyhFbnRpdHk6OmdldE5hbWUpOworCisJLyoqCisJICogVGhlICdNaW1lVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJU3RyaW5nIEFUVFJfTUlNRVRZUEUgPSAiTWltZVR5cGUiOworCisJLyoqCisJICogVGhlICdOYW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlTdHJpbmcgQVRUUl9OQU1FID0gIk5hbWUiOworCisJLyoqCisJICogVGhlICdJZCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJU3RyaW5nIEFUVFJfSUQgPSAiSWQiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBlbnRpdHkgd2FzIHJldHJpZXZlZCBmcm9tLgorCSAqCisJICogQHJldHVybiBOYW1lIG9mIHRoZSBkYXRhIHNvdXJjZS4KKwkgKi8KKwlTdHJpbmcgZ2V0U291cmNlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW50aXR5IHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlIGlzIHJldHVybmVkLgorCSAqLworCVN0cmluZyBnZXRUeXBlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5zdGFuY2UgSUQgb3Ige0Bjb2RlIDB9IGlmIHRoaXMgaW5zdGFuY2UgaXMgbm90IHlldCBwZXJzaXN0ZWQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBJRCBpcyByZXR1cm5lZC4KKwkgKi8KKwlTdHJpbmcgZ2V0SUQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX05BTUUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBuYW1lIGZvciB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZS4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX05BTUUpLnNldChuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTWltZVR5cGV9IG9mIHRoaXMgZW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIE1pbWVUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IE1pbWVUeXBlIGdldE1pbWVUeXBlKCkgeworCQlyZXR1cm4gbmV3IE1pbWVUeXBlKGdldFZhbHVlKEFUVFJfTUlNRVRZUEUpLmV4dHJhY3QoKSk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcge0BsaW5rIE1pbWVUeXBlfSBmb3IgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG5ldyB7QGNvZGUgTWltZVR5cGV9LgorCSAqLworCWRlZmF1bHQgdm9pZCBzZXRNaW1lVHlwZShNaW1lVHlwZSBtaW1lVHlwZSkgeworCQlnZXRWYWx1ZShBVFRSX01JTUVUWVBFKS5zZXQobWltZVR5cGUudG9TdHJpbmcoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFZhbHVlfSBjb250YWluZXIgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisJICogQHJldHVybiBUaGUge0Bjb2RlIFZhbHVlfSBjb250YWluZXIgaXMgcmV0dXJuZWQuCisJICovCisJVmFsdWUgZ2V0VmFsdWUoU3RyaW5nIG5hbWUpOworCisJLyoqCisJICogUmV0dXJucyA8aT5hbGw8L2k+IHtAbGluayBWYWx1ZX0gY29udGFpbmVycyBvZiB0aGlzIGVudGl0eSBtYXBwZWQgYnkgdGhlaXIKKwkgKiBuYW1lIChubyBtYXR0ZXIgYSB2YWx1ZSBpcyB2YWxpZCBvciBub3QpLgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTWFwfSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJTWFwPFN0cmluZywgVmFsdWU+IGdldFZhbHVlcygpOworCisJLyoqCisJICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBlbnRpdHkuCisJICovCisJQE92ZXJyaWRlCisJU3RyaW5nIHRvU3RyaW5nKCk7CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBnaXZlbiBuYW1lIGVxdWFscyB0aGUgbmFtZSBvZiB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBjaGVja2VkIG5hbWUuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBuYW1lIGVxdWFscyB0aGUgbmFtZSBvZiB0aGlzIGVudGl0eS4KKwkgKi8KKwlkZWZhdWx0IGJvb2xlYW4gbmFtZUVxdWFscyhTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZ2V0TmFtZSgpLmVxdWFscyhuYW1lKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnVtUmVnaXN0cnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnVtUmVnaXN0cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWExOTdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0VudW1SZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgc2luZ2xldG9uIGNsYXNzIHJlZ2lzdGVycyBnbG9iYWxseSBhdmFpbGFibGUgZW51bWVyYXRpb25zLgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVudW1SZWdpc3RyeSB7CisKKwkvLyBzaW5nbGV0b24gaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnVtUmVnaXN0cnkgaW5zdGFuY2UgPSBuZXcgRW51bVJlZ2lzdHJ5KCk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FMQVJfVFlQRSA9ICJTY2FsYXJUeXBlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUlBPTEFUSU9OID0gIkludGVycG9sYXRpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX1JFUFJFU0VOVEFUSU9OID0gIlNlcXVlbmNlUmVwcmVzZW50YXRpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1BFQ0lGSUNBVElPTiA9ICJUeXBlU3BlY2lmaWNhdGlvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfVFlQRSA9ICJWYWx1ZVR5cGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fU1RBVEUgPSAiVmVyc2lvblN0YXRlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTX1RZUEUgPSAiQXhpc1R5cGUiOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZT4+IGVudW1lcmF0aW9uczsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLiBOb3QgY2FsbGVkIGRpcmVjdGx5LiBVc2UgZ2V0SW5zdGFuY2UoKSBpbnN0ZWFkLgorCSAqLworCXByaXZhdGUgRW51bVJlZ2lzdHJ5KCkgeworCQllbnVtZXJhdGlvbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWFkZChJTlRFUlBPTEFUSU9OLCBuZXcgRW51bWVyYXRpb248SW50ZXJwb2xhdGlvbj4oSW50ZXJwb2xhdGlvbi5jbGFzcywgSU5URVJQT0xBVElPTikpOworCQlhZGQoU0NBTEFSX1RZUEUsIG5ldyBFbnVtZXJhdGlvbjxTY2FsYXJUeXBlPihTY2FsYXJUeXBlLmNsYXNzLCBTQ0FMQVJfVFlQRSkpOworCQlhZGQoU0VRVUVOQ0VfUkVQUkVTRU5UQVRJT04sCisJCQkJbmV3IEVudW1lcmF0aW9uPFNlcXVlbmNlUmVwcmVzZW50YXRpb24+KFNlcXVlbmNlUmVwcmVzZW50YXRpb24uY2xhc3MsIFNFUVVFTkNFX1JFUFJFU0VOVEFUSU9OKSk7CisJCWFkZChUWVBFX1NQRUNJRklDQVRJT04sIG5ldyBFbnVtZXJhdGlvbjxUeXBlU3BlY2lmaWNhdGlvbj4oVHlwZVNwZWNpZmljYXRpb24uY2xhc3MsIFRZUEVfU1BFQ0lGSUNBVElPTikpOworCQlhZGQoVkFMVUVfVFlQRSwgbmV3IEVudW1lcmF0aW9uPFZhbHVlVHlwZT4oVmFsdWVUeXBlLmNsYXNzLCBWQUxVRV9UWVBFKSk7CisJCWFkZChWRVJTSU9OX1NUQVRFLCBuZXcgRW51bWVyYXRpb248VmVyc2lvblN0YXRlPihWZXJzaW9uU3RhdGUuY2xhc3MsIFZFUlNJT05fU1RBVEUpKTsKKwkJYWRkKEFYSVNfVFlQRSwgbmV3IEVudW1lcmF0aW9uPEF4aXNUeXBlPihBeGlzVHlwZS5jbGFzcywgQVhJU19UWVBFKSk7CisJfQorCisJLyoqCisJICogYWRkcyBhIG5ldyBlbnVtZXJhdGlvbiB0byB0aGUgcmVnaXN0cnkKKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlIGVudW1lcmF0aW9uIGNhbiBiZSBhY2Nlc3NlZAorCSAqIEBwYXJhbSBlbnVtZXJhdGlvbiB0aGUgZHluYW1pYyBlbnVtZXJhdGlvbiBvYmplY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIG5hbWUsIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBlbnVtZXJhdGlvbikgeworCQllbnVtZXJhdGlvbnMucHV0KG5hbWUsIGVudW1lcmF0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBlbnVtZXJhdGlvbgorCSAqIEByZXR1cm4gdGhlIGR5bmFtaWMgZW51bWVyYXRpb24gb2JqZWN0CisJICovCisJcHVibGljIEVudW1lcmF0aW9uPD8+IGdldChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZW51bWVyYXRpb25zLmdldChuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGlzIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgRW51bVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0VudW1lcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW51bWVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDUxYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0VudW1lcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgY2xhc3Mgd2hpY2ggZHluYW1pY2FsbHkgYnVuZGxlcyBlbnVtZXJhdGlvbiB2YWx1ZXMKKyAqCisgKiBAcGFyYW0gPEU+CisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbjxFIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZT4geworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBFPiB2YWx1ZXM7CisKKwlwcml2YXRlIE1hcDxFLCBTdHJpbmc+IHJldnZhbHVlczsKKworCXByaXZhdGUgTWFwPEludGVnZXIsIFN0cmluZz4gb3JkaW5hbHM7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEludGVnZXI+IHJldm9yZGluYWxzOworCisJcHJpdmF0ZSBpbnQgbWF4b3JkaW5hbDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlwcml2YXRlIENsYXNzPEU+IGVudW1jbGFzczsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLiBTdGF0aWMgZmllbGRzIGluIHRoZSBnaXZlbiBlbnVtY2xhc3Mgb2YgdGhlIHNhbWUgdHlwZSBhcmUgYWRkZWQKKwkgKiBhdXRvbWF0aWNhbGx5IGFzIGVudW0gdmFsdWVzLiBUaGlzIHdheSB5b3UgY2FuIHNpbXBseSBwcmVmaWxsIHRoZSBvYmplY3Qgd2l0aAorCSAqIHN0YXRpYyB2YWx1ZXMuCisJICogCisJICogQHBhcmFtIGVudW1jbGFzcyB0aGUgY2xhc3Mgb2YgdGhlIGVudW1lcmF0aW9uIHZhbHVlcworCSAqIEBwYXJhbSBuYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0aW9uIGJ1bmRsZQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBFbnVtZXJhdGlvbihDbGFzczxFPiBlbnVtY2xhc3MsIFN0cmluZyBuYW1lKSB7CisJCXRoaXMubWF4b3JkaW5hbCA9IDA7CisJCXRoaXMudmFsdWVzID0gbmV3IEhhc2hNYXA8PigpOworCQl0aGlzLnJldnZhbHVlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJdGhpcy5vcmRpbmFscyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJdGhpcy5yZXZvcmRpbmFscyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5lbnVtY2xhc3MgPSBlbnVtY2xhc3M7CisJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkW10gZmllbGRzID0gZW51bWNsYXNzLmdldEZpZWxkcygpOworCQlmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisJCQlpZiAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKSAvLyBvbmx5CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZXhhbWluZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHN0YXRpYworCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZpZWxkcworCQkJeworCQkJCU9iamVjdCBmaWVsZE9iamVjdDsKKwkJCQl0cnkgeworCQkJCQlmaWVsZE9iamVjdCA9IGZpZWxkLmdldChudWxsKTsKKwkJCQkJaWYgKCEoZW51bWNsYXNzLmlzSW5zdGFuY2UoZmllbGRPYmplY3QpKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKwkJCQl9CisJCQkJU3RyaW5nIGZuYW1lID0gKChFbnVtZXJhdGlvblZhbHVlKSBmaWVsZE9iamVjdCkubmFtZSgpOworCQkJCWlmIChmbmFtZSA9PSBudWxsKSB7CisJCQkJCWZuYW1lID0gZmllbGQuZ2V0TmFtZSgpOworCQkJCQkoKEVudW1lcmF0aW9uVmFsdWUpIGZpZWxkT2JqZWN0KS5zZXROYW1lKGZuYW1lKTsKKwkJCQl9CisJCQkJYWRkVmFsdWUoKEUpIGZpZWxkT2JqZWN0KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIGFkZHMgYSB2YWx1ZSB0byB0aGUgZHluYW1pYyBlbnVtZXJhdGlvbgorCSAqIAorCSAqIEBwYXJhbSBlbnVtZXJhdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFZhbHVlKEUgZW51bWVyYXRpb24pIHsKKwkJZW51bWVyYXRpb24uc2V0T3duZXIodGhpcyk7CisJCVN0cmluZyBlbnVtZXJhdGlvbk5hbWUgPSBlbnVtZXJhdGlvbi5uYW1lKCk7CisJCUludGVnZXIgb3JkaW5hbCA9IGVudW1lcmF0aW9uLm9yZGluYWwoKTsKKwkJaWYgKG9yZGluYWwgPT0gbnVsbCkgeworCQkJb3JkaW5hbCA9ICsrbWF4b3JkaW5hbDsKKwkJCWVudW1lcmF0aW9uLnNldE9yZGluYWwob3JkaW5hbCk7CisJCX0gZWxzZSB7CisJCQltYXhvcmRpbmFsID0gTWF0aC5tYXgob3JkaW5hbCwgbWF4b3JkaW5hbCk7CisJCX0KKwkJdmFsdWVzLnB1dChlbnVtZXJhdGlvbk5hbWUsIGVudW1lcmF0aW9uKTsKKwkJcmV2dmFsdWVzLnB1dChlbnVtZXJhdGlvbiwgZW51bWVyYXRpb25OYW1lKTsKKwkJb3JkaW5hbHMucHV0KG9yZGluYWwsIGVudW1lcmF0aW9uTmFtZSk7CisJCXJldm9yZGluYWxzLnB1dChlbnVtZXJhdGlvbk5hbWUsIG9yZGluYWwpOworCX0KKworCS8qKgorCSAqIHJldHVybnMgdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBuYW1lCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEUgdmFsdWVPZihTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gdmFsdWVzLmdldChuYW1lKTsKKwl9CisKKwkvKioKKwkgKiByZXR1cm5zIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gbnVtYmVyCisJICogCisJICogQHBhcmFtIG9yZGluYWwKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEUgdmFsdWVPZihpbnQgb3JkaW5hbCkgeworCQlyZXR1cm4gdmFsdWVzLmdldChvcmRpbmFscy5nZXQob3JkaW5hbCkpOworCX0KKworCS8qKgorCSAqIHJldHVybnMgdGhlIG9yZGluYWwgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGVudW1lcmF0aW9uIHZhbHVlCisJICogCisJICogQHBhcmFtIGVudW12YWwKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIGludCBvcmRpbmFsKEVudW1lcmF0aW9uVmFsdWUgZW51bXZhbCkgeworCQlyZXR1cm4gcmV2b3JkaW5hbHMuZ2V0KHJldnZhbHVlcy5nZXQoZW51bXZhbCkpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBkeW5hbWljCisJICogICAgICAgICBlbnVtZXJhdGlvbgorCSAqLworCXB1YmxpYyBDbGFzczxFPiBnZXRFbnVtQ2xhc3MoKSB7CisJCXJldHVybiBlbnVtY2xhc3M7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZHluYW1pYyBlbnVtZXJhdGlvbiBjb2xsZWN0aW9uCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnVtZXJhdGlvblZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW51bWVyYXRpb25WYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNTQ5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW51bWVyYXRpb25WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogVGhpcyBjbGFzcyBlbXVsYXRlcyB0aGUgYmVoYXZpb3VyIG9mIGEgamF2YSBlbnVtLiBUaGUgcmVhc29uIGZvciBpdHMKKyAqIGV4aXN0ZW5jZSBpcyB0aGF0IGNsYXNzaWMgZW51bXMgY2FuJ3QgYmUgZXh0ZW5kZWQgYnkgbmV3IHZhbHVlcy4gVGhpcyBjbGFzcworICogb24gdGhlIG90aGVyIGhhbmQgY2FuIGJlIGV4dGVuZGVkIGJ5IGphdmEncyBpbmhlcml0YW5jZSBtZWNoYW5pc20uCisgKiAKKyAqIEZvciBhIGJhc2ljIGVtdWxhdGlvbiBvZiBqYXZhIGVudW1zLCBqdXN0IGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBhZGQgc3RhdGljCisgKiBmaWVsZHMgd2hvc2UgdHlwZSBpcyBvZiB0aGUgZGVyaXZhdGl2ZSBjbGFzcy4KKyAqIAorICogVG8gYmUgYWJsZSB0byBhZGQgZHluYW1pY2FsbHkgZW51bSB2YWx1ZXMgYW5kIGZvciBmdWxsIGluaXRpYWxpemF0aW9uLCB5b3UKKyAqIHNob3VsZCBzZXQgYW4gb3duZXIgZW51bWVyYXRpb24gKGVpdGhlciBieSBjaG9vc2luZyB0aGUgcmlnaHQgY29uc3RydWN0b3Igb3IKKyAqIGJ5IGNhbGxpbmcgdGhlIHNldE93bmVyIG1ldGhvZCkKKyAqIAorICogQGF1dGhvciBGbG9yaWFuIFNjaG1pdHQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtZXJhdGlvblZhbHVlIHsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBJbnRlZ2VyIG9yZGluYWw7CisKKwlwcml2YXRlIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBvd25lcjsKKworCS8qKgorCSAqIGV4cGxpY2l0bHkgc2V0IHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG5hbWUpOworCX0KKworCS8qKgorCSAqIGV4cGxpY2l0bHkgc2V0IHRoZSBvcmRpbmFsIG9mIHRoaXMgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRPcmRpbmFsKGludCBvcmRpbmFsKSB7CisJCXRoaXMub3JkaW5hbCA9IG9yZGluYWw7CisJfQorCisJLyoqCisJICogCisJICogc2V0IHRoZSBvd25lciBkeW5hbWljIGVudW1lcmF0aW9uIG9mIHRoaXMgb2JqZWN0LgorCSAqIAorCSAqIEBwYXJhbSBlcgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldE93bmVyKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBlcikgeworCQlvd25lciA9IGVyOworCX0KKworCS8qKgorCSAqIGdldCB0aGUgb3duZXIgZHluYW1pYyBlbnVtZXJhdGlvbiBvZiB0aGlzIG9iamVjdAorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRW51bWVyYXRpb248PyBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IGdldE93bmVyKCkgeworCQlyZXR1cm4gb3duZXI7CisJfQorCisJLyoqCisJICogVGhpcyBDb25zdHJ1Y3RvciBpcyBwcm90ZWN0ZWQgdG8gYXZvaWQgYWNjaWRlbnRhbCBtaXN1c2UuCisJICogCisJICogYmUgc3VyZSB0byBpbml0aWFsaXplIHRoZSBlbnVtZXJhdGlvbiBmdWxseSwgYnkgZWl0aGVyIGFkZGluZyBpdCBhcyBhIHN0YXRpYworCSAqIGZpZWxkIGluIGFuIGV4dGVuZGluZyBjbGFzcywgb3Igc2V0dGluZyB0aGUgb3JkaW5hbCBieSBoYW5kLiBZb3UnbGwgYWxzbyBoYXZlCisJICogdG8gYWRkIHRoZSByZXN1bHRpbmcgb2JqZWN0IHRvIGEgRHluYW1pY0VudW1lcmF0aW9uIGZvciBpdCB0byBiZSBjb21wbGV0ZWx5CisJICogdXNhYmxlLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHJvdGVjdGVkIEVudW1lcmF0aW9uVmFsdWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcyhuYW1lLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIENvbnN0cnVjdG9yIGlzIHByb3RlY3RlZCB0byBhdm9pZCBhY2NpZGVudGFsIG1pc3VzZS4KKwkgKiAKKwkgKiBZb3UnbGwgaGF2ZSB0byBhZGQgdGhlIHJlc3VsdGluZyBvYmplY3QgdG8gYSBFbnVtZXJhdGlvbiBmb3IgaXQgdG8gYmUKKwkgKiBjb21wbGV0ZWx5IHVzYWJsZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqLworCXByb3RlY3RlZCBFbnVtZXJhdGlvblZhbHVlKFN0cmluZyBuYW1lLCBJbnRlZ2VyIG9yZGluYWwpIHsKKwkJdGhpcy5uYW1lID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChuYW1lLCAiTmFtZSBvZiBhbiBFbnVtZXJhdGlvblZhbHVlIGNhbiBuZXZlciBiZSBudWxsISIpOworCQl0aGlzLm9yZGluYWwgPSBvcmRpbmFsOworCQl0aGlzLm93bmVyID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgZW51bWVyYXRpb24gdmFsdWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBuYW1lCisJICovCisJcHVibGljIEVudW1lcmF0aW9uVmFsdWUgdmFsdWVPZihTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gb3duZXIudmFsdWVPZihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBvcmRpbmFsIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoaXMgZW51bWVyYXRpb24gdmFsdWUKKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBvcmRpbmFsKCkgeworCQlyZXR1cm4gb3JkaW5hbDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBuYW1lKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnZpcm9ubWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzMwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW52aXJvbm1lbnQuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGVudmlyb25tZW50IGVudGl0eSB0eXBlLiBUaGUge0BsaW5rIEVudmlyb25tZW50fSBpcyBhCisgKiBzaW5nbGV0b24gd2l0aGluIGEgY29ubmVjdGVkIGRhdGEgc291cmNlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgRW52aXJvbm1lbnQgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGF0YWJsZSwgRGVzY3JpYmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnTWF4VGVzdExldmVsJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01BWF9URVNUX0xFVkVMID0gIk1heF90ZXN0X2xldmVsIjsKKworCS8qKgorCSAqIFRoZSAnQmFzZU1vZGVsVmVyc2lvbicgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQVNFX01PREVMX1ZFUlNJT04gPSAiQmFzZV9tb2RlbF92ZXJzaW9uIjsKKworCS8qKgorCSAqIFRoZSAnQXBwTW9kZWxWZXJzaW9uJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FQUF9NT0RFTF9WRVJTSU9OID0gIkFwcE1vZGVsVmVyc2lvbiI7CisKKwkvKioKKwkgKiBUaGUgJ0FwcE1vZGVsVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUFBfTU9ERUxfVFlQRSA9ICJBcHBNb2RlbFR5cGUiOworCisJLyoqCisJICogVGhlICdUaW1lem9uZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9USU1FWk9ORSA9ICJUaW1lem9uZSI7CisKKwkvKioKKwkgKiBUaGUgJ01lYW5pbmdPZkFsaWFzZXMnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVBTklOR19PRl9BTElBU0VTID0gIk1lYW5pbmdPZkFsaWFzZXMiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlFbnZpcm9ubWVudChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWF4IHRlc3QgbGV2ZWwgb2YgdGhpcyBlbnZpcm9ubWVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1heCB0ZXN0IGxldmVsIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldE1heFRlc3RMZXZlbCgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUFYX1RFU1RfTEVWRUwpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBiYXNlIG1vZGVsIHZlcnNpb24gb2YgdGhpcyBlbnZpcm9ubWVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGJhc2UgbW9kZWwgdmVyc2lvbiBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEJhc2VNb2RlbFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0JBU0VfTU9ERUxfVkVSU0lPTikuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIG1vZGVsIHZlcnNpb24gb2YgdGhpcyBlbnZpcm9ubWVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFwcGxpY2F0aW9uIG1vZGVsIHZlcnNpb24gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRBcHBNb2RlbFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0FQUF9NT0RFTF9WRVJTSU9OKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gbW9kZWwgdHlwZSBvZiB0aGlzIGVudmlyb25tZW50LgorCSAqCisJICogQHJldHVybiBUaGUgYXBwbGljYXRpb24gbW9kZWwgdHlwZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFwcE1vZGVsVHlwZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfQVBQX01PREVMX1RZUEUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0aW1lIHpvbmUgb2YgdGhpcyBlbnZpcm9ubWVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHRpbWUgem9uZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRpbWV6b25lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9USU1FWk9ORSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIE1lYW5pbmcgb2YgYWxpYXNlcyBvZiB0aGlzIGVudmlyb25tZW50LgorCSAqCisJICogQHJldHVybiBUaGUgbWVhbmluZyBvZiBhbGlhc2VzIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0TWVhbmluZ09mQWxpYXNlcygpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUVBTklOR19PRl9BTElBU0VTKS5leHRyYWN0KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRmlsZUxpbmsuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9GaWxlTGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZDBlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRmlsZUxpbmsuamF2YQpAQCAtMCwwICsxLDQ5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBtYW5hZ2UgbGlua3MgdG8gZXh0ZXJuYWxseSBzdG9yZWQgZmlsZXMgKGxvY2FsL3JlbW90ZSkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGaWxlTGluayB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBTdGF0ZSBzdGF0ZTsKKworCXByaXZhdGUgU3RyaW5nIHJlbW90ZVBhdGg7CisJcHJpdmF0ZSBNaW1lVHlwZSBtaW1lVHlwZTsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCXByaXZhdGUgUGF0aCBsb2NhbFBhdGg7CisKKwlwcml2YXRlIGxvbmcgc2l6ZSA9IC0xOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGZpbGVMaW5rIFdpbGwgYmUgY29waWVkLgorCSAqLworCUZpbGVMaW5rKEZpbGVMaW5rIGZpbGVMaW5rKSB7CisJCXJlbW90ZVBhdGggPSBmaWxlTGluay5yZW1vdGVQYXRoOworCQltaW1lVHlwZSA9IGZpbGVMaW5rLm1pbWVUeXBlOworCQlkZXNjcmlwdGlvbiA9IGZpbGVMaW5rLmRlc2NyaXB0aW9uOworCQlsb2NhbFBhdGggPSBmaWxlTGluay5sb2NhbFBhdGg7CisJCXNpemUgPSBmaWxlTGluay5zaXplOworCQlzdGF0ZSA9IGZpbGVMaW5rLnN0YXRlOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHJlbW90ZVBhdGggVGhlIHJlbW90ZSBwYXRoLgorCSAqIEBwYXJhbSBtaW1lVHlwZSAgIFRoZSBNSU1FIHR5cGUgb2YgdGhlIGxpbmtlZCBmaWxlLgorCSAqLworCXByaXZhdGUgRmlsZUxpbmsoU3RyaW5nIHJlbW90ZVBhdGgsIE1pbWVUeXBlIG1pbWVUeXBlKSB7CisJCXRoaXMucmVtb3RlUGF0aCA9IHJlbW90ZVBhdGg7CisJCXRoaXMubWltZVR5cGUgPSBtaW1lVHlwZTsKKworCQlzdGF0ZSA9IFN0YXRlLlJFTU9URTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBsb2NhbFBhdGggVGhlIGxvY2FsIHtAbGluayBQYXRofS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIEZpbGVMaW5rKFBhdGggbG9jYWxQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0aGlzLmxvY2FsUGF0aCA9IGxvY2FsUGF0aDsKKwkJU3RyaW5nIHR5cGUgPSBGaWxlcy5wcm9iZUNvbnRlbnRUeXBlKGxvY2FsUGF0aCk7CisJCW1pbWVUeXBlID0gbmV3IE1pbWVUeXBlKHR5cGUgPT0gbnVsbCA/ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iIDogdHlwZSk7CisJCXNpemUgPSBGaWxlcy5zaXplKGxvY2FsUGF0aCk7CisJCVBhdGggZmlsZU5hbWVQYXRoID0gbG9jYWxQYXRoLmdldEZpbGVOYW1lKCk7CisJCWlmIChmaWxlTmFtZVBhdGggIT0gbnVsbCkgeworCQkJZGVzY3JpcHRpb24gPSBmaWxlTmFtZVBhdGgudG9TdHJpbmcoKTsKKwkJfQorCisJCXN0YXRlID0gU3RhdGUuTE9DQUw7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRmlsZUxpbmt9IGluc3RhbmNlIHdoaWNoIHJlbW90ZWx5IGF2YWlsYWJsZS4KKwkgKgorCSAqIEBwYXJhbSByZW1vdGVQYXRoICBUaGUgcmVtb3RlIHBhdGguCisJICogQHBhcmFtIG1pbWVUeXBlICAgIFRoZSBNSU1FIHR5cGUuCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBmaWxlLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIEZpbGVMaW5rfSBpbnN0YW5jZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEZpbGVMaW5rIG5ld1JlbW90ZShTdHJpbmcgcmVtb3RlUGF0aCwgTWltZVR5cGUgbWltZVR5cGUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlGaWxlTGluayBmaWxlTGluayA9IG5ldyBGaWxlTGluayhyZW1vdGVQYXRoLCBtaW1lVHlwZSk7CisJCWZpbGVMaW5rLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwkJcmV0dXJuIGZpbGVMaW5rOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEZpbGVMaW5rfSBpbnN0YW5jZSB3aGljaCBsb2NhbGx5IGF2YWlsYWJsZS4KKwkgKgorCSAqIEBwYXJhbSBsb2NhbFBhdGggVGhlIGxvY2FsIHtAbGluayBQYXRofSB0byB0aGUgZmlsZS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBGaWxlTGlua30gaW5zdGFuY2UgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGFjY2VzcyBmaWxlIHdpdGggZ2l2ZW4ge0Bjb2RlCisJICogCQlQYXRofSAgICAgICAuCisJICovCisJcHVibGljIHN0YXRpYyBGaWxlTGluayBuZXdMb2NhbChQYXRoIGxvY2FsUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKEZpbGVzLmlzRGlyZWN0b3J5KGxvY2FsUGF0aCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxvY2FsIHBhdGggaXMgYSBkaXJlY3RvcnkuIik7CisJCX0gZWxzZSBpZiAoIUZpbGVzLmV4aXN0cyhsb2NhbFBhdGgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMb2NhbCBwYXRoIGRvZXMgbm90IGV4aXN0LiIpOworCQl9IGVsc2UgaWYgKCFGaWxlcy5pc1JlYWRhYmxlKGxvY2FsUGF0aCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxvY2FsIHBhdGggaXMgbm90IHJlYWRhYmxlLiIpOworCQl9CisKKwkJcmV0dXJuIG5ldyBGaWxlTGluayhsb2NhbFBhdGgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGxpbmtlZCBmaWxlLgorCSAqCisJICogQHJldHVybiBOYW1lIG9mIHRoZSBmaWxlIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIGZpbGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworCQlQYXRoIGZpbGVOYW1lUGF0aCA9IG51bGw7CisJCWlmIChpc0xvY2FsKCkpIHsKKwkJCWZpbGVOYW1lUGF0aCA9IGdldExvY2FsUGF0aCgpLmdldEZpbGVOYW1lKCk7CisJCX0gZWxzZSBpZiAoaXNSZW1vdGUoKSkgeworCQkJdHJ5IHsKKwkJCQkvLyBvbiBXaW5kb3dzLCBQYXRocy5nZXQoKSBjYW5ub3QgaGFuZGxlIGZpbGUgdXJscyBpbiB0aGUgZm9ybQorCQkJCS8vIGZpbGU6Ly9SRU1PVEVfSE9TVC9wYXRoL2ZpbGVuYW1lCisJCQkJU3RyaW5nIGZpeGVkUGF0aCA9IHJlbW90ZVBhdGgucmVwbGFjZUZpcnN0KCJmaWxlOiIsICIiKTsKKwkJCQlmaWxlTmFtZVBhdGggPSBQYXRocy5nZXQoVVJMRGVjb2Rlci5kZWNvZGUoZml4ZWRQYXRoLCBTdGFuZGFyZENoYXJzZXRzLlVURl84Lm5hbWUoKSkpLmdldEZpbGVOYW1lKCk7CisJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVjb2RlIHJlbW90ZSBwYXRoIGR1ZSB0bzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCX0KKwkJfQorCisJCWlmIChmaWxlTmFtZVBhdGggPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmlsZSBuYW1lIGlzIHVua25vd24uIik7CisJCX0KKworCQlyZXR1cm4gZmlsZU5hbWVQYXRoLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBsaW5rZWQgZmlsZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIE1JTUUgdHlwZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgTWltZVR5cGUgZ2V0TWltZVR5cGUoKSB7CisJCXJldHVybiBtaW1lVHlwZTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBhIGxvY2FsIHtAbGluayBQYXRofSBpcyBhdmFpbGFibGUgZm9yIHRoZSBsaW5rZWQgZmlsZS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgYSBsb2NhbCB7QGNvZGUgUGF0aH0gaXMgYXZhaWxhYmxlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTG9jYWwoKSB7CisJCXJldHVybiBsb2NhbFBhdGggIT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsb2NhbCB7QGxpbmsgUGF0aH0gdG8gdGhlIGxpbmtlZCBmaWxlLiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzCisJICogb25seSBhbGxvd2VkIGlmIGNhbGxpbmcge0BsaW5rICNpc0xvY2FsKCl9IHJldHVybnMge0Bjb2RlCisJICogdHJ1ZX0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBsb2NhbCB7QGNvZGUgUGF0aH0gdG8gdGhlIGxpbmtlZCBmaWxlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBQYXRoIGdldExvY2FsUGF0aCgpIHsKKwkJaWYgKGlzTG9jYWwoKSkgeworCQkJcmV0dXJuIGxvY2FsUGF0aDsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkxvY2FsIHBhdGggaXMgbm90IGF2YWlsYWJsZS4iKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQVBJIHByb3ZpZGVycyB0byBzZXQgdGhlIGxvY2FsIHtAbGluayBQYXRofSBvbmNlIHRoZQorCSAqIHJlbW90ZSBmaWxlIHdhcyBkb3dubG9hZGVkLgorCSAqCisJICogQHBhcmFtIGxvY2FsUGF0aCBUaGUgbG9jYWwge0Bjb2RlIFBhdGh9IG9mIHRoZSBkb3dubG9hZGVkIGZpbGUuCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIGlmIHRoaXMgZmlsZSBsaW5rIGlzICdMT0NBTCcuCisJICovCisJcHVibGljIHZvaWQgc2V0TG9jYWxQYXRoKFBhdGggbG9jYWxQYXRoKSB7CisJCWlmIChTdGF0ZS5MT0NBTCA9PSBzdGF0ZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXQgaXMgbm90IGFsbG93ZWQgdG8gcmVwbGFjZSBhbiBleGlzdGluZyBsb2NhbCBwYXRoLiIpOworCQl9CisKKwkJdGhpcy5sb2NhbFBhdGggPSBsb2NhbFBhdGg7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgYSByZW1vdGUgcGF0aCBpcyBhdmFpbGFibGUgZm9yIGZvciBsaW5rZWQgZmlsZS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgYSByZW1vdGUgcGF0aCBpcyBhdmFpbGFibGUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZW1vdGUoKSB7CisJCXJldHVybiByZW1vdGVQYXRoICE9IG51bGwgJiYgIXJlbW90ZVBhdGguaXNFbXB0eSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlbW90ZSBwYXRoIHRvIHRoZSBsaW5rZWQgZmlsZS4gQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5CisJICogYWxsb3dlZCBpZiBjYWxsaW5nIHtAbGluayAjaXNSZW1vdGUoKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZW1vdGUgcGF0aCB0byB0aGUgbGlua2VkIGZpbGUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRSZW1vdGVQYXRoKCkgeworCQlpZiAoaXNSZW1vdGUoKSkgeworCQkJcmV0dXJuIHJlbW90ZVBhdGg7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZW1vdGUgcGF0aCBpcyBub3QgYXZhaWxhYmxlLiIpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBBUEkgcHJvdmlkZXJzIHRvIHNldCB0aGUgcmVtb3RlIHBhdGggb25jZSB0aGUgbG9jYWwKKwkgKiBmaWxlIGhhcyBiZWVuIHVwbG9hZGVkLgorCSAqCisJICogQHBhcmFtIHJlbW90ZVBhdGggVGhlIHJlbW90ZSBwYXRoIG9mIHRoZSB1cGxvYWRlZCBmaWxlLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB0aGlzIGZpbGUgbGluayBpcyAnUkVNT1RFJy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZW1vdGVQYXRoKFN0cmluZyByZW1vdGVQYXRoKSB7CisJCWlmIChTdGF0ZS5SRU1PVEUgPT0gc3RhdGUpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0IGlzIG5vdCBhbGxvd2VkIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgcmVtb3RlIHBhdGguIik7CisJCX0KKwkJdGhpcy5yZW1vdGVQYXRoID0gcmVtb3RlUGF0aDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGlua2VkIGZpbGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb24gPT0gbnVsbCA/ICIiIDogZGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIGxpbmtlZCBmaWxlLgorCSAqCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBuZXcgZGVzY3JpcHRpb24uCisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsaW5rZWQgZmlsZSBvciB7QGNvZGUgLTF9IGlmIHVua25vd24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBmaWxlIHNpemUgaW4gYnl0ZXMgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKKwkJcmV0dXJuIHNpemU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIGZpbGUgc2l6ZSBvZiB0aGUgbGlua2VkIGZpbGUuCisJICoKKwkgKiBAcGFyYW0gZm9ybWF0IFVzZWQgdG8gZm9ybWF0IHRoZSBzaXplLgorCSAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBmaWxlIHNpemUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRTaXplKEZvcm1hdCBmb3JtYXQpIHsKKwkJcmV0dXJuIGZvcm1hdC5nZXRTaXplKHNpemUpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBBUEkgcHJvdmlkZXJzIHRvIHNldCB0aGUgZmlsZSBzaXplIGZvciB0aGUgbGlua2VkCisJICogZmlsZS4KKwkgKgorCSAqIEBwYXJhbSBzaXplIFRoZSBzaXplIG9mIHRoZSBmaWxlIGluIGJ5dGVzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbGVTaXplKGxvbmcgc2l6ZSkgeworCQl0aGlzLnNpemUgPSBzaXplOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlpZiAoU3RhdGUuTE9DQUwgPT0gc3RhdGUpIHsKKwkJCWlmICghaXNMb2NhbCgpKSB7CisJCQkJcmV0dXJuICIiLmhhc2hDb2RlKCk7CisJCQl9CisJCQlyZXR1cm4gZ2V0TG9jYWxQYXRoKCkuaGFzaENvZGUoKTsKKwkJfQorCQlpZiAoIWlzUmVtb3RlKCkpIHsKKwkJCXJldHVybiAiIi5oYXNoQ29kZSgpOworCQl9CisJCXJldHVybiBnZXRSZW1vdGVQYXRoKCkuaGFzaENvZGUoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZpbGVMaW5rKSB7CisJCQlGaWxlTGluayBvdGhlciA9IChGaWxlTGluaykgb2JqZWN0OworCQkJaWYgKHN0YXRlID09IG90aGVyLnN0YXRlKSB7CisJCQkJaWYgKFN0YXRlLkxPQ0FMID09IHN0YXRlKSB7CisJCQkJCWlmICghaXNMb2NhbCgpKSB7CisJCQkJCQlyZXR1cm4gIW90aGVyLmlzTG9jYWwoKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gZ2V0TG9jYWxQYXRoKCkuZXF1YWxzKG90aGVyLmdldExvY2FsUGF0aCgpKTsKKwkJCQl9CisJCQkJaWYgKCFpc1JlbW90ZSgpKSB7CisJCQkJCXJldHVybiAhb3RoZXIuaXNSZW1vdGUoKTsKKwkJCQl9CisJCQkJcmV0dXJuIGdldFJlbW90ZVBhdGgoKS5lcXVhbHMob3RoZXIuZ2V0UmVtb3RlUGF0aCgpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJGaWxlTGluayhEZXNjcmlwdGlvbiA9ICIpOworCisJCWlmICghZ2V0RGVzY3JpcHRpb24oKS5pc0VtcHR5KCkpIHsKKwkJCXNiLmFwcGVuZChnZXREZXNjcmlwdGlvbigpKTsKKwkJfQorCisJCWlmIChpc0xvY2FsKCkpIHsKKwkJCXNiLmFwcGVuZCgiLCBMb2NhbFBhdGggPSAiKS5hcHBlbmQoZ2V0TG9jYWxQYXRoKCkudG9BYnNvbHV0ZVBhdGgoKSk7CisJCX0KKworCQlpZiAoaXNSZW1vdGUoKSkgeworCQkJc2IuYXBwZW5kKCIsIFJlbW90ZVBhdGggPSAiKS5hcHBlbmQoZ2V0UmVtb3RlUGF0aCgpKTsKKwkJfQorCisJCXNiLmFwcGVuZCgiLCBTaXplID0gIik7CisJCWlmIChnZXRTaXplKCkgPiAwKSB7CisJCQlzYi5hcHBlbmQoZ2V0U2l6ZShGb3JtYXQuREVDSU1BTCkpLmFwcGVuZCgiIC8gIikuYXBwZW5kKGdldFNpemUoRm9ybWF0LkJJTkFSWSkpOworCQl9IGVsc2UgeworCQkJc2IuYXBwZW5kKCJVTktOT1dOIik7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUGFja2FnZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSBtYXkgYmUgdHJlYXRlZCBhcyBlcXVhbC4gVGhpcyBpcyB0aGUKKwkgKiBjYXNlIGlmIGVpdGhlciB0aGVpciBsb2NhbCB7QGxpbmsgUGF0aH1zIG9yIHJlbW90ZSBwYXRocyBhcmUgZXF1YWwuCisJICoKKwkgKiBAcGFyYW0gbzEgVGhlIGZpcnN0IHtAY29kZSBGaWxlTGlua30uCisJICogQHBhcmFtIG8yIFRoZSBzZWNvbmQge0Bjb2RlIEZpbGVMaW5rfS4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGVpdGhlciB0aGVpciBsb2NhbCB7QGNvZGUgUGF0aH1zIG9yIHJlbW90ZQorCSAqICAgICAgICAgcGF0aHMgYXJlIGVxdWFsLgorCSAqLworCXN0YXRpYyBib29sZWFuIGFyZUVxdWFsKEZpbGVMaW5rIG8xLCBGaWxlTGluayBvMikgeworCQlyZXR1cm4gaXNMb2NhbFBhdGhFcXVhbChvMSwgbzIpIHx8IGlzUmVtb3RlUGF0aEVxdWFsKG8xLCBvMik7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGJvdGgge0BsaW5rIEZpbGVMaW5rfXMgcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuCisJICoge0BsaW5rICNpc0xvY2FsKCl9IGlzIGNhbGxlZCBhbmQgdGhlaXIge0BsaW5rIFBhdGh9cyBhcmUgZXF1YWwuCisJICoKKwkgKiBAcGFyYW0gbzEgVGhlIGZpcnN0IHtAY29kZSBGaWxlTGlua30uCisJICogQHBhcmFtIG8yIFRoZSBzZWNvbmQge0Bjb2RlIEZpbGVMaW5rfS4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGJvdGgge0Bjb2RlIEZpbGVMaW5rfXMgaGF2ZSBhIGxvY2FsCisJICogICAgICAgICB7QGNvZGUgUGF0aH0gd2hpY2ggYXJlIGVxdWFsLgorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NhbFBhdGhFcXVhbChGaWxlTGluayBvMSwgRmlsZUxpbmsgbzIpIHsKKwkJcmV0dXJuIG8xLmlzTG9jYWwoKSAmJiBvMi5pc0xvY2FsKCkgJiYgbzEuZ2V0TG9jYWxQYXRoKCkuZXF1YWxzKG8yLmdldExvY2FsUGF0aCgpKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBib3RoIHtAbGluayBGaWxlTGlua31zIHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbgorCSAqIHtAbGluayAjaXNSZW1vdGUoKX0gaXMgY2FsbGVkIGFuZCB0aGVpciByZW1vdGUgcGF0aHMgYXJlIGVxdWFsLgorCSAqCisJICogQHBhcmFtIG8xIFRoZSBmaXJzdCB7QGNvZGUgRmlsZUxpbmt9LgorCSAqIEBwYXJhbSBvMiBUaGUgc2Vjb25kIHtAY29kZSBGaWxlTGlua30uCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBib3RoIHtAY29kZSBGaWxlTGlua31zIGhhdmUgYSByZW1vdGUgcGF0aAorCSAqICAgICAgICAgd2hpY2ggYXJlIGVxdWFsLgorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZW1vdGVQYXRoRXF1YWwoRmlsZUxpbmsgbzEsIEZpbGVMaW5rIG8yKSB7CisJCXJldHVybiBvMS5pc1JlbW90ZSgpICYmIG8yLmlzUmVtb3RlKCkgJiYgbzEuZ2V0UmVtb3RlUGF0aCgpLmVxdWFscyhvMi5nZXRSZW1vdGVQYXRoKCkpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbm5lciBjbGFzc2VzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVXNlZCB0byBmb3JtYXQgYSBudW1iZXIgb2YgYnl0ZXMgaW50byBhIGh1bWFuIHJlYWRhYmxlIHNpemUuCisJICovCisJcHVibGljIGVudW0gRm9ybWF0IHsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIEVudW0gY29uc3RhbnRzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ291bnRzIDEwMDAgYml0cyBhcyAxIGJ5dGUsIHNvIGZvcm1hdHMgMTEwNTkyIHRvICcxMTAuNiBrQicuCisJCSAqLworCQlERUNJTUFMKDEwMDAsICJrTUdUUEUiKSwKKworCQkvKioKKwkJICogQ291bnRzIDEwMjQgYml0cyBhcyAxIGJ5dGUsIHNvIGZvcm1hdHMgMTEwNTkyIHRvICcxMDguMCBLaUInLgorCQkgKi8KKwkJQklOQVJZKDEwMjQsICJLTUdUUEUiKTsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIElubmVyIGNsYXNzZXMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCXByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeENoYXJzOworCQlwcml2YXRlIGZpbmFsIGludCB1bml0OworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ29uc3RydWN0b3JzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSB1bml0ICAgICAgICBUaGUgdW5pdC4KKwkJICogQHBhcmFtIHByZWZpeENoYXJzIFRoZSBwcmVmaXggY2hhcmFjdGVycy4KKwkJICovCisJCXByaXZhdGUgRm9ybWF0KGludCB1bml0LCBTdHJpbmcgcHJlZml4Q2hhcnMpIHsKKwkJCXRoaXMucHJlZml4Q2hhcnMgPSBwcmVmaXhDaGFyczsKKwkJCXRoaXMudW5pdCA9IHVuaXQ7CisJCX0KKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIFByaXZhdGUgbWV0aG9kcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLyoqCisJCSAqIEZvcm1hdHMgZ2l2ZW4gZmlsZSBzaXplIGluIGJ5dGVzIGludG8gYSBodW1hbiByZWFkYWJsZSBvbmUuCisJCSAqCisJCSAqIEBwYXJhbSBzaXplIFRoZSBudW1iZXIgb2YgYnl0ZXMuCisJCSAqIEByZXR1cm4gRm9ybWF0dGVkIGZpbGUgc2l6ZSBpcyByZXR1cm5lZC4KKwkJICovCisJCXByaXZhdGUgU3RyaW5nIGdldFNpemUobG9uZyBzaXplKSB7CisJCQlpZiAoc2l6ZSA8IDApIHsKKwkJCQlyZXR1cm4gIlVOS05PV04iOworCQkJfSBlbHNlIGlmIChzaXplIDwgdW5pdCkgeworCQkJCXJldHVybiBzaXplICsgIiBCIjsKKwkJCX0KKworCQkJaW50IGV4cG9uZW50ID0gKGludCkgKE1hdGgubG9nKHNpemUpIC8gTWF0aC5sb2codW5pdCkpOworCQkJU3RyaW5nIHByZWZpeENoYXIgPSBwcmVmaXhDaGFycy5jaGFyQXQoZXhwb25lbnQgLSAxKSArIChERUNJTUFMID09IHRoaXMgPyAiIiA6ICJpIik7CisJCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgiJS4xZiAlc0IiLCBzaXplIC8gTWF0aC5wb3codW5pdCwgZXhwb25lbnQpLCBwcmVmaXhDaGFyKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVzZWQgdG8gcHJlc2VydmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgYSB7QGxpbmsgRmlsZUxpbmt9LgorCSAqLworCXByaXZhdGUgZW51bSBTdGF0ZSB7CisKKwkJLyoqCisJCSAqIHtAbGluayBGaWxlTGlua30gd2FzIGluaXRpYWxseSBvbmx5IHJlbW90ZWx5IGF2YWlsYWJsZS4KKwkJICovCisJCVJFTU9URSwKKworCQkvKioKKwkJICoge0BsaW5rIEZpbGVMaW5rfSB3YXMgaW5pdGlhbGx5IG9ubHkgbG9jYWxseSBhdmFpbGFibGUuCisJCSAqLworCQlMT0NBTAorCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRmlsZXNBdHRhY2hhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRmlsZXNBdHRhY2hhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkOWFmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9GaWxlc0F0dGFjaGFibGUuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIHtAbGluayBFbnRpdHl9IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgZ2V0dGVyIGFuZAorICogc2V0dGVyIG1ldGhvZHMgZm9yIHRoZSAnRmlsZUxpbmtzJyBzZXF1ZW5jZSBmaWVsZCBvZiBhbiBlbnRpdHkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIEZpbGVMaW5rCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmlsZXNBdHRhY2hhYmxlIGV4dGVuZHMgRW50aXR5IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ0ZpbGVMaW5rcycgYXR0cmlidXRlIG5hbWUuCisJICovCisJU3RyaW5nIEFUVFJfRklMRV9MSU5LUyA9ICJNRE1MaW5rcyI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIGN1cnJlbnQgc2V0IG9mIGxpbmtlZCBmaWxlcyBvZiB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gQ3VycmVudCBzZXQgb2YgbGlua2VkIGZpbGVzIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IEZpbGVMaW5rW10gZ2V0RmlsZUxpbmtzKCkgeworCQlyZXR1cm4gKChGaWxlTGlua1tdKSBnZXRWYWx1ZShBVFRSX0ZJTEVfTElOS1MpLmV4dHJhY3QoKSkuY2xvbmUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50IHNldCBvZiBsaW5rZWQgZmlsZXMgd2l0aCBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9cy4KKwkgKgorCSAqIEBwYXJhbSBmaWxlTGlua3MgVGhlIG5ldyB7QGNvZGUgRmlsZUxpbmt9cy4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgc2V0RmlsZUxpbmtzKEZpbGVMaW5rW10gZmlsZUxpbmtzKSB7CisJCWdldFZhbHVlKEFUVFJfRklMRV9MSU5LUykuc2V0KGZpbGVMaW5rcyk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9IHRvIHRoZSBjdXJyZW50IHNldCBvZiBsaW5rZWQgZmlsZXMuCisJICoKKwkgKiBAcGFyYW0gZmlsZUxpbmsgVGhlIG5ldyB7QGNvZGUgRmlsZUxpbmt9LgorCSAqLworCWRlZmF1bHQgdm9pZCBhZGRGaWxlTGluayhGaWxlTGluayBmaWxlTGluaykgeworCQlGaWxlTGlua1tdIGZpbGVMaW5rcyA9IGdldEZpbGVMaW5rcygpOworCisJCUZpbGVMaW5rW10gbmV3RmlsZUxpbmtzID0gbmV3IEZpbGVMaW5rW2ZpbGVMaW5rcy5sZW5ndGggKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShmaWxlTGlua3MsIDAsIG5ld0ZpbGVMaW5rcywgMCwgZmlsZUxpbmtzLmxlbmd0aCk7CisJCW5ld0ZpbGVMaW5rc1tmaWxlTGlua3MubGVuZ3RoXSA9IGZpbGVMaW5rOworCQlzZXRGaWxlTGlua3MobmV3RmlsZUxpbmtzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGdpdmVuIHtAbGluayBGaWxlTGlua30gZnJvbSBjdXJyZW50IHNldCBvZiBsaW5rZWQgZmlsZXMuCisJICoKKwkgKiBAcGFyYW0gZmlsZUxpbmsgVGhlIHtAY29kZSBGaWxlTGlua30gd2hpY2ggc2hhbGwgYmUgcmVtb3ZlZC4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgcmVtb3ZlRmlsZUxpbmsoRmlsZUxpbmsgZmlsZUxpbmspIHsKKwkJTGlzdDxGaWxlTGluaz4gZmlsZUxpbmtzID0gbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoZ2V0RmlsZUxpbmtzKCkpKTsKKwkJZmlsZUxpbmtzLnJlbW92ZShmaWxlTGluayk7CisJCXNldEZpbGVMaW5rcyhmaWxlTGlua3MudG9BcnJheShuZXcgRmlsZUxpbmtbZmlsZUxpbmtzLnNpemUoKV0pKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9GbG9hdENvbXBsZXguamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9GbG9hdENvbXBsZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZmMTAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Zsb2F0Q29tcGxleC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNvbXBsZXggdmFsdWUgd2l0aCByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgb2YgdHlwZQorICoge0Bjb2RlIGZsb2F0fS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZsb2F0Q29tcGxleCB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBmbG9hdCByZTsKKwlwcml2YXRlIGZpbmFsIGZsb2F0IGltOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHJlYWwgICAgICBUaGUgcmVhbCBwYXJ0LgorCSAqIEBwYXJhbSBpbWFnaW5hcnkgVGhlIGltYWdpbmFyeSBwYXJ0LgorCSAqLworCXB1YmxpYyBGbG9hdENvbXBsZXgoZmxvYXQgcmVhbCwgZmxvYXQgaW1hZ2luYXJ5KSB7CisJCXJlID0gcmVhbDsKKwkJaW0gPSBpbWFnaW5hcnk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUGFyc2VzIGdpdmVuIHtAY29kZSBTdHJpbmd9IHdoZXJlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBhcmUgc2VwYXJhdGVkIGJ5CisJICogb25lIG9yIG1vcmUgYmxhbmtzLiBGdXJ0aGVybW9yZSBib3RoIG11c3QgYmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB0aGF0IGNhbgorCSAqIGJlIHBhcnNlZCBieSBjYWxsaW5nIHtAbGluayBGbG9hdCN2YWx1ZU9mKFN0cmluZyl9LgorCSAqCisJICogQHBhcmFtIHMgVGhlIHtAY29kZSBTdHJpbmd9IHRvIGJlIHBhcnNlZC4KKwkgKiBAcmV0dXJuIFRoZSBwYXJzZWQge0BsaW5rIEZsb2F0Q29tcGxleH0gdmFsdWUgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBwYXJzZSB0aGUgY29tcGxleCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEZsb2F0Q29tcGxleCB2YWx1ZU9mKFN0cmluZyBzKSB7CisJCVN0cmluZ1tdIHZhbHVlcyA9IHMuc3BsaXQoIiArIik7CisJCWlmICh2YWx1ZXMubGVuZ3RoICE9IDIpIHsKKwkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSBjb21wbGV4IHZhbHVlLiIpOworCQl9CisKKwkJcmV0dXJuIG5ldyBGbG9hdENvbXBsZXgoRmxvYXQucGFyc2VGbG9hdCh2YWx1ZXNbMF0pLCBGbG9hdC5wYXJzZUZsb2F0KHZhbHVlc1sxXSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlYWwgcGFydCBvZiB0aGlzIGNvbXBsZXggdmFsdWUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZWFsIHBhcnQgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGZsb2F0IHJlYWwoKSB7CisJCXJldHVybiByZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGlzIGNvbXBsZXggdmFsdWUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBpbWFnaW5hcnkgcGFydCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmxvYXQgaW1hZ2luYXJ5KCkgeworCQlyZXR1cm4gaW07CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tcGxleCB2YWx1ZS4KKwkgKiBUaGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIGFyZSBzZXBhcmF0ZWQgd2l0aCBhIGJsYW5rLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wbGV4IHZhbHVlLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZChyZWFsKCkpLmFwcGVuZCgnICcpLmFwcGVuZChpbWFnaW5hcnkoKSkudG9TdHJpbmcoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9JbnRlcnBvbGF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvSW50ZXJwb2xhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZDZlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvSW50ZXJwb2xhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW50ZXJwb2xhdGlvbiBlbnVtZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIEludGVycG9sYXRpb24gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlIHsKKworCS8qKgorCSAqIE5vIGludGVycG9sYXRpb24gaXMgdXNlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVycG9sYXRpb24gTk9ORSA9IG5ldyBJbnRlcnBvbGF0aW9uKCJOT05FIiwgMCk7CisKKwkvKioKKwkgKiBJbnRlcnBvbGF0aW9uIGlzIGxpbmVhci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVycG9sYXRpb24gTElORUFSID0gbmV3IEludGVycG9sYXRpb24oIkxJTkVBUiIsIDEpOworCisJLyoqCisJICogSW50ZXJwb2xhdGlvbiBpcyBhcHBsaWNhdGlvbiBzcGVjaWZpYy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVycG9sYXRpb24gU1BFQ0lGSUMgPSBuZXcgSW50ZXJwb2xhdGlvbigiU1BFQ0lGSUMiLCAyKTsKKworCXByaXZhdGUgSW50ZXJwb2xhdGlvbihTdHJpbmcgbmFtZSwgaW50IG9yZGluYWwpIHsKKwkJc3VwZXIobmFtZSwgb3JkaW5hbCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaW50ZXJwb2xhdGlvbiBpcyB7QGxpbmsgI05PTkV9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTm9uZSgpIHsKKwkJcmV0dXJuIE5PTkUgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnRlcnBvbGF0aW9uIGlzIHtAbGluayAjTElORUFSfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xpbmVhcigpIHsKKwkJcmV0dXJuIExJTkVBUiA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGludGVycG9sYXRpb24gaXMge0BsaW5rICNTUEVDSUZJQ30uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpYygpIHsKKwkJcmV0dXJuIFNQRUNJRklDID09IHRoaXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTWVhc3VyZWRWYWx1ZXMuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9NZWFzdXJlZFZhbHVlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzZkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTWVhc3VyZWRWYWx1ZXMuamF2YQpAQCAtMCwwICsxLDI3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbS5yYW5nZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlLnJlYWRBdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBDbGFzcyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgbWVhc3VyZWQgdmFsdWVzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVhc3VyZWRWYWx1ZXMgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgU2NhbGFyVHlwZSBzY2FsYXJUeXBlOworCXByaXZhdGUgZmluYWwgT2JqZWN0IHZhbHVlczsKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW5bXSBmbGFnczsKKworCS8qCisJICogVE9ETzogLSByZXBsYWNlIG5hbWUgYW5kIHVuaXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBDaGFubmVsICYgVW5pdCBlbnRpdGllcworCSAqIC0gcHJvdmlkZSBmdXJ0aGVyIGluZm9ybWF0aW9uIGlmIHJlcXVpcmVkIC0gcHJvdmlkZSBhbiBvdmVyYWxsIG9mZnNldCBmb3IKKwkgKiB0aGlzIHZhbHVlIHNlcXVlbmNlCisJICovCisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCXByaXZhdGUgZmluYWwgU3RyaW5nIHVuaXQ7CisKKwlwcml2YXRlIGZpbmFsIGludCBsZW5ndGg7CisKKwlwcml2YXRlIGZpbmFsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwlwcml2YXRlIGZpbmFsIGRvdWJsZVtdIGdlbmVyYXRpb25QYXJhbWV0ZXJzOworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpbmRlcGVuZGVudDsKKwlwcml2YXRlIGZpbmFsIEF4aXNUeXBlIGF4aXNUeXBlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHNjYWxhclR5cGUgICAgICAgICAgICAgVGhlIHtAbGluayBTY2FsYXJUeXBlfSBvZiB0aGlzIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIENoYW5uZWx9LgorCSAqIEBwYXJhbSB1bml0ICAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIHVuaXQgdGhlIGNvbnRhaW5lZCB2YWx1ZXMgYXJlIG9mLgorCSAqIEBwYXJhbSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uIFRoZSB7QGxpbmsgU2VxdWVuY2VSZXByZXNlbnRhdGlvbn0gb2YgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEBwYXJhbSBnZW5lcmF0aW9uUGFyYW1ldGVycyAgIFRoZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBtZWFzdXJlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy4KKwkgKiBAcGFyYW0gaW5kZXBlbmRlbnQgICAgICAgICAgICBUaGUgaW5kZXBlbmRlbnQgZmxhZyBvZiB0aGUgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEBwYXJhbSBheGlzVHlwZSAgICAgICAgICAgICAgIFRoZSB7QGxpbmsgQXhpc1R5cGV9IG9mIHRoZSBtZWFzdXJlZCB2YWx1ZXMuCisJICogQHBhcmFtIHZhbHVlcyAgICAgICAgICAgICAgICAgVGhlIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAcGFyYW0gZmxhZ3MgICAgICAgICAgICAgICAgICBUaGUgdmFsaWRpdHkgZmxhZ3Mgb2YgdGhlIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgdmFsdWVzIG9yIGZsYWdzIGlzIG51bGwgb3IgbGVuZ3RoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdmFsdWVzIGFuZCBmbGFncyBpcyBub3QgZXF1YWwuCisJICovCisJTWVhc3VyZWRWYWx1ZXMoU2NhbGFyVHlwZSBzY2FsYXJUeXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVuaXQsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gc2VxdWVuY2VSZXByZXNlbnRhdGlvbiwKKwkJCWRvdWJsZVtdIGdlbmVyYXRpb25QYXJhbWV0ZXJzLCBib29sZWFuIGluZGVwZW5kZW50LCBBeGlzVHlwZSBheGlzVHlwZSwgT2JqZWN0IHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMudW5pdCA9ICh1bml0ID09IG51bGwgPyAiIiA6IHVuaXQpOworCQl0aGlzLnNjYWxhclR5cGUgPSBzY2FsYXJUeXBlOworCQl0aGlzLnNlcXVlbmNlUmVwcmVzZW50YXRpb24gPSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworCQl0aGlzLmdlbmVyYXRpb25QYXJhbWV0ZXJzID0gZ2VuZXJhdGlvblBhcmFtZXRlcnM7CisJCXRoaXMuaW5kZXBlbmRlbnQgPSBpbmRlcGVuZGVudDsKKwkJdGhpcy5heGlzVHlwZSA9IGF4aXNUeXBlOworCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsKKworCQlpZiAodmFsdWVzID09IG51bGwgfHwgZmxhZ3MgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciB2YWx1ZXMgbm9yIGZsYWdzIGlzIGFsbG93ZWQgdG8gYmUgbnVsbC4iKTsKKwkJfSBlbHNlIGlmIChBcnJheS5nZXRMZW5ndGgodmFsdWVzKSAhPSBmbGFncy5sZW5ndGgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxlbmd0aCBvZiB2YWx1ZXMgYW5kIGZsYWdzIGlzIG5vdCBlcXVhbC4iKTsKKwkJfQorCisJCXRoaXMuZmxhZ3MgPSBBcnJheXMuY29weU9mKGZsYWdzLCBmbGFncy5sZW5ndGgpOworCQlsZW5ndGggPSBmbGFncy5sZW5ndGg7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIG1lYXN1cmVkIHZhbHVlcyBzZXF1ZW5jZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB1bml0IG5hbWUgZm9yIHRoaXMgbWVhc3VyZWQgdmFsdWVzIHNlcXVlbmNlLgorCSAqCisJICogQHJldHVybiBUaGUgdW5pdCBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdCgpIHsKKwkJcmV0dXJuIHVuaXQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFNjYWxhclR5cGV9IG9mIHRoaXMgbWVhc3VyZWQgdmFsdWVzIHNlcXVlbmNlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFNjYWxhclR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTY2FsYXJUeXBlIGdldFNjYWxhclR5cGUoKSB7CisJCXJldHVybiBzY2FsYXJUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWx1ZXMgb2YgdGhpcyBtZWFzdXJlZCB2YWx1ZXMgc2VxdWVuY2UuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdmFsdWVzIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gbGVuZ3RoOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSBvZiB0aGlzIG1lYXN1cmVkIHZhbHVlcyBzZXF1ZW5jZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBnZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCkgeworCQlyZXR1cm4gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgbWVhc3VyZWQgdmFsdWVzIHNlcXVlbmNlLgorCSAqCisJICogQHJldHVybiBUaGUgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gZ2V0R2VuZXJhdGlvblBhcmFtZXRlcnMoKSB7CisJCXJldHVybiBnZW5lcmF0aW9uUGFyYW1ldGVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbmRlcGVuZGVudCBmbGFnIG9mIHRoaXMgbWVhc3VyZWQgdmFsdWVzIHNlcXVlbmNlLgorCSAqCisJICogQHJldHVybiBUaGUgaW5kZXBlbmRlbnQgZmxhZyBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0luZGVwZW5kZW50KCkgeworCQlyZXR1cm4gaW5kZXBlbmRlbnQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEF4aXNUeXBlfSBvZiB0aGlzIG1lYXN1cmVkIHZhbHVlcyBzZXF1ZW5jZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBBeGlzVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEF4aXNUeXBlIGdldEF4aXNUeXBlKCkgeworCQlyZXR1cm4gYXhpc1R5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHR5cGVkIHtAbGluayBWYWx1ZUl0ZXJhdG9yfS4gSXRzIHVzYWdlIGlzIGRlc2NyaWJlZCBiZWxvdzoKKwkgKgorCSAqIDxwcmU+CisJICogLy8gYXNzdW1lIHRoZSBtZWFzdXJlZFZhbHVlcygpLmdldFNjYWxhclR5cGUoKSA9PSBTY2FsYXJUeXBlLkJZVEUKKwkgKiBWYWx1ZUl0ZXJhdG9yJmx0O0J5dGUmZ3Q7IHZhbHVlSXRlcmF0b3IgPSBtZWFzdXJlZFZhbHVlcygpLml0ZXJhdG9yKCk7CisJICogd2hpbGUgKHZhbHVlSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJICogCWJvb2xlYW4gaXNDdXJyZW50VmFsaWQgPSB2YWx1ZUl0ZXJhdG9yLmlzVmFsaWQoKTsKKwkgKiAJQnl0ZSBjdXJyZW50VmFsdWUgPSB2YWx1ZUl0ZXJhdG9yLm5leHQoKTsKKwkgKiB9CisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gPEU+IFRoaXMgdHlwZSBoYXMgdG8gYmUgZGVyaXZlZCBmcm9tIHRoZSB7QGxpbmsgU2NhbGFyVHlwZX0gb2YgdGhpcworCSAqICAgICAgICAgICAgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEByZXR1cm4gQSB0eXBlZCB7QGNvZGUgVmFsdWVJdGVyYXRvcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIDxFPiBWYWx1ZUl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgeworCQkvLyBUT0RPIHByb3ZpZGUgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBmb3IgZWFjaCB0eXBlIGFuZCB0eXBlZAorCQkvLyBuZXh0VHlwZSgpIG1ldGhvZHMKKwkJLy8gaWRlYTogZ2V0U2NhbGFyVHlwZSgpLmNyZWF0ZUl0ZXJhdG9yKHZhbHVlcywgZmxhZ3MpOyAvLyA8LSBwYWNrYWdlCisJCS8vIHByaXZhdGUKKwkJcmV0dXJuIG5ldyBWYWx1ZUl0ZXJhdG9yPEU+KCkgeworCQkJcHJpdmF0ZSBpbnQgaW5kZXggPSAwOworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisJCQkJcmV0dXJuIGluZGV4IDwgbGVuZ3RoOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CisJCQkJcmV0dXJuIGZsYWdzW2luZGV4XTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCXB1YmxpYyBFIG5leHQoKSB7CisJCQkJaWYgKGhhc05leHQoKSkgeworCQkJCQlyZXR1cm4gKEUpIEFycmF5LmdldCh2YWx1ZXMsIGluZGV4KyspOworCQkJCX0KKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiU3Vic2VxdWVudCB2YWx1ZSBpcyBub3QgYXZhaWxhYmxlLiIpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lYXN1cmVkCisJICogdmFsdWVzLiBJZiB0aGlzIHNlcXVlbmNlIGNvbnRhaW5zIG1vcmUgdGhhbiAxMCB2YWx1ZXMsIG9ubHkgdGhlIGZpcnN0IGFuZAorCSAqIGxhc3QgNSB2YWx1ZXMgYXJlIHdyaXR0ZW4uIElmIGEgdmFsdWUgaXMgbWFya2VkIGFzIG5vdCB2YWxpZCwgdGhlbiAnWFgnIGlzCisJICogd3JpdHRlbiBpbnN0ZWFkIG9mIGl0cyB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZW50aXR5LgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTWVhc3VyZWRWYWx1ZXMoQ2hhbm5lbE5hbWUgPSAiKS5hcHBlbmQoZ2V0TmFtZSgpKTsKKwkJc2IuYXBwZW5kKCIsIFNjYWxhclR5cGUgPSAiKS5hcHBlbmQoZ2V0U2NhbGFyVHlwZSgpKTsKKworCQlpZiAoIWdldFVuaXQoKS5pc0VtcHR5KCkpIHsKKwkJCXNiLmFwcGVuZCgiLCBVbml0ID0gIikuYXBwZW5kKGdldFVuaXQoKSk7CisJCX0KKworCQlzYi5hcHBlbmQoIiwgVmFsdWVzID0gWyIpOworCQlTdHJpbmcgbm90VmFsaWRNYXJrZXIgPSAiWFgiOworCQlpZiAoZ2V0TGVuZ3RoKCkgPiAxMCkgeworCQkJc2IuYXBwZW5kKHJhbmdlKDAsIDUpLm1hcFRvT2JqKGkgLT4gZmxhZ3NbaV0gPyByZWFkQXQodmFsdWVzLCBpKSA6IG5vdFZhbGlkTWFya2VyKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKwkJCXNiLmFwcGVuZCgiLCAuLi4sICIpOworCQkJc2IuYXBwZW5kKHJhbmdlKGxlbmd0aCAtIDUsIGxlbmd0aCkubWFwVG9PYmooaSAtPiBmbGFnc1tpXSA/IHJlYWRBdCh2YWx1ZXMsIGkpIDogbm90VmFsaWRNYXJrZXIpCisJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCQl9IGVsc2UgaWYgKGdldExlbmd0aCgpID4gMCkgeworCQkJc2IuYXBwZW5kKHJhbmdlKDAsIGxlbmd0aCkubWFwVG9PYmooaSAtPiBmbGFnc1tpXSA/IHJlYWRBdCh2YWx1ZXMsIGkpIDogbm90VmFsaWRNYXJrZXIpCisJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCQl9CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgiXSkiKS50b1N0cmluZygpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbm5lciBUeXBlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSBtZWFzdXJlZCB2YWx1ZXMgaXRlcmF0b3IuCisJICoKKwkgKiBAcGFyYW0gPEU+IFR5cGUgb2YgdGhlIHJldHVybmVkIHZhbHVlcy4KKwkgKiBAc2luY2UgMS4wLjAKKwkgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisJICovCisJcHVibGljIGludGVyZmFjZSBWYWx1ZUl0ZXJhdG9yPEU+IGV4dGVuZHMgSXRlcmF0b3I8RT4geworCisJCS8qKgorCQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbWFya2VkIGFzIHZhbGlkLgorCQkgKgorCQkgKiBAcmV0dXJuIFRydWUgaWYgY3VycmVudCB2YWx1ZSBpcyB2YWxpZC4KKwkJICovCisJCWJvb2xlYW4gaXNWYWxpZCgpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTWVhc3VyZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9NZWFzdXJlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzE4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTWVhc3VyZW1lbnQuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQmFzZUVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWVhc3VyZW1lbnQgZW50aXR5IHR5cGUuIFRoZSBtZWFzdXJlbWVudCBlbnRpdHkgaG9sZHMKKyAqIGRhdGEgb2YgYSBtZWFzdXJlbWVudCBvciBhbiBhbmFseXNpcy4gSXQgaXMgdGhlIGxpbmtpbmcgcG9pbnQgdG8gdGhlCisgKiBmb2xsb3dpbmcgcmVsYXRlZCBkYXRhOgorICoKKyAqIDx1bD4KKyAqIDxsaT5UbyBlbnN1cmUgYW55IHBlcnNpc3RlZCBtZWFzdXJlbWVudCBjYW4gYWx3YXlzIGJlIHJlaW50ZXJwcmV0ZWQgaXQsCisgKiBhbHdheXMgc2hvdWxkIGhhdmUgcmVsYXRpb25zIHRvIHtAbGluayBDb250ZXh0Um9vdH1zIHRoYXQgY29udGFpbiB0aGUKKyAqIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IHJ1bi4gQWxsIG1lYXN1cmVtZW50IGVudGl0aWVzIHVuZGVyIHRoZSBzYW1lIHBhcmVudAorICoge0BsaW5rIFRlc3RTdGVwfSBtdXN0IHJlZmVyZW5jZSB0aGUgc2FtZSB7QGNvZGUKKyAqIAkJQ29udGV4dFJvb3R9LjwvbGk+CisgKiA8bGk+VGhlIHJlc3VsdHMgb2YgYSB0ZXN0IHJ1biBhcmUgYWNjZXNzaWJsZSB2aWEgdGhlIGNoaWxkcmVuIG9mIHR5cGUKKyAqIHtAbGluayBDaGFubmVsR3JvdXB9IGFuZCB7QGxpbmsgQ2hhbm5lbH0uPC9saT4KKyAqIDwvdWw+CisgKgorICogVGhlIG5hbWUgb2YgYSBtZWFzdXJlbWVudCBzaG91bGQgYmUgY2hvc2VuIGluIGEgc3BlYWtpbmcgd2F5LiBJdCBoYXMgdG8gYmUKKyAqIHVuaXF1ZSB1bmRlciB0aGUgcGFyZW50IHtAY29kZSBUZXN0U3RlcH0uCisgKiA8cD4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgUGFyYW1ldGVyU2V0CisgKi8KK3B1YmxpYyBjbGFzcyBNZWFzdXJlbWVudCBleHRlbmRzIEJhc2VFbnRpdHkKKwkJaW1wbGVtZW50cyBDb250ZXh0RGVzY3JpYmFibGUsIERhdGFibGUsIERlbGV0YWJsZSwgRGVzY3JpYmFibGUsIEZpbGVzQXR0YWNoYWJsZSwgVGFnYWJsZSwgU3RhdHVzQXR0YWNoYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIHtAbGluayBUZXN0U3RlcH0gcGFyZW50IHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxUZXN0U3RlcD4gUEFSRU5UX1RZUEVfVEVTVFNURVAgPSBUZXN0U3RlcC5jbGFzczsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgQ2hhbm5lbEdyb3VwfSBjaGlsZCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Q2hhbm5lbEdyb3VwPiBDSElMRF9UWVBFX0NIQU5ORUxHUk9VUCA9IENoYW5uZWxHcm91cC5jbGFzczsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgUGFyYW1ldGVyU2V0fSBjaGlsZCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8UGFyYW1ldGVyU2V0PiBDSElMRF9UWVBFX1BBUkFNRVRFUlNFVCA9IFBhcmFtZXRlclNldC5jbGFzczsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgQ2hhbm5lbH0gY2hpbGQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPENoYW5uZWw+IENISUxEX1RZUEVfQ0hBTk5FTCA9IENoYW5uZWwuY2xhc3M7CisKKwkvKioKKwkgKiBUaGUgJ01lYXN1cmVtZW50QmVnaW4nIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVBU1VSRU1FTlRfQkVHSU4gPSAiTWVhc3VyZW1lbnRCZWdpbiI7CisKKwkvKioKKwkgKiBUaGUgJ01lYXN1cmVtZW50RW5kJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FQVNVUkVNRU5UX0VORCA9ICJNZWFzdXJlbWVudEVuZCI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCU1lYXN1cmVtZW50KENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0aW1lIHN0YW1wIG9mIHRoZSBkYXRlIHdoZW4gdGhpcyBtZWFzdXJlbWVudCB3YXMgc3RhcnRlZC4KKwkgKgorCSAqIEByZXR1cm4gTWVhc3VyZW1lbnQgZXhlY3V0aW9uIHN0YXJ0IHRpbWUgc3RhbXAgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIExvY2FsRGF0ZVRpbWUgZ2V0TWVhc3VyZW1lbnRCZWdpbigpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUVBU1VSRU1FTlRfQkVHSU4pLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB0aW1lIHN0YW1wIGZvciB0aGUgZGF0ZSB3aGVuIHRoaXMgbWVhc3VyZW1lbnQgd2FzIHN0YXJ0ZWQuCisJICoKKwkgKiBAcGFyYW0gbWVhc3VyZW1lbnRCZWdpbiBUaGUgbmV3IG1lYXN1cmVtZW50IHN0YXJ0IHRpbWUgc3RhbXAuCisJICovCisJcHVibGljIHZvaWQgc2V0TWVhc3VyZW1lbnRCZWdpbihMb2NhbERhdGVUaW1lIG1lYXN1cmVtZW50QmVnaW4pIHsKKwkJZ2V0VmFsdWUoQVRUUl9NRUFTVVJFTUVOVF9CRUdJTikuc2V0KG1lYXN1cmVtZW50QmVnaW4pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRpbWUgc3RhbXAgb2YgdGhlIGRhdGUgd2hlbiB0aGlzIG1lYXN1cmVtZW50IHdhcyBmaW5pc2hlZC4KKwkgKgorCSAqIEByZXR1cm4gTWVhc3VyZW1lbnQgZXhlY3V0aW9uIGVuZCB0aW1lIHN0YW1wIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBMb2NhbERhdGVUaW1lIGdldE1lYXN1cmVtZW50RW5kKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9NRUFTVVJFTUVOVF9FTkQpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB0aW1lIHN0YW1wIGZvciB0aGUgZGF0ZSB3aGVuIHRoaXMgbWVhc3VyZW1lbnQgd2FzIGZpbmlzaGVkLgorCSAqCisJICogQHBhcmFtIG1lYXN1cmVtZW50RW5kIFRoZSBuZXcgbWVhc3VyZW1lbnQgZXhlY3V0aW9uIGVuZCB0aW1lIHN0YW1wLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lYXN1cmVtZW50RW5kKExvY2FsRGF0ZVRpbWUgbWVhc3VyZW1lbnRFbmQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9NRUFTVVJFTUVOVF9FTkQpLnNldChtZWFzdXJlbWVudEVuZCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PENvbnRleHRUeXBlPiBsb2FkQ29udGV4dFR5cGVzKEJhc2VFbnRpdHlNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG1hbmFnZXIubG9hZENvbnRleHRUeXBlcyh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxDb250ZXh0VHlwZSwgQ29udGV4dFJvb3Q+IGxvYWRDb250ZXh0cyhCYXNlRW50aXR5TWFuYWdlciBtYW5hZ2VyLCBDb250ZXh0VHlwZS4uLiBjb250ZXh0VHlwZXMpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJTWFwPENvbnRleHRUeXBlLCBDb250ZXh0Um9vdD4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworCisJCWZvciAoQ29udGV4dFR5cGUgY29udGV4dFR5cGUgOiBjb250ZXh0VHlwZXMpIHsKKwkJCUNvbnRleHRSb290IGMgPSBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KENvbnRleHRSb290LmNsYXNzLCBjb250ZXh0VHlwZSk7CisJCQlpZiAoYyAhPSBudWxsKSB7CisJCQkJbWFwLnB1dChjb250ZXh0VHlwZSwgYyk7CisJCQl9CisJCX0KKwkJaWYgKG1hcC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBtYW5hZ2VyLmxvYWRDb250ZXh0cyh0aGlzLCBjb250ZXh0VHlwZXMpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG1hcDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL01pbWVUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTWltZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGUxZGYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL01pbWVUeXBlLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCisvKioKKyAqIENsYXNzIHByb3ZpZGVzIGVhc3kgdG8gdXNlIE1JTUUgdHlwZSBjb21wYXJpc29uIG1ldGhvZHMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIEVudGl0eQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWltZVR5cGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgU3RyaW5nIGludGVybmFsOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1pbWVUeXBlIFRoZSBNSU1FIHR5cGUgd2lsbCBiZSBjaGFuZ2VkIHRvIGxvd2VyIGNhc2UuCisJICovCisJcHVibGljIE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgeworCQlpbnRlcm5hbCA9IG1pbWVUeXBlLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwdWJsaWMgTWltZVR5cGUgYWRkU3ViVHlwZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbmV3IE1pbWVUeXBlKGludGVybmFsICsgJy4nICsgbmFtZSk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4ge0Bjb2RlIE1pbWVUeXBlfSBpcyBlaXRoZXIgdGhlIHNhbWUgYXMgb3IgYSBzdWIgdHlwZSBvZgorCSAqIHRoaXMgTUlNRSB0eXBlLiBTZWUgdGhlIGZvbGxvd2luZyBleGFtcGxlczoKKwkgKgorCSAqIDxwcmU+CisJICogTWltZVR5cGUgdHlwZSA9IG5ldyBNaW1lVHlwZSgiYXBwbGljYXRpb24veC1hc2FtLmFvbWVhc3VyZW1lbnQiKTsKKwkgKiBNaW1lVHlwZSBzdWJUeXBlID0gbmV3IE1pbWVUeXBlKCJhcHBsaWNhdGlvbi94LWFzYW0uYW9tZWFzdXJlbWVudC5zdWJ0eXBlIik7CisJICoKKwkgKiB0eXBlLmlzUGFyZW50T2Yoc3ViVHlwZSk7IC8vIHRydWUKKwkgKiBzdWJUeXBlLmlzUGFyZW50T2YodHlwZSk7IC8vIGZhbHNlCisJICogdHlwZS5pc1BhcmVudE9mKHR5cGUpOyAvLyB0cnVlCisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGNoZWNrZWQgdHlwZS4KKwkgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgdGhpcyBNSU1FIHR5cGUgYW5kIGdpdmVuIG9uZSBhcmUgdGhlIHNhbWUgb3IKKwkgKiAgICAgICAgIHRoZSBnaXZlbiBvbmUgaXMgYSBzdWIgdHlwZSBvZiB0aGlzIE1JTUUgdHlwZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1BhcmVudE9mKE1pbWVUeXBlIG1pbWVUeXBlKSB7CisJCXJldHVybiBtaW1lVHlwZSAhPSBudWxsICYmIG1pbWVUeXBlLmNvbXBhcmVTdHJpbmcoKS5zdGFydHNXaXRoKGNvbXBhcmVTdHJpbmcoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBpbnRlcm5hbC5oYXNoQ29kZSgpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHtAY29kZSBPYmplY3R9IHJlcHJlc2VudHMgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIE1JTUUKKwkgKiB0eXBlLgorCSAqCisJICogPHByZT4KKwkgKiBNaW1lVHlwZSB0eXBlID0gbmV3IE1pbWVUeXBlKCJhcHBsaWNhdGlvbi94LWFzYW0uYW9tZWFzdXJlbWVudCIpOworCSAqIE1pbWVUeXBlIGVxdWFsVHlwZSA9IG5ldyBNaW1lVHlwZSgiYXBwbGljYXRpb24veC1hc2FtLmFvbWVhc3VyZW1lbnQiKTsKKwkgKiBNaW1lVHlwZSBzdWJUeXBlID0gbmV3IE1pbWVUeXBlKCJhcHBsaWNhdGlvbi94LWFzYW0uYW9tZWFzdXJlbWVudC5zdWJ0eXBlIik7CisJICogTWltZVR5cGUgYW5vdGhlclR5cGUgPSBuZXcgTWltZVR5cGUoImFwcGxpY2F0aW9uL3gtYXNhbS5hb3VuaXQiKTsKKwkgKgorCSAqIHR5cGUuZXF1YWxzKGVxdWFsVHlwZSk7IC8vIHRydWUKKwkgKiBzdWJUeXBlLmVxdWFscyh0eXBlKTsgLy8gZmFsc2UKKwkgKiB0eXBlLmVxdWFscyhhbm90aGVyVHlwZSk7IC8vIGZhbHNlCisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gb2JqZWN0IFRoZSBjaGVja2VkIG9iamVjdC4KKwkgKiBAcmV0dXJuIFRydWUgaWYgZ2l2ZW4gb2JqZWN0IGlzIG9mIHR5cGUge0Bjb2RlIE1pbWVUeXBlfSBhbmQgcmVwcmVzZW50cworCSAqICAgICAgICAgZXhhY3RseSB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgTUlNRSB0eXBlLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNaW1lVHlwZSkgeworCQkJcmV0dXJuIGludGVybmFsLmVxdWFscygoKE1pbWVUeXBlKSBvYmplY3QpLmludGVybmFsKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBNSU1FIHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBNSU1FIHR5cGUgaXMgcmV0dXJuZWQgaW4gbG93ZXIgY2FzZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gaW50ZXJuYWw7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFkZHMgYSB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIgdG8gdGhlIGludGVybmFsbHkgc3RvcmVkIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gQSBjbG9zZWQgY29tcGFyaXNvbiBzdHJpbmcgaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgY29tcGFyZVN0cmluZygpIHsKKwkJcmV0dXJuIGludGVybmFsICsgJy4nOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1BhcmFtZXRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1BhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWYyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVyIGVudGl0eSB0eXBlLiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBob2xkIGEKKyAqIHZhbHVlIGluIGl0cyB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiwgd2hpY2ggaXMgY29udmVydGVkIHVwb24gcmVxdWVzdAorICogYW5kIHByb3ZpZGVkIGFzIGEgdmlydHVhbCB7QGxpbmsgVmFsdWV9LiBUaGUgcmV0dXJuZWQge0Bjb2RlIFZhbHVlfSBpcyBmb3IKKyAqIGRpc3BsYXlpbmcgcHVycG9zZXMgb25seS4gVG8gY2hhbmdlIHRoZSB2YWx1ZSwgaGVsZCBieSB0aGlzIHBhcmFtZXRlciwgb25lIG9mCisgKiBpdHMge0Bjb2RlIHNldFhZVmFsdWUoWFkpfSBtZXRob2RzIGhhcyB0byBiZSB1c2VkLiB7QGxpbmsgVmFsdWVUeXBlfXMKKyAqIHN1cHBvcnRlZCBieSB0aGlzIHBhcmFtZXRlciBhcmUgbGlzdGVkIGJlbG93OgorICoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI1NUUklOR308L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjREFURX08L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjQk9PTEVBTn08L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjQllURX08L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjU0hPUlR9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0lOVEVHRVJ9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0xPTkd9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0ZMT0FUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNET1VCTEV9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0ZMT0FUX0NPTVBMRVh9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRV9DT01QTEVYfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBQYXJhbWV0ZXJTZXQKKyAqIEBzZWUgI2dldFZpcnR1YWxWYWx1ZSgpCisgKiBAc2VlICNzZXRPYmplY3RWYWx1ZShPYmplY3QsIFVuaXQpCisgKiBAc2VlICNzZXRTdHJpbmdWYWx1ZShTdHJpbmcpCisgKiBAc2VlICNzZXREYXRlVmFsdWUoTG9jYWxEYXRlVGltZSkKKyAqIEBzZWUgI3NldEJvb2xlYW5WYWx1ZShCb29sZWFuKQorICogQHNlZSAjc2V0Qnl0ZVZhbHVlKEJ5dGUsIFVuaXQpCisgKiBAc2VlICNzZXRTaG9ydFZhbHVlKFNob3J0LCBVbml0KQorICogQHNlZSAjc2V0SW50ZWdlclZhbHVlKEludGVnZXIsIFVuaXQpCisgKiBAc2VlICNzZXRMb25nVmFsdWUoTG9uZywgVW5pdCkKKyAqIEBzZWUgI3NldEZsb2F0VmFsdWUoRmxvYXQsIFVuaXQpCisgKiBAc2VlICNzZXREb3VibGVWYWx1ZShEb3VibGUsIFVuaXQpCisgKiBAc2VlICNzZXRGbG9hdENvbXBsZXhWYWx1ZShGbG9hdENvbXBsZXgsIFVuaXQpCisgKiBAc2VlICNzZXREb3VibGVDb21wbGV4VmFsdWUoRG91YmxlQ29tcGxleCwgVW5pdCkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhcmFtZXRlciBleHRlbmRzIEJhc2VQYXJhbWV0ZXIgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnU2NhbGFyVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TQ0FMQVJfVFlQRSA9ICJEYXRhVHlwZSI7CisKKwkvKioKKwkgKiBUaGUgJ1ZhbHVlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFID0gIlZhbHVlIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJUGFyYW1ldGVyKENvcmUgY29yZSkgeworCQlzdXBlcihBVFRSX1NDQUxBUl9UWVBFLCBBVFRSX1ZBTFVFLCBjb3JlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9QYXJhbWV0ZXJTZXQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9QYXJhbWV0ZXJTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk0YzJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1BhcmFtZXRlclNldC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHBhcmFtZXRlciBzZXQgZW50aXR5IHR5cGUuIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCisgKiBncm91cCBhIHNldCBvZiBmdXJ0aGVyIGRlc2NyaWJpbmcgZGF0YSBzdG9yZWQgaW4ge0BsaW5rIFBhcmFtZXRlcn1zLgorICogUGFyYW1ldGVyIHNldHMgYXJlIGF0dGFjaGVkIGVpdGhlciB0byBhIHtAbGluayBNZWFzdXJlbWVudH0gb3IKKyAqIHtAbGluayBDaGFubmVsfS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlclNldCBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZWxldGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSB7QGxpbmsgTWVhc3VyZW1lbnR9IHBhcmVudCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8TWVhc3VyZW1lbnQ+IFBBUkVOVF9UWVBFX01FQVNVUkVNRU5UID0gTWVhc3VyZW1lbnQuY2xhc3M7CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIENoYW5uZWxHcm91cH0gcGFyZW50IHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxDaGFubmVsPiBQQVJFTlRfVFlQRV9DSEFOTkVMID0gQ2hhbm5lbC5jbGFzczsKKworCS8qKgorCSAqIFRoZSAnVmVyc2lvbicgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJTSU9OID0gIlZlcnNpb24iOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlQYXJhbWV0ZXJTZXQoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBQYXJhbWV0ZXJ9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgUGFyYW1ldGVyfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFBhcmFtZXRlcn0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIFBhcmFtZXRlcn1zIHJlbGF0ZWQgdG8gdGhpcyBwYXJhbWV0ZXIgc2V0LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmdldChQYXJhbWV0ZXIuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBQYXJhbWV0ZXJ9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHtAY29kZSBQYXJhbWV0ZXJ9IHRoYXQgaGF2ZSB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBQYXJhbWV0ZXJ9IHdpdGggZ2l2ZW4gbmFtZSBoYXMKKwkgKiAgICAgICAgIGJlZW4gcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKwkJT3B0aW9uYWw8UGFyYW1ldGVyPiBwYXJhbWV0ZXIgPSBnZXRQYXJhbWV0ZXIobmFtZSk7CisJCWlmIChwYXJhbWV0ZXIuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKHBhcmFtZXRlci5nZXQoKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFyYW1ldGVyIHNldC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHZlcnNpb24gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9WRVJTSU9OKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgdmVyc2lvbiBmb3IgdGhpcyBwYXJhbWV0ZXIgc2V0LgorCSAqCisJICogQHBhcmFtIHZlcnNpb24gVGhlIG5ldyB2ZXJzaW9uLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKwkJZ2V0VmFsdWUoQVRUUl9WRVJTSU9OKS5zZXQodmVyc2lvbik7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZChnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5tYXAoVmFsdWU6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCQlyZXR1cm4gc2IuYXBwZW5kKCIsIFBhcmFtZXRlcnMgPSAiKS5hcHBlbmQoZ2V0UGFyYW1ldGVycygpKS5hcHBlbmQoJyknKS50b1N0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1BoeXNpY2FsRGltZW5zaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUGh5c2ljYWxEaW1lbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM4Y2JlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1BoeXNpY2FsRGltZW5zaW9uLmphdmEKQEAgLTAsMCArMSwyMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwaHlzaWNhbCBkaW1lbnNpb24gZW50aXR5IHR5cGUuIEVhY2gge0BsaW5rIFVuaXR9IG11c3QKKyAqIGhhdmUgYSByZWxhdGlvbiB0byBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUuIFRoZSBhdHRyaWJ1dGVzIHJlcHJlc2VudCB0aGUKKyAqIGV4cG9uZW50cyBvZiB0aGUgc2V2ZW4gU0kgYmFzZSB1bml0cyBhbmQgYWRkaXRpb25hbGx5IHRoZSBhbmdsZSBleHBvbmVudCBhcworICogZGVmaW5lZCBpbiB0aGUgQVNBTSBOVkggbW9kZWwuIEEge0Bjb2RlIFVuaXR9IHdpdGggYSBjZXJ0YWluIHBoeXNpY2FsCisgKiBkaW1lbnNpb24gY2FuIGJlIGNvbnZlcnRlZCB0byBhbGwgdW5pdHMgaGF2aW5nIHRoZSBzYW1lIHJlbGF0aW9uLiBOYW1lcyBvZgorICogdGhlIHBoeXNpY2FsIGRpbWVuc2lvbnMgaGF2ZSB0byBiZSB1bmlxdWUuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBQaHlzaWNhbERpbWVuc2lvbiBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZXNjcmliYWJsZSwgRGVsZXRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ0xlbmd0aCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MRU5HVEggPSAiTGVuZ3RoIjsKKworCS8qKgorCSAqIFRoZSAnTWFzcycgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVNTID0gIk1hc3MiOworCisJLyoqCisJICogVGhlICdUaW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1RJTUUgPSAiVGltZSI7CisKKwkvKioKKwkgKiBUaGUgJ0N1cnJlbnQnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ1VSUkVOVCA9ICJDdXJyZW50IjsKKworCS8qKgorCSAqIFRoZSAnVGVtcGVyYXR1cmUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVEVNUEVSQVRVUkUgPSAiVGVtcGVyYXR1cmUiOworCisJLyoqCisJICogVGhlICdNb2xhckFtb3VudCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NT0xBUl9BTU9VTlQgPSAiTW9sYXJBbW91bnQiOworCisJLyoqCisJICogVGhlICdMdW1pbm91c0ludGVuc2l0eScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MVU1JTk9VU19JTlRFTlNJVFkgPSAiTHVtaW5vdXNJbnRlbnNpdHkiOworCisJLyoqCisJICogVGhlICdBbmdsZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTkdMRSA9ICJhbmdsZSI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVBoeXNpY2FsRGltZW5zaW9uKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsZW5ndGggZXhwb25lbnQgb2YgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBsZW5ndGggZXhwb25lbnQgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9MRU5HVEgpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBsZW5ndGggZXhwb25lbnQgZm9yIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHBhcmFtIGV4cG9uZW50IFRoZSBuZXcgbGVuZ3RoIGV4cG9uZW50LgorCSAqLworCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGV4cG9uZW50KSB7CisJCWdldFZhbHVlKEFUVFJfTEVOR1RIKS5zZXQoZXhwb25lbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1hc3MgZXhwb25lbnQgb2YgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBtYXNzIGV4cG9uZW50IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldE1hc3MoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX01BU1MpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBtYXNzIGV4cG9uZW50IGZvciB0aGlzIHBoeXNpY2FsIGRpbWVuc2lvbi4KKwkgKgorCSAqIEBwYXJhbSBleHBvbmVudCBUaGUgbmV3IG1hc3MgZXhwb25lbnQuCisJICovCisJcHVibGljIHZvaWQgc2V0TWFzcyhJbnRlZ2VyIGV4cG9uZW50KSB7CisJCWdldFZhbHVlKEFUVFJfTUFTUykuc2V0KGV4cG9uZW50KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0aW1lIGV4cG9uZW50IG9mIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHJldHVybiBUaGUgdGltZSBleHBvbmVudCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRUaW1lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9USU1FKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgdGltZSBleHBvbmVudCBmb3IgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcGFyYW0gZXhwb25lbnQgVGhlIG5ldyB0aW1lIGV4cG9uZW50LgorCSAqLworCXB1YmxpYyB2b2lkIHNldFRpbWUoSW50ZWdlciBleHBvbmVudCkgeworCQlnZXRWYWx1ZShBVFRSX1RJTUUpLnNldChleHBvbmVudCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY3VycmVudCBleHBvbmVudCBvZiB0aGlzIHBoeXNpY2FsIGRpbWVuc2lvbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZXhwb25lbnQgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEludGVnZXIgZ2V0Q3VycmVudCgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfQ1VSUkVOVCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IGN1cnJlbnQgZXhwb25lbnQgZm9yIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHBhcmFtIGV4cG9uZW50IFRoZSBuZXcgY3VycmVudCBleHBvbmVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50KEludGVnZXIgZXhwb25lbnQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9DVVJSRU5UKS5zZXQoZXhwb25lbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRlbXBlcmF0dXJlIGV4cG9uZW50IG9mIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHJldHVybiBUaGUgdGVtcGVyYXR1cmUgZXhwb25lbnQgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEludGVnZXIgZ2V0VGVtcGVyYXR1cmUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1RFTVBFUkFUVVJFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgdGVtcGVyYXR1cmUgZXhwb25lbnQgZm9yIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHBhcmFtIGV4cG9uZW50IFRoZSBuZXcgdGVtcGVyYXR1cmUgZXhwb25lbnQuCisJICovCisJcHVibGljIHZvaWQgc2V0VGVtcGVyYXR1cmUoSW50ZWdlciBleHBvbmVudCkgeworCQlnZXRWYWx1ZShBVFRSX1RFTVBFUkFUVVJFKS5zZXQoZXhwb25lbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1vbGFyIGFtb3VudCBleHBvbmVudCBvZiB0aGlzIHBoeXNpY2FsIGRpbWVuc2lvbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1vbGFyIGFtb3VudCBleHBvbmVudCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRNb2xhckFtb3VudCgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTU9MQVJfQU1PVU5UKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgbW9sYXIgYW1vdW50IGV4cG9uZW50IGZvciB0aGlzIHBoeXNpY2FsIGRpbWVuc2lvbi4KKwkgKgorCSAqIEBwYXJhbSBleHBvbmVudCBUaGUgbmV3IG1vbGFyIGFtb3VudCBleHBvbmVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2xhckFtb3VudChJbnRlZ2VyIGV4cG9uZW50KSB7CisJCWdldFZhbHVlKEFUVFJfTU9MQVJfQU1PVU5UKS5zZXQoZXhwb25lbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGx1bWlub3VzIGludGVuc2l0eSBleHBvbmVudCBvZiB0aGlzIHBoeXNpY2FsIGRpbWVuc2lvbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGx1bWlub3VzIGludGVuc2l0eSBleHBvbmVudCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRMdW1pbm91c0ludGVuc2l0eSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTFVNSU5PVVNfSU5URU5TSVRZKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgbHVtaW5vdXMgaW50ZW5zaXR5IGV4cG9uZW50IGZvciB0aGlzIHBoeXNpY2FsIGRpbWVuc2lvbi4KKwkgKgorCSAqIEBwYXJhbSBleHBvbmVudCBUaGUgbmV3IGx1bWlub3VzIGludGVuc2l0eSBleHBvbmVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMdW1pbm91c0ludGVuc2l0eShJbnRlZ2VyIGV4cG9uZW50KSB7CisJCWdldFZhbHVlKEFUVFJfTFVNSU5PVVNfSU5URU5TSVRZKS5zZXQoZXhwb25lbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGFuZ2xlIGV4cG9uZW50IG9mIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHJldHVybiBUaGUgYW5nbGUgZXhwb25lbnQgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEludGVnZXIgZ2V0QW5nbGUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0FOR0xFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgYW5nbGUgZXhwb25lbnQgZm9yIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHBhcmFtIGV4cG9uZW50IFRoZSBuZXcgYW5nbGUgZXhwb25lbnQuCisJICovCisJcHVibGljIHZvaWQgc2V0QW5nbGUoSW50ZWdlciBleHBvbmVudCkgeworCQlnZXRWYWx1ZShBVFRSX0FOR0xFKS5zZXQoZXhwb25lbnQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1F1YW50aXR5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUXVhbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmVjYjBlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1F1YW50aXR5LmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBxdWFudGl0eSBlbnRpdHkgdHlwZS4ge0BsaW5rIENoYW5uZWx9cyBhcmUgYmFzZWQgb24KKyAqIGVudGl0aWVzIG9mIHRoaXMgdHlwZS4gRWFjaCBxdWFudGl0eSBoYXMgYSByZWxhdGlvbiB0byBhIGRlZmF1bHQKKyAqIHtAbGluayBVbml0fS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIFF1YW50aXR5IGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERhdGFibGUsIERlbGV0YWJsZSwgRGVzY3JpYmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnRGVmYXVsdFJhbmsnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVGQVVMVF9SQU5LID0gIkRlZmF1bHRSYW5rIjsKKworCS8qKgorCSAqIFRoZSAnRGVmYXVsdERpbWVuc2lvbicgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0RJTUVOU0lPTiA9ICJEZWZEaW1lbnNpb24iOworCisJLyoqCisJICogVGhlICdEZWZhdWx0VHlwZVNpemUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVGQVVMVF9UWVBFX1NJWkUgPSAiRGVmVHlwZVNpemUiOworCisJLyoqCisJICogVGhlICdEZWZhdWx0Q2hhbm5lbE5hbWUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVGQVVMVF9DSEFOTkVMX05BTUUgPSAiRGVmTVFOYW1lIjsKKworCS8qKgorCSAqIFRoZSAnRGVmYXVsdFNjYWxhclR5cGUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVGQVVMVF9TQ0FMQVJfVFlQRSA9ICJEZWZEYXRhVHlwZSI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVF1YW50aXR5KENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHJhbmsgb2YgdGhpcyBxdWFudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRlZmF1bHQgcmFuayBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0UmFuaygpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfREVGQVVMVF9SQU5LKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGVmYXVsdCByYW5rIGZvciB0aGlzIHF1YW50aXR5LgorCSAqCisJICogQHBhcmFtIGRlZmF1bHRSYW5rIFRoZSBuZXcgZGVmYXVsdCByYW5rLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRSYW5rKEludGVnZXIgZGVmYXVsdFJhbmspIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX1JBTkspLnNldChkZWZhdWx0UmFuayk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCBkaW1lbnNpb24gb2YgdGhpcyBxdWFudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRlZmF1bHQgZGltZW5zaW9uIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBpbnRbXSBnZXREZWZhdWx0RGltZW5zaW9uKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0RJTUVOU0lPTikuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IGRlZmF1bHQgZGltZW5zaW9uIGZvciB0aGlzIHF1YW50aXR5LgorCSAqCisJICogQHBhcmFtIGRlZmF1bHREaW1lbnNpb24gVGhlIG5ldyBkZWZhdWx0IGRpbWVuc2lvbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RGltZW5zaW9uKGludFtdIGRlZmF1bHREaW1lbnNpb24pIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0RJTUVOU0lPTikuc2V0KGRlZmF1bHREaW1lbnNpb24pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdHlwZSBzaXplIG9mIHRoaXMgcXVhbnRpdHkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHR5cGUgc2l6ZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0VHlwZVNpemUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0RFRkFVTFRfVFlQRV9TSVpFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGVmYXVsdCB0eXBlIHNpemUgZm9yIHRoaXMgcXVhbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdFR5cGVTaXplIFRoZSBuZXcgZGVmYXVsdCB0eXBlIHNpemUuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdFR5cGVTaXplKEludGVnZXIgZGVmYXVsdFR5cGVTaXplKSB7CisJCWdldFZhbHVlKEFUVFJfREVGQVVMVF9UWVBFX1NJWkUpLnNldChkZWZhdWx0VHlwZVNpemUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQge0BsaW5rIENoYW5uZWx9IG5hbWUgb2YgdGhpcyBxdWFudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRlZmF1bHQge0Bjb2RlIENoYW5uZWx9IG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2hhbm5lbE5hbWUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0RFRkFVTFRfQ0hBTk5FTF9OQU1FKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGVmYXVsdCB7QGxpbmsgQ2hhbm5lbH0gbmFtZSBmb3IgdGhpcyBxdWFudGl0eS4KKwkgKgorCSAqIEBwYXJhbSBkZWZhdWx0Q2hhbm5lbE5hbWUgVGhlIG5ldyBkZWZhdWx0IHtAY29kZSBDaGFubmVsfSBuYW1lLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRDaGFubmVsTmFtZShTdHJpbmcgZGVmYXVsdENoYW5uZWxOYW1lKSB7CisJCWdldFZhbHVlKEFUVFJfREVGQVVMVF9DSEFOTkVMX05BTUUpLnNldChkZWZhdWx0Q2hhbm5lbE5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQge0BsaW5rIFNjYWxhclR5cGV9IG9mIHRoaXMgcXVhbnRpdHkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHtAY29kZSBTY2FsYXJUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU2NhbGFyVHlwZSBnZXREZWZhdWx0U2NhbGFyVHlwZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfREVGQVVMVF9TQ0FMQVJfVFlQRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IGRlZmF1bHQge0BsaW5rIFNjYWxhclR5cGV9IGZvciB0aGlzIHF1YW50aXR5LgorCSAqCisJICogQHBhcmFtIGRlZmF1bHRTY2FsYXJUeXBlIFRoZSBuZXcgZGVmYXVsdCB7QGNvZGUgU2NhbGFyVHlwZX0uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHtAY29kZSBTY2FsYXJUeXBlfSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBTY2FsYXJUeXBlI1VOS05PV059LgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTY2FsYXJUeXBlKFNjYWxhclR5cGUgZGVmYXVsdFNjYWxhclR5cGUpIHsKKwkJaWYgKGRlZmF1bHRTY2FsYXJUeXBlLmlzVW5rbm93bigpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiRGVmYXVsdCBzY2FsYXIgdHlwZSBjb25zdGFudCBpcyBub3QgYWxsb3dlZCB0byBiZSAnIiArIGRlZmF1bHRTY2FsYXJUeXBlICsgIicuIik7CisJCX0KKworCQlnZXRWYWx1ZShBVFRSX0RFRkFVTFRfU0NBTEFSX1RZUEUpLnNldChkZWZhdWx0U2NhbGFyVHlwZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCB7QGxpbmsgVW5pdH0gb2YgdGhpcyBxdWFudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRlZmF1bHQge0Bjb2RlIFVuaXR9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBVbml0IGdldERlZmF1bHRVbml0KCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLmdldChVbml0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBkZWZhdWx0IHtAbGluayBVbml0fSBmb3IgdGhpcyBxdWFudGl0eS4KKwkgKgorCSAqIEBwYXJhbSBkZWZhdWx0VW5pdCBUaGUgbmV3IGRlZmF1bHQge0Bjb2RlIFVuaXR9LgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRVbml0KFVuaXQgZGVmYXVsdFVuaXQpIHsKKwkJZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLnNldChkZWZhdWx0VW5pdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvU2NhbGFyVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1NjYWxhclR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2JjOGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1NjYWxhclR5cGUuamF2YQpAQCAtMCwwICsxLDQzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworCisvKioKKyAqIFNjYWxhciB0eXBlIGVudW1lcmF0aW9uIGlzIGEge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSBmYWN0b3J5LiBBbm90aGVyIGNvbnRleHQKKyAqIHdoZXJlIHRoaXMgZW51bWVyYXRpb24gaXMgdXNlZCBpcyB0aGUgc3RvcmFnZSBvZiB2YWx1ZXMsIHJlcHJlc2VudGVkIGJ5IHRoZQorICogY29uc3RhbnRzIG9mIHRoaXMgZW51bWVyYXRpb24sIGluIHRoZWlyIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIChzZWU6CisgKiB7QGxpbmsgQmFzZVBhcmFtZXRlcn0pLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTY2FsYXJUeXBlIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZSB7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgU3RyaW5nfSB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIFNUUklORyA9IG5ldyBTY2FsYXJUeXBlKDAsICJTVFJJTkciLCBWYWx1ZVR5cGUuU1RSSU5HX1NFUVVFTkNFLCBTdHJpbmcuY2xhc3MpOworCisJLyoqCisJICogQSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGFuIGFycmF5IHNlcXVlbmNlIG9mCisJICoge0Bjb2RlIExvY2FsRGF0ZVRpbWV9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgREFURSA9IG5ldyBTY2FsYXJUeXBlKDEsICJEQVRFIiwgVmFsdWVUeXBlLkRBVEVfU0VRVUVOQ0UsIExvY2FsRGF0ZVRpbWUuY2xhc3MpOworCisJLyoqCisJICogQSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGFuIGFycmF5IHNlcXVlbmNlIG9mCisJICoge0Bjb2RlIGJvb2xlYW59IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgQk9PTEVBTiA9IG5ldyBTY2FsYXJUeXBlKDIsICJCT09MRUFOIiwgVmFsdWVUeXBlLkJPT0xFQU5fU0VRVUVOQ0UsIGJvb2xlYW4uY2xhc3MpOworCisJLyoqCisJICogQSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGFuIGFycmF5IHNlcXVlbmNlIG9mCisJICoge0Bjb2RlIGJ5dGV9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgQllURSA9IG5ldyBTY2FsYXJUeXBlKDMsICJCWVRFIiwgVmFsdWVUeXBlLkJZVEVfU0VRVUVOQ0UsIGJ5dGUuY2xhc3MpOworCisJLyoqCisJICogQSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGFuIGFycmF5IHNlcXVlbmNlIG9mCisJICoge0Bjb2RlIHNob3J0fSB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIFNIT1JUID0gbmV3IFNjYWxhclR5cGUoNCwgIlNIT1JUIiwgVmFsdWVUeXBlLlNIT1JUX1NFUVVFTkNFLCBzaG9ydC5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgaW50fSB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIElOVEVHRVIgPSBuZXcgU2NhbGFyVHlwZSg1LCAiSU5URUdFUiIsIFZhbHVlVHlwZS5JTlRFR0VSX1NFUVVFTkNFLCBpbnQuY2xhc3MpOworCisJLyoqCisJICogQSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGFuIGFycmF5IHNlcXVlbmNlIG9mCisJICoge0Bjb2RlIGxvbmd9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgTE9ORyA9IG5ldyBTY2FsYXJUeXBlKDYsICJMT05HIiwgVmFsdWVUeXBlLkxPTkdfU0VRVUVOQ0UsIGxvbmcuY2xhc3MpOworCisJLyoqCisJICogQSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGFuIGFycmF5IHNlcXVlbmNlIG9mCisJICoge0Bjb2RlIGZsb2F0fSB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIEZMT0FUID0gbmV3IFNjYWxhclR5cGUoNywgIkZMT0FUIiwgVmFsdWVUeXBlLkZMT0FUX1NFUVVFTkNFLCBmbG9hdC5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgZG91YmxlfSB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIERPVUJMRSA9IG5ldyBTY2FsYXJUeXBlKDgsICJET1VCTEUiLCBWYWx1ZVR5cGUuRE9VQkxFX1NFUVVFTkNFLCBkb3VibGUuY2xhc3MpOworCisJLyoqCisJICogQSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGFuIGFycmF5IHNlcXVlbmNlIG9mCisJICoge0Bjb2RlIGJ5dGVbXX0gdmFsdWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2NhbGFyVHlwZSBCWVRFX1NUUkVBTSA9IG5ldyBTY2FsYXJUeXBlKDksICJCWVRFX1NUUkVBTSIsIFZhbHVlVHlwZS5CWVRFX1NUUkVBTV9TRVFVRU5DRSwKKwkJCWJ5dGVbXS5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgRmxvYXRDb21wbGV4fSB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIEZMT0FUX0NPTVBMRVggPSBuZXcgU2NhbGFyVHlwZSgxMCwgIkZMT0FUX0NPTVBMRVgiLCBWYWx1ZVR5cGUuRkxPQVRfQ09NUExFWF9TRVFVRU5DRSwKKwkJCUZsb2F0Q29tcGxleC5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgRG91YmxlQ29tcGxleH0gdmFsdWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2NhbGFyVHlwZSBET1VCTEVfQ09NUExFWCA9IG5ldyBTY2FsYXJUeXBlKDExLCAiRE9VQkxFX0NPTVBMRVgiLAorCQkJVmFsdWVUeXBlLkRPVUJMRV9DT01QTEVYX1NFUVVFTkNFLCBEb3VibGVDb21wbGV4LmNsYXNzKTsKKworCS8qKgorCSAqIHtAbGluayBNZWFzdXJlZFZhbHVlc30gYXJlIG5vdCBhbGxvd2VkIHRvIGJlIG9mIHRoaXMgdHlwZS4gVGhpcyBjb25zdGFudCBtYXkKKwkgKiBiZSB1c2VkIGluIG90aGVyIGNvbnRleHRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2NhbGFyVHlwZSBFTlVNRVJBVElPTiA9IG5ldyBTY2FsYXJUeXBlKDEyLCAiRU5VTUVSQVRJT04iLCBWYWx1ZVR5cGUuRU5VTUVSQVRJT05fU0VRVUVOQ0UpOworCisJLyoqCisJICogQSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGFuIGFycmF5IHNlcXVlbmNlIG9mCisJICoge0Bjb2RlIEZpbGVMaW5rfSB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIEZJTEVfTElOSyA9IG5ldyBTY2FsYXJUeXBlKDEzLCAiRklMRV9MSU5LIiwgVmFsdWVUeXBlLkZJTEVfTElOS19TRVFVRU5DRSwKKwkJCUZpbGVMaW5rLmNsYXNzKTsKKworCS8qKgorCSAqIFRPRE8gLi4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIEJMT0IgPSBuZXcgU2NhbGFyVHlwZSgxNCwgIkJMT0IiLCBWYWx1ZVR5cGUuQkxPQiwgT2JqZWN0LmNsYXNzKTsKKworCS8qKgorCSAqIHtAbGluayBNZWFzdXJlZFZhbHVlc30gYXJlIG5vdCBhbGxvd2VkIHRvIGJlIG9mIHRoaXMgdHlwZS4gVGhpcyBjb25zdGFudCBtYXkKKwkgKiBiZSB1c2VkIGluIG90aGVyIGNvbnRleHRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2NhbGFyVHlwZSBVTktOT1dOID0gbmV3IFNjYWxhclR5cGUoMTUsICJVTktOT1dOIiwgVmFsdWVUeXBlLlVOS05PV04pOworCisJcHJpdmF0ZSBmaW5hbCBWYWx1ZVR5cGUgdmFsdWVUeXBlOworCXByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gYXJyYXlUeXBlOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIG9yZCAgICAgICBvcmRpbmFsIG51bWJlciBvZiB0aGUgZW51bSB2YWx1ZQorCSAqIEBwYXJhbSBuYW1lICAgICAgbmFtZSBvZiB0aGUgZW51bSB2YWx1ZQorCSAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIGFzc29jaWF0ZWQge0BsaW5rIFZhbHVlVHlwZX0uCisJICovCisJcHJpdmF0ZSBTY2FsYXJUeXBlKGludCBvcmQsIFN0cmluZyBuYW1lLCBWYWx1ZVR5cGUgdmFsdWVUeXBlKSB7CisJCXN1cGVyKG5hbWUsIG9yZCk7CisJCXRoaXMudmFsdWVUeXBlID0gdmFsdWVUeXBlOworCQlhcnJheVR5cGUgPSBudWxsOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG9yZCAgICAgICAgICAgb3JkaW5hbCBudW1iZXIgb2YgdGhlIGVudW0gdmFsdWUKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBlbnVtIHZhbHVlCisJICogQHBhcmFtIHZhbHVlVHlwZSAgICAgVGhlIGFzc29jaWF0ZWQge0BsaW5rIFZhbHVlVHlwZX0uCisJICogQHBhcmFtIGNvbXBvbmVudFR5cGUgVGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheSBoZWxkIGJ5IGluc3RhbmNlcyBvZgorCSAqICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBNZWFzdXJlZFZhbHVlc30uCisJICovCisJcHJpdmF0ZSBTY2FsYXJUeXBlKGludCBvcmQsIFN0cmluZyBuYW1lLCBWYWx1ZVR5cGUgdmFsdWVUeXBlLCBDbGFzczw/PiBjb21wb25lbnRUeXBlKSB7CisJCXN1cGVyKG5hbWUsIG9yZCk7CisJCXRoaXMudmFsdWVUeXBlID0gdmFsdWVUeXBlOworCQlhcnJheVR5cGUgPSBBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCAwKS5nZXRDbGFzcygpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSBpbml0aWFsaXplZCB3aXRoIGdpdmVuIG5hbWUsIHVuaXQgYW5kCisJICogdmFsdWVzIGluY2x1ZGluZyB0aGUgcmVsYXRlZCB2YWxpZGl0eSBmbGFncy4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgQ2hhbm5lbH0uCisJICogQHBhcmFtIHVuaXQgICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgdW5pdCB0aGUgY29udGFpbmVkIHZhbHVlcyBhcmUgb2YuCisJICogQHBhcmFtIHNlcXVlbmNlUmVwcmVzZW50YXRpb24gVGhlIHtAbGluayBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSBvZiB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZCB2YWx1ZXMuCisJICogQHBhcmFtIGluZGVwZW5kZW50ICAgICAgICAgICAgVGhlIGluZGVwZW5kZW50IGZsYWcgb2YgdGhlIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAcGFyYW0gYXhpc1R5cGUgICAgICAgICAgICAgICBUaGUge0BsaW5rIEF4aXNUeXBlfSBvZiB0aGUgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEBwYXJhbSBpbnB1dCAgICAgICAgICAgICAgICAgIFRoZSBtZWFzdXJlZCB2YWx1ZXMuCisJICogQHBhcmFtIGZsYWdzICAgICAgICAgICAgICAgICAgVGhlIHZhbGlkaXR5IGZsYWdzIG9mIHRoZSBtZWFzdXJlZCB2YWx1ZXMuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgTWVhc3VyZWRWYWx1ZXN9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uICAgIFRocm93biBpZiB7QGxpbmsgI2lzRW51bWVyYXRpb24oKX0gb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI2lzVW5rbm93bigpfSByZXR1cm5zIHtAY29kZSB0cnVlfS4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdmFsdWVzIGFyZSBub3QgYXNzaWdubWVudAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUuCisJICovCisJcHVibGljIE1lYXN1cmVkVmFsdWVzIGNyZWF0ZU1lYXN1cmVkVmFsdWVzKFN0cmluZyBuYW1lLCBTdHJpbmcgdW5pdCwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uLAorCQkJZG91YmxlW10gZ2VuZXJhdGlvblBhcmFtZXRlcnMsIGJvb2xlYW4gaW5kZXBlbmRlbnQsIEF4aXNUeXBlIGF4aXNUeXBlLCBPYmplY3QgaW5wdXQsIGJvb2xlYW5bXSBmbGFncykgeworCQlpZiAoaXNFbnVtZXJhdGlvbigpIHx8IGlzVW5rbm93bigpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdCBpcyBub3QgYWxsb3dlZCB0byBjcmVhdGUgbWVhc3VyZWQgdmFsdWVzIG9mIHR5cGUgJyIgKyB0aGlzICsgIicuIik7CisJCX0gZWxzZSBpZiAoIWFycmF5VHlwZS5pc0luc3RhbmNlKGlucHV0KSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gdmFsdWVzIG9mIHR5cGUgJyIgKyBpbnB1dC5nZXRDbGFzcygpICsgIicuIik7CisJCX0KKworCQlyZXR1cm4gbmV3IE1lYXN1cmVkVmFsdWVzKHRoaXMsIG5hbWUsIHVuaXQsIHNlcXVlbmNlUmVwcmVzZW50YXRpb24sIGdlbmVyYXRpb25QYXJhbWV0ZXJzLCBpbmRlcGVuZGVudCwgYXhpc1R5cGUsCisJCQkJaW5wdXQsIGZsYWdzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI1NUUklOR30uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoKSB7CisJCXJldHVybiBTVFJJTkcgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0RBVEV9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGF0ZSgpIHsKKwkJcmV0dXJuIERBVEUgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0JPT0xFQU59LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhbigpIHsKKwkJcmV0dXJuIEJPT0xFQU4gPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBvbiBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0JZVEV9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNTSE9SVH08L2xpPgorCSAqIDxsaT57QGxpbmsgI0lOVEVHRVJ9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNMT05HfTwvbGk+CisJICogPGxpPntAbGluayAjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEV9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTnVtZXJpY2FsVHlwZSgpIHsKKwkJcmV0dXJuIGlzSW50ZWdlclR5cGUoKSB8fCBpc0Zsb2F0VHlwZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIG9uIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjQllURX08L2xpPgorCSAqIDxsaT57QGxpbmsgI1NIT1JUfTwvbGk+CisJICogPGxpPntAbGluayAjSU5URUdFUn08L2xpPgorCSAqIDxsaT57QGxpbmsgI0xPTkd9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW50ZWdlclR5cGUoKSB7CisJCXJldHVybiBpc0J5dGUoKSB8fCBpc1Nob3J0KCkgfHwgaXNJbnRlZ2VyKCkgfHwgaXNMb25nKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgaXMge0BsaW5rICNCWVRFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0J5dGUoKSB7CisJCXJldHVybiBCWVRFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgaXMge0BsaW5rICNTSE9SVH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaG9ydCgpIHsKKwkJcmV0dXJuIFNIT1JUID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgaXMge0BsaW5rICNJTlRFR0VSfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVnZXIoKSB7CisJCXJldHVybiBJTlRFR0VSID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgaXMge0BsaW5rICNMT05HfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xvbmcoKSB7CisJCXJldHVybiBMT05HID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgb24gb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVH08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGbG9hdFR5cGUoKSB7CisJCXJldHVybiBpc0Zsb2F0KCkgfHwgaXNEb3VibGUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0ZMT0FUfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KCkgeworCQlyZXR1cm4gRkxPQVQgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0RPVUJMRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEb3VibGUoKSB7CisJCXJldHVybiBET1VCTEUgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0JZVEVfU1RSRUFNfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0J5dGVTdHJlYW0oKSB7CisJCXJldHVybiBCWVRFX1NUUkVBTSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIG9uIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjRkxPQVRfQ09NUExFWH08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRV9DT01QTEVYfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXhUeXBlKCkgeworCQlyZXR1cm4gaXNGbG9hdENvbXBsZXgoKSB8fCBpc0RvdWJsZUNvbXBsZXgoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0ZMT0FUX0NPTVBMRVh9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmxvYXRDb21wbGV4KCkgeworCQlyZXR1cm4gRkxPQVRfQ09NUExFWCA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjRE9VQkxFX0NPTVBMRVh9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRG91YmxlQ29tcGxleCgpIHsKKwkJcmV0dXJuIERPVUJMRV9DT01QTEVYID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgaXMge0BsaW5rICNFTlVNRVJBVElPTn0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbnVtZXJhdGlvbigpIHsKKwkJcmV0dXJuIEVOVU1FUkFUSU9OID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgaXMge0BsaW5rICNGSUxFX0xJTkt9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmlsZUxpbmsoKSB7CisJCXJldHVybiBGSUxFX0xJTksgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0JMT0J9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQmxvYigpIHsKKwkJcmV0dXJuIEJMT0IgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI1VOS05PV059LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVW5rbm93bigpIHsKKwkJcmV0dXJuIFVOS05PV04gPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIHtAbGluayBWYWx1ZVR5cGV9LgorCSAqCisJICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgVmFsdWVUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVmFsdWVUeXBlIHRvVmFsdWVUeXBlKCkgeworCQlyZXR1cm4gdmFsdWVUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5vbiBzZXF1ZW5jZSB7QGxpbmsgVmFsdWVUeXBlfSBvZiB0aGUgYXNzb2NpYXRlZCB7QGNvZGUKKwkgKiBWYWx1ZVR5cGV9LgorCSAqCisJICogQHJldHVybiBUaGUgbm9uIHNlcXVlbmNlIHtAY29kZSBWYWx1ZVR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBWYWx1ZVR5cGUgdG9TaW5nbGVWYWx1ZVR5cGUoKSB7CisJCXJldHVybiB2YWx1ZVR5cGUudG9TaW5nbGVUeXBlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1NlcXVlbmNlUmVwcmVzZW50YXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9TZXF1ZW5jZVJlcHJlc2VudGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5YjhiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9TZXF1ZW5jZVJlcHJlc2VudGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKKy8qKgorICogVGhlIHNlcXVlbmNlIHJlcHJlc2VudGF0aW9uIHRvIGRlc2NyaWJlIHRoZSBzdG9yYWdlIHR5cGUgb2YgbWVhc3VyZWQgdmFsdWVzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDaGFubmVsCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gRW51bWVyYXRpb25zCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTWVhc3VyZWQgdmFsdWVzIGFyZSBzdG9yZWQgYXMgaXMgYW5kIHZhbHVlcyBhcmUgdGhlcmVmb3JlIGltbWVkaWF0ZWx5CisJICogYXZhaWxhYmxlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBFWFBMSUNJVCA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCJFWFBMSUNJVCIsIDApOworCisJLyoqCisJICogRWFjaCB2YWx1ZSB4PHN1Yj5pPC9zdWI+IGlzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOiB4PHN1Yj5pPC9zdWI+ID0gcCBmb3IgaQorCSAqICZpc2luOyBbMSwgbl0sIG4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiB2YWx1ZXMgYW5kIGdlbmVyYXRpb24gcGFyYW1ldGVyIHAKKwkgKiAob2Zmc2V0KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gSU1QTElDSVRfQ09OU1RBTlQgPSBuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvbigiSU1QTElDSVRfQ09OU1RBTlQiLCAxKTsKKworCS8qKgorCSAqIEVhY2ggdmFsdWUgeDxzdWI+aTwvc3ViPiBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93czogeDxzdWI+aTwvc3ViPiA9CisJICogcDxzdWI+MTwvc3ViPisoaS0xKSpwPHN1Yj4yPC9zdWI+IGZvciBpICZpc2luOyBbMSwgbl0sIG4gaXMgdGhlIHRvdGFsIG51bWJlcgorCSAqIG9mIHZhbHVlcyBhbmQgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzIHA8c3ViPjE8L3N1Yj4gKHN0YXJ0IHZhbHVlKSBhbmQKKwkgKiBwPHN1Yj4yPC9zdWI+IChpbmNyZW1lbnQpLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBJTVBMSUNJVF9MSU5FQVIgPSBuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvbigiSU1QTElDSVRfTElORUFSIiwgMik7CisKKwkvKioKKwkgKiBFYWNoIHZhbHVlIHg8c3ViPmk8L3N1Yj4gaXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6IHg8c3ViPmk8L3N1Yj4gPQorCSAqIHA8c3ViPjE8L3N1Yj4rKChpLTEpbW9kKHA8c3ViPjM8L3N1Yj4tcDxzdWI+MTwvc3ViPikvcDxzdWI+Mjwvc3ViPikqCisJICogcDxzdWI+Mjwvc3ViPiBmb3IgaSAmaXNpbjsgWzEsIG5dLCBuIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdmFsdWVzIGFuZAorCSAqIGdlbmVyYXRpb24gcGFyYW1ldGVycyBwPHN1Yj4xPC9zdWI+IChzdGFydCB2YWx1ZSksIHA8c3ViPjI8L3N1Yj4gKGluY3JlbWVudCkKKwkgKiBhbmQgcDxzdWI+Mzwvc3ViPiAobnVtYmVyIG9mIHZhbHVlcyBwZXIgc2F3KS4gVGhlIGV4cHJlc3Npb24KKwkgKiAocDxzdWI+Mzwvc3ViPi1wPHN1Yj4xPC9zdWI+KS9wPHN1Yj4yPC9zdWI+IG11c3QgYmUgdHJ1bmNhdGVkIHRvIGludGVnZXIgdG8KKwkgKiBzdGFydCBlYWNoIHNhdyBjdXJ2ZSBjeWNsZSBhdCBwPHN1Yj4xPC9zdWI+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBJTVBMSUNJVF9TQVcgPSBuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvbigiSU1QTElDSVRfU0FXIiwgMyk7CisKKwkvKioKKwkgKiBFYWNoIHZhbHVlIHg8c3ViPmk8L3N1Yj4gaXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6IHg8c3ViPmk8L3N1Yj4gPQorCSAqIHA8c3ViPjE8L3N1Yj4rcDxzdWI+Mjwvc3ViPipyPHN1Yj5pPC9zdWI+IGZvciBpICZpc2luOyBbMSwgbl0sIG4gaXMgdGhlIHRvdGFsCisJICogbnVtYmVyIG9mIHZhbHVlcyBhbmQgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzIHA8c3ViPjE8L3N1Yj4gKG9mZnNldCksCisJICogcDxzdWI+Mjwvc3ViPiAoZmFjdG9yKSBhbmQgdGhlIHJhdyB2YWx1ZSByIGF0IHBvc2l0aW9uIGkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIFJBV19MSU5FQVIgPSBuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvbigiUkFXX0xJTkVBUiIsIDQpOworCisJLyoqCisJICogRWFjaCB2YWx1ZSB4PHN1Yj5pPC9zdWI+IGlzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOiB4PHN1Yj5pPC9zdWI+ID0gJnN1bTsKKwkgKiBwPHN1Yj5qPC9zdWI+KnI8c3ViPmk8L3N1Yj48c3VwPmotMTwvc3VwPiA9IHA8c3ViPjI8L3N1Yj4rcDxzdWI+MworCSAqIDwvc3ViPipyPHN1Yj5pPC9zdWI+K3A8c3ViPjQ8L3N1Yj4qcjxzdWI+aTwvc3ViPjxzdXA+Mjwvc3VwPisuLi4gZm9yIGkgJmlzaW47CisJICogWzEsIG5dLCBuIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdmFsdWVzIGFuZCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMKKwkgKiBwPHN1Yj5qPC9zdWI+IGZvciBqICZpc2luOyBbMSwgcDxzdWI+MTwvc3ViPl0gYW5kIHRoZSByYXcgdmFsdWUgciBhdCBwb3NpdGlvbgorCSAqIGkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIFJBV19QT0xZTk9NSUFMID0gbmV3IFNlcXVlbmNlUmVwcmVzZW50YXRpb24oIlJBV19QT0xZTk9NSUFMIiwgNSk7CisKKwkvKgorCSAqIE5vdCB1c2VkLiBCdXQga2VlcCBoZXJlIHRvIHNob3cgb3JkaW5hbCBzZXF1ZW5jZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gRk9STVVMQSA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCJGT1JNVUxBIiwgNik7CisKKwkvKioKKwkgKiBNZWFzdXJlZCB2YWx1ZXMgYXJlIHN0b3JlZCBhcyBpcyBpbiBhbiBleHRlcm5hbCBmaWxlIGFuZCB2YWx1ZXMgYXJlIHRoZXJlZm9yZQorCSAqIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gRVhQTElDSVRfRVhURVJOQUwgPSBuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvbigiRVhQTElDSVRfRVhURVJOQUwiLCA3KTsKKworCS8qKgorCSAqIEVhY2ggdmFsdWUgeDxzdWI+aTwvc3ViPiBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93czogeDxzdWI+aTwvc3ViPiA9CisJICogcDxzdWI+MTwvc3ViPitwPHN1Yj4yPC9zdWI+KnI8c3ViPmk8L3N1Yj4gZm9yIGkgJmlzaW47IFsxLCBuXSwgbiBpcyB0aGUgdG90YWwKKwkgKiBudW1iZXIgb2YgdmFsdWVzIGFuZCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgcDxzdWI+MTwvc3ViPiAob2Zmc2V0KSwKKwkgKiBwPHN1Yj4yPC9zdWI+IChmYWN0b3IpIGFuZCB0aGUgcmF3IHZhbHVlIHIgYXQgcG9zaXRpb24gaSByZWFkIGZyb20gYW4KKwkgKiBleHRlcm5hbCBmaWxlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBSQVdfTElORUFSX0VYVEVSTkFMID0gbmV3IFNlcXVlbmNlUmVwcmVzZW50YXRpb24oIlJBV19MSU5FQVJfRVhURVJOQUwiLAorCQkJOCk7CisKKwkvKioKKwkgKiBFYWNoIHZhbHVlIHg8c3ViPmk8L3N1Yj4gaXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6IHg8c3ViPmk8L3N1Yj4gPSAmc3VtOworCSAqIHA8c3ViPmo8L3N1Yj4qcjxzdWI+aTwvc3ViPjxzdXA+ai0xPC9zdXA+ID0gcDxzdWI+Mjwvc3ViPitwPHN1Yj4zCisJICogPC9zdWI+KnI8c3ViPmk8L3N1Yj4rcDxzdWI+NDwvc3ViPipyPHN1Yj5pPC9zdWI+PHN1cD4yPC9zdXA+Ky4uLiBmb3IgaSAmaXNpbjsKKwkgKiBbMSwgbl0sIG4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiB2YWx1ZXMgYW5kIGdlbmVyYXRpb24gcGFyYW1ldGVycworCSAqIHA8c3ViPmo8L3N1Yj4gZm9yIGogJmlzaW47IFsxLCBwPHN1Yj4xPC9zdWI+XSBhbmQgdGhlIHJhdyB2YWx1ZSByIGF0IHBvc2l0aW9uCisJICogaSByZWFkIGZyb20gYW4gZXh0ZXJuYWwgZmlsZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gUkFXX1BPTFlOT01JQUxfRVhURVJOQUwgPSBuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvbigKKwkJCSJSQVdfUE9MWU5PTUlBTF9FWFRFUk5BTCIsIDkpOworCisJLyoqCisJICogRWFjaCB2YWx1ZSB4PHN1Yj5pPC9zdWI+IGlzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOiB4PHN1Yj5pPC9zdWI+ID0KKwkgKiAocDxzdWI+MTwvc3ViPitwPHN1Yj4yPC9zdWI+KnI8c3ViPmk8L3N1Yj4pKnA8c3ViPjM8L3N1Yj4gZm9yIGkgJmlzaW47IFsxLAorCSAqIG5dLCBuIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdmFsdWVzIGFuZCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgcDxzdWI+MTwvc3ViPgorCSAqIChvZmZzZXQpLCBwPHN1Yj4yPC9zdWI+IChmYWN0b3IpLCBwPHN1Yj4yPC9zdWI+IChjYWxpYnJhdGlvbikgYW5kIHRoZSByYXcKKwkgKiB2YWx1ZSByIGF0IHBvc2l0aW9uIGkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIFJBV19MSU5FQVJfQ0FMSUJSQVRFRCA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKAorCQkJIlJBV19MSU5FQVJfQ0FMSUJSQVRFRCIsIDEwKTsKKworCS8qKgorCSAqIEVhY2ggdmFsdWUgeDxzdWI+aTwvc3ViPiBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93czogeDxzdWI+aTwvc3ViPiA9CisJICogKHA8c3ViPjE8L3N1Yj4rcDxzdWI+Mjwvc3ViPipyPHN1Yj5pPC9zdWI+KSpwPHN1Yj4zPC9zdWI+IGZvciBpICZpc2luOyBbMSwKKwkgKiBuXSwgbiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHZhbHVlcyBhbmQgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzIHA8c3ViPjE8L3N1Yj4KKwkgKiAob2Zmc2V0KSwgcDxzdWI+Mjwvc3ViPiAoZmFjdG9yKSwgcDxzdWI+Mjwvc3ViPiAoY2FsaWJyYXRpb24pIGFuZCB0aGUgcmF3CisJICogdmFsdWUgciBhdCBwb3NpdGlvbiBpIHJlYWQgZnJvbSBhbiBleHRlcm5hbCBmaWxlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBSQVdfTElORUFSX0NBTElCUkFURURfRVhURVJOQUwgPSBuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvbigKKwkJCSJSQVdfTElORUFSX0NBTElCUkFURURfRVhURVJOQUwiLCAxMSk7CisKKwlwcml2YXRlIFNlcXVlbmNlUmVwcmVzZW50YXRpb24oU3RyaW5nIG5hbWUsIGludCBvcmRpbmFsKSB7CisJCXN1cGVyKG5hbWUsIG9yZGluYWwpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlcXVlbmNlIHJlcHJlc2VudGF0aW9uIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0VYUExJQ0lUfTwvbGk+CisJICogPGxpPntAbGluayAjRVhQTElDSVRfRVhURVJOQUx9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRXhwbGljaXQoKSB7CisJCXJldHVybiBuYW1lKCkuc3RhcnRzV2l0aCgiRVhQTElDSVQiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNJTVBMSUNJVF9DT05TVEFOVH08L2xpPgorCSAqIDxsaT57QGxpbmsgI0lNUExJQ0lUX0xJTkVBUn08L2xpPgorCSAqIDxsaT57QGxpbmsgI0lNUExJQ0lUX1NBV308L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpIHsKKwkJcmV0dXJuIG5hbWUoKS5zdGFydHNXaXRoKCJJTVBMSUNJVCIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlcXVlbmNlIHJlcHJlc2VudGF0aW9uIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0lNUExJQ0lUX0NPTlNUQU5UfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0YW50KCkgeworCQlyZXR1cm4gbmFtZSgpLmNvbnRhaW5zKCJDT05TVEFOVCIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlcXVlbmNlIHJlcHJlc2VudGF0aW9uIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0lNUExJQ0lUX0xJTkVBUn08L2xpPgorCSAqIDxsaT57QGxpbmsgI1JBV19MSU5FQVJ9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfTElORUFSX0VYVEVSTkFMfTwvbGk+CisJICogPGxpPntAbGluayAjUkFXX0xJTkVBUl9DQUxJQlJBVEVEfTwvbGk+CisJICogPGxpPntAbGluayAjUkFXX0xJTkVBUl9DQUxJQlJBVEVEX0VYVEVSTkFMfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xpbmVhcigpIHsKKwkJcmV0dXJuIG5hbWUoKS5jb250YWlucygiTElORUFSIik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjUkFXX1BPTFlOT01JQUx9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfUE9MWU5PTUlBTF9FWFRFUk5BTH08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQb2x5bm9taWFsKCkgeworCQlyZXR1cm4gbmFtZSgpLmNvbnRhaW5zKCJQT0xZTk9NSUFMIik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjUkFXX0xJTkVBUl9DQUxJQlJBVEVEfTwvbGk+CisJICogPGxpPntAbGluayAjUkFXX0xJTkVBUl9DQUxJQlJBVEVEX0VYVEVSTkFMfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NhbGlicmF0ZWQoKSB7CisJCXJldHVybiBuYW1lKCkuY29udGFpbnMoIkNBTElCUkFURUQiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNFWFBMSUNJVF9FWFRFUk5BTH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1JBV19MSU5FQVJfRVhURVJOQUx9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfUE9MWU5PTUlBTF9FWFRFUk5BTH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1JBV19MSU5FQVJfQ0FMSUJSQVRFRF9FWFRFUk5BTH08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbCgpIHsKKwkJcmV0dXJuIG5hbWUoKS5lbmRzV2l0aCgiRVhURVJOQUwiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNSQVdfTElORUFSfTwvbGk+CisJICogPGxpPntAbGluayAjUkFXX1BPTFlOT01JQUx9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfTElORUFSX0VYVEVSTkFMfTwvbGk+CisJICogPGxpPntAbGluayAjUkFXX1BPTFlOT01JQUxfRVhURVJOQUx9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfTElORUFSX0NBTElCUkFURUR9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfTElORUFSX0NBTElCUkFURURfRVhURVJOQUx9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmF3KCkgeworCQlyZXR1cm4gbmFtZSgpLnN0YXJ0c1dpdGgoIlJBVyIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1NvcnRhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvU29ydGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDlkMmE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1NvcnRhYmxlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIHtAbGluayBFbnRpdHl9IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgZ2V0dGVyIGFuZAorICogc2V0dGVyIG1ldGhvZHMgZm9yIHRoZSAnU29ydEluZGV4JyBmaWVsZCBvZiBhbiBlbnRpdHkuIFRoZSB2YWx1ZSBpbiB0aGlzCisgKiBmaWVsZCBpcyB0aGUgaW5kZXggb2YgYW4gZW50aXR5IHJlbGF0aXZlIHRvIGFsbCBvdGhlciBlbnRpdGllcyBvZiB0aGUgc2FtZQorICogdHlwZSBiZW5lYXRoIHRoZWlyIHNoYXJlZCBwYXJlbnQuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU29ydGFibGUgZXh0ZW5kcyBFbnRpdHkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoaXMge0Bjb2RlIENvbXBhcmF0b3J9IGNvbXBhcmVzIGVudGl0aWVzIGltcGxlbWVudGluZyB0aGUge0BsaW5rIFNvcnRhYmxlfQorCSAqIGludGVyZmFjZSBieSB0aGUgbWFuZGF0b3J5IHtAbGluayAjQVRUUl9TT1JUX0lOREVYfSBwcm9wZXJ0eSBpbiBhc2NlbmRpbmcKKwkgKiBvcmRlci4KKwkgKi8KKwlDb21wYXJhdG9yPFNvcnRhYmxlPiBDT01QQVJBVE9SID0gQ29tcGFyYXRvci5jb21wYXJpbmcoU29ydGFibGU6OmdldFNvcnRJbmRleCk7CisKKwkvKioKKwkgKiBUaGUgJ1NvcnRJbmRleCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJU3RyaW5nIEFUVFJfU09SVF9JTkRFWCA9ICJTb3J0aW5kZXgiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc29ydCBpbmRleCBvZiB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNvcnQgaW5kZXggaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBJbnRlZ2VyIGdldFNvcnRJbmRleCgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfU09SVF9JTkRFWCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IHNvcnQgaW5kZXggZm9yIHRoaXMgZW50aXR5LgorCSAqCisJICogQHBhcmFtIHNvcnRJbmRleCBUaGUgbmV3IHNvcnQgaW5kZXguCisJICovCisJZGVmYXVsdCB2b2lkIHNldFNvcnRJbmRleChJbnRlZ2VyIHNvcnRJbmRleCkgeworCQlnZXRWYWx1ZShBVFRSX1NPUlRfSU5ERVgpLnNldChzb3J0SW5kZXgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1N0YXR1c0F0dGFjaGFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9TdGF0dXNBdHRhY2hhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1NjgwNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9TdGF0dXNBdHRhY2hhYmxlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBFYWNoIG1vZGVsZWQge0BsaW5rIEVudGl0eX0gaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSB0byBpbmRpY2F0ZSB0aGF0IGl0IGhhcworICogYSBzdGF0dXMuCisgKgorICogPHA+CisgKiA8Yj5Ob3RlOjwvYj4gU3RhdGUgbWFuYWdlbWVudCBpcyBub3QgcGFydCBvZiB0aGUgYmFzZSBhcHBsaWNhdGlvbiBtb2RlbC4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBTdGF0dXNBdHRhY2hhYmxlIGV4dGVuZHMgRW50aXR5IHsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1RhZ2FibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9UYWdhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2ZDU4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9UYWdhYmxlLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBFYWNoIG1vZGVsZWQge0BsaW5rIEVudGl0eX0gaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSB0byBpbmRpY2F0ZSB0aGF0IHRhZ3MKKyAqIGNhbiBiZSBhdHRhY2hlZCB0byBpdC4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBUYWdhYmxlIGV4dGVuZHMgRW50aXR5IHsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4YjM0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9UZXN0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZXN0IGVudGl0eSB0eXBlLiBUaGUgdGVzdCBncm91cHMgYSBudW1iZXIgb2Ygc2luZ2xlCisgKiB7QGxpbmsgVGVzdFN0ZXB9cy4gQSBtZWFzdXJlbWVudCBvcmRlciBhbHdheXMgY29ycmVzcG9uZHMgd2l0aCBleGFjdGx5IG9uZQorICogdGVzdCBlbnRpdHkuIFRoZSBuYW1lIG9mIGEgdGVzdCBzaG91bGQgYmUgY2hvc2VuIGluIGEgc3BlYWtpbmcgd2F5LCBiZWNhdXNlCisgKiBpdCBpcyBvZnRlbiB1c2VkIGluIGRpZmZlcmVudCBjb250ZXh0cywgZS5nLiBhcyBhIGxpbmsgYmV0d2VlbiB0aGUKKyAqIG1lYXN1cmVtZW50IGRhdGEgZnJvbSB0aGUgZGV2aWNlIGFuZCB0aGUgb3JkZXIgaW4gdGhlIGRhdGFiYXNlLiBUaGlzIHR5cGUgaXMKKyAqIGEgcm9vdCBub2RlIGZvciBwZXJzaXN0ZWQgdGVzdHMgd2l0aGluIGEgYmFzZSBhcHBsaWNhdGlvbiBtb2RlbC4gRXh0ZW5zaW9ucworICogYXJlIGZyZWUgdG8gaW50cm9kdWNlIG5ldyBlbnRpdHkgdHlwZXMgdGhhdCBtYXkgYWN0IGFzIGFuIGltbWVkaWF0ZSBwYXJlbnQKKyAqIGZvciBlbnRpdGllcyBvZiB0aGlzIHR5cGUuIEluIHN1Y2ggY2FzZXMgdGVzdHMgaGF2ZSB0byBiZSB1bmlxdWUgdW5kZXIgdGhlCisgKiBjb3JyZXNwb25kaW5nIHBhcmVudC4gQ2hpbGRyZW4gb2YgYSB0ZXN0IGFyZSB7QGNvZGUgVGVzdFN0ZXB9cy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIFRlc3QgZXh0ZW5kcyBCYXNlRW50aXR5CisJCWltcGxlbWVudHMgRGF0YWJsZSwgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSwgRmlsZXNBdHRhY2hhYmxlLCBUYWdhYmxlLCBTdGF0dXNBdHRhY2hhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIFRlc3RTdGVwfSBjaGlsZCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8VGVzdFN0ZXA+IENISUxEX1RZUEVfVEVTVFNURVAgPSBUZXN0U3RlcC5jbGFzczsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVGVzdChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFVzZXJ9IHdobyBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyB0ZXN0LgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHRoZSBkYXRhIHNvdXJjZSBkb2VzIG5vdCBwcm92aWRlIGFueQorCSAqICAgICAgICAge0Bjb2RlIFVzZXJ9IGVudGl0aWVzIGF0IGFsbCwgd2hpY2ggaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMhCisJICovCisJcHVibGljIE9wdGlvbmFsPFVzZXI+IGdldFJlc3BvbnNpYmxlUGVyc29uKCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFVzZXIuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB7QGxpbmsgVXNlcn0gYXMgdGhlIHJlc3BvbnNpYmxlIHBlcnNvbiBmb3IgdGhpcyB0ZXN0LgorCSAqCisJICogQHBhcmFtIHJlc3BvbnNpYmxlUGVyc29uIFRoZSBuZXcgcmVzcG9uc2libGUgcGVyc29uLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNpYmxlUGVyc29uKFVzZXIgcmVzcG9uc2libGVQZXJzb24pIHsKKwkJZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLnNldChyZXNwb25zaWJsZVBlcnNvbik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29tbWlzc2lvbmVkIHtAbGluayBUZXN0U3RlcH0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHtAY29kZSBUZXN0U3RlcH0uCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBhIHtAY29kZSBUZXN0U3RlcH0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVzdFN0ZXA+IGdldENvbW1pc3Npb25lZFRlc3RTdGVwKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBnZXRDb21taXNzaW9uZWRUZXN0U3RlcHMoKS5zdHJlYW0oKS5maWx0ZXIodHMgLT4gdHMubmFtZUVxdWFscyhuYW1lKSkuZmluZEFueSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIGNvbW1pc3Npb25lZCB7QGxpbmsgVGVzdFN0ZXB9cyByZWxhdGVkIHRvIHRoaXMgdGVzdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8VGVzdFN0ZXA+IGdldENvbW1pc3Npb25lZFRlc3RTdGVwcygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KFRlc3RTdGVwLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBjb21taXNzaW9uZWQge0BsaW5rIFRlc3RTdGVwfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB7QGNvZGUgVGVzdFN0ZXB9IHRoYXQgaGFzIHRvIGJlIHJlbW92ZWQuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIFRlc3RTdGVwfSB3aXRoIGdpdmVuIG5hbWUgaGFzIGJlZW4KKwkgKiAgICAgICAgIHJlbW92ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29tbWlzc2lvbmVkVGVzdFN0ZXAoU3RyaW5nIG5hbWUpIHsKKwkJT3B0aW9uYWw8VGVzdFN0ZXA+IHRlc3RTdGVwID0gZ2V0Q29tbWlzc2lvbmVkVGVzdFN0ZXAobmFtZSk7CisJCWlmICh0ZXN0U3RlcC5pc1ByZXNlbnQoKSkgeworCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUodGVzdFN0ZXAuZ2V0KCkpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVGVzdFN0ZXAuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9UZXN0U3RlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNTRiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVGVzdFN0ZXAuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQmFzZUVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGVzdCBzdGVwIGVudGl0eSB0eXBlLiBBIHRlc3Qgc3RlcCBpcyBhbiBhdG9taWMKKyAqIG1lYXN1cmVtZW50IHRhc2sgYXMgcGFydCBvZiBhIHtAbGluayBUZXN0fS4gVGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMgZG8gbm90CisgKiBjaGFuZ2Ugd2l0aGluIGEgc2luZ2xlIHRlc3Qgc3RlcCwgdGhlcmVmb3JlIGV2ZXJ5IG9yZGVyZWQgdGVzdCBzdGVwIGhhcyB0byBiZQorICogZnVsbHkgZGVzY3JpYmVkLiBJdCBtYXkgaGF2ZSByZWxhdGlvbnMgdG8ge0BsaW5rIENvbnRleHRSb290fXMsIHdoaWNoIGNvbnRhaW4KKyAqIHRoZSBkZXNjcmliaW5nIG9yZGVyIGRhdGEuIFRlc3Qgc3RlcHMgbWF5IGhhdmUgYSBzb3J0IG9yZGVyIGluIHRoZSBjb250ZXh0IG9mCisgKiB0aGVpciBwYXJlbnQge0Bjb2RlIFRlc3R9LCBpbmRpY2F0aW5nIHRoZSBkZXNpcmVkIGV4ZWN1dGlvbiBvcmRlci4gVGhlIG5hbWUKKyAqIG9mIGEgdGVzdCBzdGVwIHNob3VsZCBiZSBjaG9zZW4gaW4gYSBzcGVha2luZyB3YXksIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gdXNlZAorICogaW4gZGlmZmVyZW50IGNvbnRleHRzLCBlLmcuIGFzIGEgbGluayBiZXR3ZWVuIHRoZSBtZWFzdXJlbWVudCBkYXRhIGZyb20gdGhlCisgKiBkZXZpY2UgYW5kIHRoZSBvcmRlciBpbiB0aGUgZGF0YWJhc2UuIEZ1cnRoZXJtb3JlIHRoZSBuYW1lIGhhcyB0byBiZSB1bmlxdWUKKyAqIHVuZGVyIHRoZSBwYXJlbnQge0Bjb2RlIFRlc3R9LiBDaGlsZHJlbiBvZiBhIHRlc3Qgc3RlcCBhcmUKKyAqIHtAbGluayBNZWFzdXJlbWVudH1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgVGVzdFN0ZXAgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgQ29udGV4dERlc2NyaWJhYmxlLCBEYXRhYmxlLCBEZWxldGFibGUsIERlc2NyaWJhYmxlLAorCQlGaWxlc0F0dGFjaGFibGUsIFNvcnRhYmxlLCBTdGF0dXNBdHRhY2hhYmxlLCBUYWdhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIFRlc3R9IHBhcmVudCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8VGVzdD4gUEFSRU5UX1RZUEVfVEVTVCA9IFRlc3QuY2xhc3M7CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIE1lYXN1cmVtZW50fSBjaGlsZCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8TWVhc3VyZW1lbnQ+IENISUxEX1RZUEVfTUVBU1VSRU1FTlQgPSBNZWFzdXJlbWVudC5jbGFzczsKKworCS8qKgorCSAqIFRoZSAnT3B0aW9uYWwnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1BUSU9OQUwgPSAiT3B0aW9uYWwiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlUZXN0U3RlcChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgb3B0aW9uYWwgZmxhZyBvZiB0aGlzIHRlc3Qgc3RlcC4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3B0aW9uYWwgZmxhZy4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc09wdGlvbmFsKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IG9wdGlvbmFsIGZsYWcgZm9yIHRoaXMgdGVzdCBzdGVwLgorCSAqCisJICogQHBhcmFtIG9wdGlvbmFsIFRoZSBuZXcgb3B0aW9uYWwgZmxhZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7CisJCWdldFZhbHVlKEFUVFJfT1BUSU9OQUwpLnNldChvcHRpb25hbCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PENvbnRleHRUeXBlPiBsb2FkQ29udGV4dFR5cGVzKEJhc2VFbnRpdHlNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG1hbmFnZXIubG9hZENvbnRleHRUeXBlcyh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxDb250ZXh0VHlwZSwgQ29udGV4dFJvb3Q+IGxvYWRDb250ZXh0cyhCYXNlRW50aXR5TWFuYWdlciBtYW5hZ2VyLCBDb250ZXh0VHlwZS4uLiBjb250ZXh0VHlwZXMpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJTWFwPENvbnRleHRUeXBlLCBDb250ZXh0Um9vdD4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworCisJCWZvciAoQ29udGV4dFR5cGUgY29udGV4dFR5cGUgOiBjb250ZXh0VHlwZXMpIHsKKwkJCUNvbnRleHRSb290IGMgPSBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KENvbnRleHRSb290LmNsYXNzLCBjb250ZXh0VHlwZSk7CisJCQlpZiAoYyAhPSBudWxsKSB7CisJCQkJbWFwLnB1dChjb250ZXh0VHlwZSwgYyk7CisJCQl9CisJCX0KKwkJaWYgKG1hcC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBtYW5hZ2VyLmxvYWRDb250ZXh0cyh0aGlzLCBjb250ZXh0VHlwZXMpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG1hcDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1R5cGVTcGVjaWZpY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVHlwZVNwZWNpZmljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGU4MjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1R5cGVTcGVjaWZpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKKy8qKgorICogVGhlIHR5cGUgc3BlY2lmaWNhdGlvbiBvZiBtYXNzIGRhdGEgc3RvcmVkIGluIGV4dGVybmFsIGZpbGVzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDaGFubmVsCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlU3BlY2lmaWNhdGlvbiBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWUgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBCT09MRUFOID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCT09MRUFOIiwgMCk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJZVEUgPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIkJZVEUiLCAxKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gU0hPUlQgPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlNIT1JUIiwgMik7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIElOVEVHRVIgPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIklOVEVHRVIiLCAzKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gTE9ORyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiTE9ORyIsIDQpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBGTE9BVCA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiRkxPQVQiLCA1KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gRE9VQkxFID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJET1VCTEUiLCA2KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gU0hPUlRfQkVPID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJTSE9SVF9CRU8iLCA3KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gSU5URUdFUl9CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIklOVEVHRVJfQkVPIiwgOCk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIExPTkdfQkVPID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJMT05HX0JFTyIsIDkpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBGTE9BVF9CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIkZMT0FUX0JFTyIsIDEwKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gRE9VQkxFX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiRE9VQkxFX0JFTyIsIDExKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gU1RSSU5HID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJTVFJJTkciLCAxMik7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJZVEVfU1RSRUFNID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCWVRFX1NUUkVBTSIsIDEzKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gQkxPQiA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQkxPQiIsIDE0KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gQk9PTEVBTl9GTEFHU19CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIkJPT0xFQU5fRkxBR1NfQkVPIiwgMTUpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBCWVRFX0ZMQUdTX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQllURV9GTEFHU19CRU8iLCAxNik7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIFNUUklOR19GTEFHU19CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlNUUklOR19GTEFHU19CRU8iLCAxNyk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJZVEVfU1RSRUFNX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQllURV9TVFJFQU1fQkVPIiwgMTgpOworCisJLy8gU0JZVEUsCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBTSUdORURfQllURSA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiU0lHTkVEX0JZVEUiLCAxOSk7CisKKwkvLyBTQllURV9GTEFHU19CRU8sCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBTSUdORURfQllURV9GTEFHU19CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlNJR05FRF9CWVRFX0ZMQUdTX0JFTyIsIDIwKTsKKworCS8vIFVTSE9SVCwKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIFVOU0lHTkVEX1NIT1JUID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJVTlNJR05FRF9TSE9SVCIsIDIxKTsKKworCS8vIFVTSE9SVF9CRU8sCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBVTlNJR05FRF9TSE9SVF9CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlVOU0lHTkVEX1NIT1JUX0JFTyIsIDIyKTsKKworCS8vIFVJTlRFR0VSLAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gVU5TSUdORURfSU5URUdFUiA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiVU5TSUdORURfSU5URUdFUiIsIDIzKTsKKworCS8vIFVJTlRFR0VSX0JFTywKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIFVOU0lHTkVEX0lOVEVHRVJfQkVPID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJVTlNJR05FRF9JTlRFR0VSX0JFTyIsIDI0KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gU1RSSU5HX1VURjggPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlNUUklOR19VVEY4IiwgMjUpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBTVFJJTkdfVVRGOF9GTEFHU19CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlNUUklOR19VVEY4X0ZMQUdTX0JFTyIsIDI2KTsKKworCS8vIEJJVF9JTlQsCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBCSVRfSU5URUdFUiA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQklUX0lOVEVHRVIiLCAyNyk7CisKKwkvLyBCSVRfSU5UX0JFTywKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJJVF9JTlRFR0VSX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQklUX0lOVEVHRVJfQkVPIiwgMjgpOworCisJLy8gQklUX1VJTlQsCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBCSVRfVU5TSUdORURfSU5URUdFUiA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQklUX1VOU0lHTkVEX0lOVEVHRVIiLCAyOSk7CisKKwkvLyBCSVRfVUlOVF9CRU8sCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBCSVRfVU5TSUdORURfSU5URUdFUl9CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIkJJVF9VTlNJR05FRF9JTlRFR0VSX0JFTyIsCisJCQkzMCk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJJVF9GTE9BVCA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQklUX0ZMT0FUIiwgMzEpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBCSVRfRkxPQVRfQkVPID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCSVRfRkxPQVRfQkVPIiwgMzIpOworCisJcHJpdmF0ZSBUeXBlU3BlY2lmaWNhdGlvbihTdHJpbmcgbmFtZSwgaW50IG9yZGluYWwpIHsKKwkJc3VwZXIobmFtZSwgb3JkaW5hbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1VuaXQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Vbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0ZmQ3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Vbml0LmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB1bml0IGVudGl0eSB0eXBlLiBVbml0cyByZWZlcnJpbmcgdG8gdGhlIHNhbWUKKyAqIHtAbGluayBQaHlzaWNhbERpbWVuc2lvbn0gY2FuIGJlIGNvbnZlcnRlZCB0byBlYWNoIG90aGVyIGJ5IG1lYW5zIG9mIHRoZWlyCisgKiBhdHRyaWJ1dGUgdmFsdWVzICJPZmZzZXQiIGFuZCAiRmFjdG9yIi4gVGhlIG5hbWVzIG9mIHRoZSB1bml0cyBoYXZlIHRvIGJlCisgKiB1bmlxdWUuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBVbml0IGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERhdGFibGUsIERlbGV0YWJsZSwgRGVzY3JpYmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnRmFjdG9yJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBQ1RPUiA9ICJGYWN0b3IiOworCisJLyoqCisJICogVGhlICdPZmZzZXQnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT0ZGU0VUID0gIk9mZnNldCI7CisKKwkvKioKKwkgKiBUaGUgJ0RCJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RCID0gImRCIjsKKworCS8qKgorCSAqIFRoZSAnREJScmVmZXJlbmNlRmFjdG9yJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RCX1JFRkVSRU5DRV9GQUNUT1IgPSAiZEJfcmVmZXJlbmNlX2ZhY3RvciI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVVuaXQoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvciBvZiB0aGlzIHVuaXQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBmYWN0b3IgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIERvdWJsZSBnZXRGYWN0b3IoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0ZBQ1RPUikuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IGZhY3RvciBmb3IgdGhpcyB1bml0LgorCSAqCisJICogQHBhcmFtIGZhY3RvciBUaGUgbmV3IGZhY3Rvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGYWN0b3IoRG91YmxlIGZhY3RvcikgeworCQlnZXRWYWx1ZShBVFRSX0ZBQ1RPUikuc2V0KGZhY3Rvcik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoaXMgdW5pdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG9mZnNldCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgRG91YmxlIGdldE9mZnNldCgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfT0ZGU0VUKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgb2Zmc2V0IGZvciB0aGlzIHVuaXQuCisJICoKKwkgKiBAcGFyYW0gb2Zmc2V0IFRoZSBuZXcgb2Zmc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldE9mZnNldChEb3VibGUgb2Zmc2V0KSB7CisJCWdldFZhbHVlKEFUVFJfT0ZGU0VUKS5zZXQob2Zmc2V0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWNpYmVsIGZsYWcgb2YgdGhpcyB1bml0LiBJZiB0aGUgZmxhZyBpcyB0cnVlLCB0aGVuCisJICoge0BsaW5rICNnZXREQlJlZkZhY3RvcigpfSBzaG91bGQgcmV0dXJuIGEgZmluaXRlIHZhbHVlIGFzIHJldHVybmVkIGJ5CisJICoge0BsaW5rIEZsb2F0I2lzRmluaXRlKGZsb2F0KX0gdGhhdCBpcyBub3QgMC4KKwkgKgorCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHVuaXQgaXMgYSBkZWNpYmVsIHVuaXQuCisJICogQHNlZSAjZ2V0REJSZWZGYWN0b3IoKQorCSAqLworCXB1YmxpYyBCb29sZWFuIGlzREIoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0RCKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yLCB3aGljaCBhbGxvd3MgdG8gY29udmVydCB0aGUgZGVjaWJlbCB2YWx1ZXMgYmFjayBpbnRvCisJICogbGluZWFyIHZhbHVlcy4gSWYgdGhlIGRlY2liZWwgZmxhZyBpcyBzZXQgdG8gZmFsc2UsIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4KKwkgKiAwLCB3aGljaCBpcyBkZXNjcmliZWQgaW4gdGhlIEFTQU0gTlZIIHNwZWNpZmljYXRpb24gKENoYXB0ZXIgMTEsIDEwLjMpLgorCSAqCisJICogQHJldHVybiBUaGUgZGVjaWJlbCByZWZlcmVuY2UgZmFjdG9yIGlzIHJldHVybmVkLgorCSAqIEBzZWUgI2lzREIoKQorCSAqLworCXB1YmxpYyBGbG9hdCBnZXREQlJlZkZhY3RvcigpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfREJfUkVGRVJFTkNFX0ZBQ1RPUikuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIENoYW5nZXMgdGhlIGRlY2liZWwgc3RhdHVzIG9mIHRoaXMgdW5pdC4gVGhlIGRlY2liZWwgZmxhZyBpcyBkZWR1Y2VkIGZyb20KKwkgKiBnaXZlbiByZWZlcmVuY2UgZmFjdG9yLiBJZiB0aGUgcmVmZXJlbmNlIGZhY3RvciBpcyBmaW5pdGUsIGFzIHJldHVybmVkIGJ5CisJICoge0BsaW5rIEZsb2F0I2lzRmluaXRlKGZsb2F0KX0sIGFuZCBub3QgMCwgdGhlbiB0aGUgZGVjaWJlbCBmbGFnIGlzIHNldCB0bworCSAqIHRydWUgYW5kIGdpdmVuIHJlZmVyZW5jZSBmYWN0b3IgaXMgdGFrZW4uIEluIGFueSBvdGhlciBjYXNlIGJvdGgsIHRoZSBkZWNpYmVsCisJICogZmxhZyBhbmQgdGhlIHJlZmVyZW5jZSBmYWN0b3IsIHdpbGwgYmUgcmVzZXQuCisJICoKKwkgKiBAcGFyYW0gZGJSZWZlcmVuY2VGYWN0b3IgVGhlIG5ldyBkZWNpYmVsIHJlZmVyZW5jZSBmYWN0b3IuCisJICovCisJcHVibGljIHZvaWQgc2V0REIoRmxvYXQgZGJSZWZlcmVuY2VGYWN0b3IpIHsKKwkJYm9vbGVhbiBpc1ZhbGlkID0gRmxvYXQuaXNGaW5pdGUoZGJSZWZlcmVuY2VGYWN0b3IpICYmIEZsb2F0LmNvbXBhcmUoTWF0aC5hYnMoZGJSZWZlcmVuY2VGYWN0b3IpLCAwRikgIT0gMDsKKwkJZ2V0VmFsdWUoQVRUUl9EQikuc2V0KGlzVmFsaWQpOworCisJCWlmIChpc1ZhbGlkKSB7CisJCQlnZXRWYWx1ZShBVFRSX0RCX1JFRkVSRU5DRV9GQUNUT1IpLnNldChkYlJlZmVyZW5jZUZhY3Rvcik7CisJCX0gZWxzZSB7CisJCQlnZXRWYWx1ZShBVFRSX0RCX1JFRkVSRU5DRV9GQUNUT1IpLnNldFZhbGlkKGZhbHNlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBQaHlzaWNhbERpbWVuc2lvbn0gb2YgdGhpcyB1bml0LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFBoeXNpY2FsRGltZW5zaW9ufSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUGh5c2ljYWxEaW1lbnNpb24gZ2V0UGh5c2ljYWxEaW1lbnNpb24oKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFBoeXNpY2FsRGltZW5zaW9uLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB7QGxpbmsgUGh5c2ljYWxEaW1lbnNpb259IGZvciB0aGlzIHVuaXQuCisJICoKKwkgKiBAcGFyYW0gcGh5c2ljYWxEaW1lbnNpb24gVGhlIG5ldyB7QGNvZGUgUGh5c2ljYWxEaW1lbnNpb259LgorCSAqLworCXB1YmxpYyB2b2lkIHNldFBoeXNpY2FsRGltZW5zaW9uKFBoeXNpY2FsRGltZW5zaW9uIHBoeXNpY2FsRGltZW5zaW9uKSB7CisJCWdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQocGh5c2ljYWxEaW1lbnNpb24pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1VzZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Vc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjZmYyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Vc2VyLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB1c2VyIGVudGl0eSB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgVXNlciBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZWxldGFibGUsIERlc2NyaWJhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ1N1cm5hbWUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1VSTkFNRSA9ICJTdXJuYW1lIjsKKworCS8qKgorCSAqIFRoZSAnR2l2ZW5OYW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0dJVkVOX05BTUUgPSAiR2l2ZW5OYW1lIjsKKworCS8qKgorCSAqIFRoZSAnRGVwYXJ0bWVudCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERVBBUlRNRU5UID0gIkRlcGFydG1lbnQiOworCisJLyoqCisJICogVGhlICdUZWxlcGhvbmUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUEhPTkUgPSAiVGVsZXBob25lIjsKKworCS8qKgorCSAqIFRoZSAnRU1haWwnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRU1BSUwgPSAiRS1NYWlsIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVXNlcihDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZ2l2ZW4gbmFtZSBvZiB0aGlzIHVzZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBnaXZlbiBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0R2l2ZW5OYW1lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9HSVZFTl9OQU1FKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZ2l2ZW4gbmFtZSBmb3IgdGhpcyB1c2VyLgorCSAqCisJICogQHBhcmFtIGdpdmVuTmFtZSBUaGUgbmV3IGdpdmVuIG5hbWUuCisJICovCisJcHVibGljIHZvaWQgc2V0R2l2ZW5OYW1lKFN0cmluZyBnaXZlbk5hbWUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9HSVZFTl9OQU1FKS5zZXQoZ2l2ZW5OYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdXJuYW1lIG9mIHRoaXMgdXNlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHN1cm5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdXJuYW1lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9TVVJOQU1FKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgc3VybmFtZSBmb3IgdGhpcyB1c2VyLgorCSAqCisJICogQHBhcmFtIHN1cm5hbWUgVGhlIG5ldyBzdXJuYW1lLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFN1cm5hbWUoU3RyaW5nIHN1cm5hbWUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9TVVJOQU1FKS5zZXQoc3VybmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVwYXJ0bWVudCBvZiB0aGlzIHVzZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBkZXBhcnRtZW50IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVwYXJ0bWVudCgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfREVQQVJUTUVOVCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IGRlcGFydG1lbnQgZm9yIHRoaXMgdXNlci4KKwkgKgorCSAqIEBwYXJhbSBkZXBhcnRtZW50IFRoZSBuZXcgZGVwYXJ0bWVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXBhcnRtZW50KFN0cmluZyBkZXBhcnRtZW50KSB7CisJCWdldFZhbHVlKEFUVFJfREVQQVJUTUVOVCkuc2V0KGRlcGFydG1lbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBob25lIG51bWJlciBvZiB0aGlzIHVzZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwaG9uZSBudW1iZXIgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRQaG9uZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfUEhPTkUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBwaG9uZSBudW1iZXIgZm9yIHRoaXMgdXNlci4KKwkgKgorCSAqIEBwYXJhbSBwaG9uZSBUaGUgbmV3IHBob25lIG51bWJlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQaG9uZShTdHJpbmcgcGhvbmUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9QSE9ORSkuc2V0KHBob25lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBlLW1haWwgYWRkcmVzcyBvZiB0aGlzIHVzZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBlLW1haWwgYWRkcmVzcyBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1haWwoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0VNQUlMKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZS1tYWlsIGFkZHJlc3MgZm9yIHRoaXMgdXNlci4KKwkgKgorCSAqIEBwYXJhbSBlTWFpbCBUaGUgbmV3IGUtbWFpbCBhZGRyZXNzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1haWwoU3RyaW5nIGVNYWlsKSB7CisJCWdldFZhbHVlKEFUVFJfRU1BSUwpLnNldChlTWFpbCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVmFsdWUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2FlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVmFsdWUuamF2YQpAQCAtMCwwICsxLDQ0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbS5yYW5nZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogR2VuZXJpYyB2YWx1ZSBjb250YWluZXIuIFRoaXMgdmFsdWUgY29udGFpbmVyIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIGl0cworICoge0BsaW5rIFZhbHVlVHlwZX0uIEl0IGFsbG93cyBvbmx5IHRvIHN0b3JlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB2YWx1ZXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBWYWx1ZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRlVGltZUZvcm1hdHRlciBMT0NBTF9EQVRFX1RJTUVfRk9STUFUVEVSID0gRGF0ZVRpbWVGb3JtYXR0ZXIub2ZQYXR0ZXJuKCJ5eXl5TU1kZEhIbW1zcyIpOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIFZhbHVlVHlwZTw/PiB2YWx1ZVR5cGU7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB1bml0OworCisJcHJpdmF0ZSBib29sZWFuIGluaXRpYWxWYWxpZDsKKwlwcml2YXRlIE9iamVjdCBpbml0aWFsVmFsdWU7CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWQ7CisJcHJpdmF0ZSBPYmplY3QgdmFsdWU7CisKKwlwcml2YXRlIGZpbmFsIENsYXNzPD8+IHZhbHVlQ2xhc3M7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWVUeXBlRGVzY3I7CisJcHJpdmF0ZSBmaW5hbCBPYmplY3QgZGVmYXVsdFZhbHVlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHZhbHVlVHlwZSAgICBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgVmFsdWVUeXBlfS4KKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgIFRoZSBuYW1lIG9mIHRoaXMgY29udGFpbmVyLgorCSAqIEBwYXJhbSB1bml0ICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHVuaXQuCisJICogQHBhcmFtIHZhbGlkICAgICAgICBUaGUgaW5pdGlhbCB2YWxpZGl0eSBmbGFnLgorCSAqIEBwYXJhbSB2YWx1ZSAgICAgICAgVGhlIGluaXRpYWwgdmFsdWUuCisJICogQHBhcmFtIHZhbHVlQ2xhc3MgICBVc2VkIGZvciB0eXBlIGNoZWNraW5nIHVwb24gYXNzaWdubWVudC4KKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFVzZWQgYXMgbnVsbCByZXBsYWNlbWVudC4KKwkgKi8KKwlWYWx1ZShWYWx1ZVR5cGU8Pz4gdmFsdWVUeXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVuaXQsIGJvb2xlYW4gdmFsaWQsIE9iamVjdCB2YWx1ZSwgQ2xhc3M8Pz4gdmFsdWVDbGFzcywKKwkJCU9iamVjdCBkZWZhdWx0VmFsdWUsIFN0cmluZyB2YWx1ZVR5cGVEZXNjcikgeworCQl0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKKwkJdGhpcy52YWx1ZVR5cGVEZXNjciA9IHZhbHVlVHlwZURlc2NyOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnVuaXQgPSB1bml0ID09IG51bGwgPyAiIiA6IHVuaXQ7CisKKwkJdGhpcy52YWx1ZUNsYXNzID0gdmFsdWVDbGFzczsKKwkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CisKKwkJLy8gc2V0IGluaXRpYWwgdmFsdWUKKwkJc2V0KHZhbHVlKTsKKwkJLy8gb3ZlcndyaXRlIGluaXRpYWwgdmFsaWRpdHkgZmxhZworCQlzZXRWYWxpZCh2YWxpZCk7CisKKwkJLy8gcHJlc2VydmUgaW5pdGlhbCB2YWx1ZXMKKwkJaW5pdGlhbFZhbGlkID0gaXNWYWxpZCgpOworCQlpbml0aWFsVmFsdWUgPSBjb3B5KGV4dHJhY3QoKSk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gb3JpZ2luIFRoZSBvcmlnaW4ge0BsaW5rIFZhbHVlfS4KKwkgKiBAcGFyYW0gaW5wdXQgIFRoZSBuZXcgdmFsdWUuCisJICovCisJcHJpdmF0ZSBWYWx1ZShWYWx1ZSBvcmlnaW4sIE9iamVjdCBpbnB1dCkgeworCQl0aGlzKG9yaWdpbi52YWx1ZVR5cGUsIG9yaWdpbi5uYW1lLCBvcmlnaW4udW5pdCwgb3JpZ2luLnZhbGlkLCBpbnB1dCwgb3JpZ2luLnZhbHVlQ2xhc3MsIG9yaWdpbi5kZWZhdWx0VmFsdWUsCisJCQkJb3JpZ2luLnZhbHVlVHlwZURlc2NyKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgdmFsdWUgY29udGFpbmVyLgorCSAqCisJICogQHJldHVybiBUaGlzIHZhbHVlIGNvbnRhaW5lcidzIG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmFsdWVUeXBlfSB0aGlzIHZhbHVlIGNvbnRhaW5lciBpcyBhc3NvY2lhdGVkIHdpdGguCisJICoKKwkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIHtAY29kZSBWYWx1ZVR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBWYWx1ZVR5cGU8Pz4gZ2V0VmFsdWVUeXBlKCkgeworCQlyZXR1cm4gdmFsdWVUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHVuaXQgbmFtZSBvZiB0aGlzIHZhbHVlIGNvbnRhaW5lci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHVuaXQgbmFtZSBvZiB0aGlzIHZhbHVlIGNvbnRhaW5lciBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVuaXQoKSB7CisJCXJldHVybiB1bml0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbGlkaXR5IGZsYWcgb2YgdGhpcyB2YWx1ZSBjb250YWluZXIuCisJICoKKwkgKiBAcmV0dXJuIFRydWUsIGlmIHRoZSBzdG9yZWQgdmFsdWUgaXMgbWFya2VkIHRvIGJlIHZhbGlkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CisJCU9iamVjdCB2ID0gZXh0cmFjdCgpOworCisJCWlmICh2ICE9IG51bGwpIHsKKwkJCWlmICh2LmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisJCQkJcmV0dXJuIHZhbGlkICYmIEFycmF5LmdldExlbmd0aCh2KSA+IDA7CisJCQl9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlyZXR1cm4gdmFsaWQgJiYgISgoU3RyaW5nKSB2KS5pc0VtcHR5KCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdmFsaWQgJiYgdiAhPSBudWxsOworCX0KKworCS8qKgorCSAqIE92ZXJ3cml0ZXMgdmFsaWRpdHkgZmxhZyB3aXRoIGdpdmVuIGZsYWcuCisJICoKKwkgKiBAcGFyYW0gdmFsaWQgVGhlIG5ldyB2YWxpZGl0eSBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbGlkKGJvb2xlYW4gdmFsaWQpIHsKKwkJdGhpcy52YWxpZCA9IHZhbGlkOworCX0KKworCS8qKgorCSAqIFJldHVybnMgY3VycmVudGx5IHN0b3JlZCB2YWx1ZSBvZiB0aGlzIHZhbHVlIGNvbnRhaW5lci4KKwkgKgorCSAqIEBwYXJhbSA8VD4gIFRoZSBleHBlY3RlZCB2YWx1ZSB0eXBlLgorCSAqIEBwYXJhbSB0eXBlIFRoZSB7QGxpbmsgVmFsdWVUeXBlfS4KKwkgKiBAcmV0dXJuIEN1cnJlbnRseSBzdG9yZWQgdmFsdWUgaXMgcmV0dXJuZWQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIDxUPiBUIGV4dHJhY3QoVmFsdWVUeXBlPFQ+IHR5cGUpIHsKKwkJcmV0dXJuIChUKSB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGN1cnJlbnRseSBzdG9yZWQgdmFsdWUgb2YgdGhpcyB2YWx1ZSBjb250YWluZXIuCisJICoKKwkgKiBAcGFyYW0gPFQ+IFRoZSBleHBlY3RlZCB2YWx1ZSB0eXBlLgorCSAqIEByZXR1cm4gQ3VycmVudGx5IHN0b3JlZCB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQ+IFQgZXh0cmFjdCgpIHsKKwkJcmV0dXJuIChUKSB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50bHkgc3RvcmVkIHZhbHVlIHdpdGggdGhlIGdpdmVuIG9uZS4gSWYge0Bjb2RlIG51bGx9IGlzIGdpdmVuLAorCSAqIHRoZW4gYSB3ZWxsIGRlZmluZWQgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkIGluc3RlYWQgYW5kIHRoZSB2YWxpZGl0eSBmbGFnIGlzCisJICogYXV0b21hdGljYWxseSBzZXQgdG8ge0Bjb2RlIGZhbHNlfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUgbmV3IHZhbHVlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIHR5cGUgZGVmaW5lZCBpbgorCSAqICAgICAgICAgICAgICB7QGxpbmsgVmFsdWVUeXBlI3R5cGV9IG9yIGluIGNhc2Ugb2YgYW4gZW51bWVyYXRpb24gdHlwZSBhbgorCSAqICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBlbnVtZXJhdGlvbiBjb25zdGFudCBvciBhcnJheSB0aGVyZW9mLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBhbiBpbmNvbXBhdGlibGUgdmFsdWUgaXMgZ2l2ZW4uCisJICovCisJcHVibGljIHZvaWQgc2V0KE9iamVjdCBpbnB1dCkgeworCQlpZiAoaW5wdXQgPT0gbnVsbCkgeworCQkJdmFsdWUgPSBkZWZhdWx0VmFsdWU7CisJCQlzZXRWYWxpZChmYWxzZSk7CisJCX0gZWxzZSBpZiAodmFsdWVDbGFzcy5pc0luc3RhbmNlKGlucHV0KSkgeworCQkJdmFsdWUgPSBpbnB1dDsKKwkJCXNldFZhbGlkKHRydWUpOworCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRW51bWVyYXRpb25WYWx1ZSkgeworCQkJc2V0Rm9yRW51bWVyYXRpb25WYWx1ZShpbnB1dCk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbmNvbXBhdGlibGUgdmFsdWUgdHlwZSAnIiArIGlucHV0LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpCisJCQkJCSsgIicgcGFzc2VkLCBleHBlY3RlZCAnIiArIHZhbHVlQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIicuIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBNZXJnZXMgZ2l2ZW4gdmFsdWUgY29udGFpbmVyIHdpdGggdGhpcyBpbnN0YW5jZS4gVG8gYmUgYWJsZSB0byBkbyBzbywgdGhlCisJICogZ2l2ZW4gdmFsdWUgY29udGFpbmVyIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgb25lLiBWYWx1ZSBjb250YWluZXJzIGFyZQorCSAqIGNvbXBhdGlibGUgaWYgdGhlIHRoZWlyIG5hbWUsIHVuaXQgYW5kIHtAbGluayBWYWx1ZVR5cGV9IGlzIGVxdWFsLiBJZiB0aGUKKwkgKiBzdG9yZWQgdmFsdWVzIG9yIHRoZSB2YWxpZGl0eSBmbGFncyBkbyBub3QgbWF0Y2gsIHRoZW4gYm90aCB2YWx1ZXMgYXJlCisJICogZGlzY2FyZGVkIGFuZCB7QGNvZGUgbnVsbH0gaXMgdGFrZW4gYXMgdGhlIGluaXRpYWwgdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGNvbnRhaW5lciB0aGF0IHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhpcyBpbnN0YW5jZS4KKwkgKiBAcmV0dXJuIEEgbmV3IHZhbHVlIGNvbnRhaW5lciB3aXRoIG1lcmdlZCB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdmFsdWUgY29udGFpbmVyIGlzIG5vdAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUuCisJICovCisJcHVibGljIFZhbHVlIG1lcmdlKFZhbHVlIHZhbHVlKSB7CisJCWJvb2xlYW4gbmFtZU1pc3NtYXRjaCA9ICFnZXROYW1lKCkuZXF1YWxzKHZhbHVlLmdldE5hbWUoKSk7CisJCWJvb2xlYW4gdW5pdE1pc3NtYXRjaCA9ICFnZXRVbml0KCkuZXF1YWxzKHZhbHVlLmdldFVuaXQoKSk7CisJCWJvb2xlYW4gdHlwZU1pc3NtYXRjaCA9ICFnZXRWYWx1ZVR5cGUoKS5lcXVhbHModmFsdWUuZ2V0VmFsdWVUeXBlKCkpOworCQlpZiAobmFtZU1pc3NtYXRjaCB8fCB1bml0TWlzc21hdGNoIHx8IHR5cGVNaXNzbWF0Y2gpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBtZXJnZSwgaW5jb21wYXRpYmxlIHZhbHVlIHBhc3NlZC4iKTsKKwkJfQorCisJCWJvb2xlYW4gZXF1YWxWYWx1ZSA9IE9iamVjdHMuZGVlcEVxdWFscyhleHRyYWN0KCksIHZhbHVlLmV4dHJhY3QoKSk7CisJCWJvb2xlYW4gYm90aFZhbGlkID0gaXNWYWxpZCgpICYmIHZhbHVlLmlzVmFsaWQoKTsKKwkJcmV0dXJuIG5ldyBWYWx1ZSh0aGlzLCBlcXVhbFZhbHVlICYmIGJvdGhWYWxpZCA/IGV4dHJhY3QoKSA6IG51bGwpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisJCWlmIChvdGhlciA9PSB0aGlzKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFZhbHVlKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJVmFsdWUgdmFsID0gKFZhbHVlKSBvdGhlcjsKKworCQlyZXR1cm4gT2JqZWN0cy5lcXVhbHModGhpcy52YWx1ZVR5cGUsIHZhbC52YWx1ZVR5cGUpICYmIE9iamVjdHMuZXF1YWxzKHRoaXMubmFtZSwgdmFsLm5hbWUpCisJCQkJJiYgT2JqZWN0cy5lcXVhbHModGhpcy51bml0LCB2YWwudW5pdCkgJiYgT2JqZWN0cy5lcXVhbHModGhpcy5pbml0aWFsVmFsaWQsIHZhbC5pbml0aWFsVmFsaWQpCisJCQkJJiYgT2JqZWN0cy5kZWVwRXF1YWxzKHRoaXMuaW5pdGlhbFZhbHVlLCB2YWwuaW5pdGlhbFZhbHVlKSAmJiBPYmplY3RzLmVxdWFscyh0aGlzLnZhbGlkLCB2YWwudmFsaWQpCisJCQkJJiYgT2JqZWN0cy5kZWVwRXF1YWxzKHRoaXMudmFsdWUsIHZhbC52YWx1ZSkgJiYgT2JqZWN0cy5lcXVhbHModGhpcy52YWx1ZUNsYXNzLCB2YWwudmFsdWVDbGFzcykKKwkJCQkmJiBPYmplY3RzLmVxdWFscyh0aGlzLnZhbHVlVHlwZURlc2NyLCB2YWwudmFsdWVUeXBlRGVzY3IpCisJCQkJJiYgT2JqZWN0cy5lcXVhbHModGhpcy5kZWZhdWx0VmFsdWUsIHZhbC5kZWZhdWx0VmFsdWUpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIE9iamVjdHMuaGFzaCh2YWx1ZVR5cGUsIG5hbWUsIHVuaXQsIGluaXRpYWxWYWxpZCwgaW5pdGlhbFZhbHVlLCB2YWxpZCwgdmFsdWUsIHZhbHVlQ2xhc3MsIHZhbHVlVHlwZURlc2NyLAorCQkJCWRlZmF1bHRWYWx1ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmFsdWUuIEluIGNhc2UKKwkgKiBvZiBhIHNlcXVlbmNlIHZhbHVlIGNvbnRhaW5lciB3aXRoIHVwIHRvIDEwIHZhbHVlcyB0aGUgY29tcGxldGUgc2VxdWVuY2Ugd2lsbAorCSAqIGJlIHByaW50ZWQuIE90aGVyd2lzZSBvbmx5IHRoZSA1IGZpcnN0IGFuZCBsYXN0IHZhbHVlcyB3aWxsIGJlIHByaW50ZWQuIElmCisJICogdGhlIGNvbnRhaW5lZCB2YWx1ZSBpcyBtYXJrZWQgYXMgbm90IHZhbGlkLCB0aGVuIHRoZSBjb250YWluZWQgdmFsdWUgaXMKKwkgKiBvbWl0dGVkIGluIHRoZSByZXByZXNlbnRhdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmFsdWUuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG5hbWUpLmFwcGVuZCgiID0gIik7CisKKwkJaWYgKGlzVmFsaWQoKSkgeworCQkJT2JqZWN0IHYgPSBleHRyYWN0KCk7CisJCQlpZiAodiAhPSBudWxsICYmIHYuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKwkJCQlpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKHYpOworCQkJCXNiLmFwcGVuZCgnWycpOworCisJCQkJaWYgKGxlbmd0aCA+IDEwKSB7CisJCQkJCXNiLmFwcGVuZChyYW5nZSgwLCA1KS5tYXBUb09iaihpIC0+IHJlYWRBdCh2LCBpKSkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKwkJCQkJc2IuYXBwZW5kKCIsIC4uLiwgIik7CisJCQkJCXNiLmFwcGVuZChyYW5nZShsZW5ndGggLSA1LCBsZW5ndGgpLm1hcFRvT2JqKGkgLT4gcmVhZEF0KHYsIGkpKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCQkJCX0gZWxzZSB7CisJCQkJCXNiLmFwcGVuZChyYW5nZSgwLCBsZW5ndGgpLm1hcFRvT2JqKGkgLT4gcmVhZEF0KHYsIGkpKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCQkJCX0KKwkJCQlzYi5hcHBlbmQoJ10nKTsKKwkJCX0gZWxzZSB7CisJCQkJc2IuYXBwZW5kKHYpOworCQkJfQorCQl9CisKKwkJaWYgKCFnZXRVbml0KCkuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiBbIikuYXBwZW5kKGdldFVuaXQoKSkuYXBwZW5kKCddJyk7CisJCX0KKworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBlaXRoZXIgdGhlIHZhbGlkaXR5IGZsYWcgb3IgdGhlIHZhbHVlIGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZQorCSAqIGluaXRpYWxpemF0aW9uLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBlaXRoZXIgaWYgdGhlIGZsYWcgb3IgdGhlIHZhbHVlIGhhcyBiZWVuCisJICogICAgICAgICBtb2RpZmllZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgeworCQlyZXR1cm4gd2FzVmFsaWQoKSAhPSBpc1ZhbGlkKCkgfHwgIU9iamVjdHMuZGVlcEVxdWFscyhleHRyYWN0SW5pdGlhbCgpLCBleHRyYWN0KCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGluaXRpYWwgdmFsaWRpdHkgZmxhZy4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHZhbHVlIHdhcyBpbml0aWFsbHkgbWFya2VkIGFzIHZhbGlkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHdhc1ZhbGlkKCkgeworCQlyZXR1cm4gaW5pdGlhbFZhbGlkOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGluaXRpYWwgdmFsdWUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBpbml0aWFsIHZhbHVlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBPYmplY3QgZXh0cmFjdEluaXRpYWwoKSB7CisJCXJldHVybiBpbml0aWFsVmFsdWU7CisJfQorCisJLyoqCisJICogT3ZlcndyaXRlcyB0aGUgaW5pdGlhbCB2YWxpZGl0eSBmbGFnIGFuZCB2YWx1ZSB3aXRoIHRoZSBjdXJyZW50IG9uZXMuCisJICovCisJcHVibGljIHZvaWQgYXBwbHkoKSB7CisJCWluaXRpYWxWYWxpZCA9IGlzVmFsaWQoKTsKKwkJaW5pdGlhbFZhbHVlID0gY29weShleHRyYWN0KCkpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQYWNrYWdlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGNvZGUgU3RyaW5nfSB2YWx1ZSBmcm9tIGdpdmVuIGFycmF5IGF0IGdpdmVuIHBvc2l0aW9uLgorCSAqCisJICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB7QGNvZGUgT2JqZWN0fS4KKwkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZXF1aXJlZCB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgU3RyaW5nfSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIHZhbHVlIGlzIHJldHVybmVkLgorCSAqLworCXN0YXRpYyBTdHJpbmcgcmVhZEF0KE9iamVjdCBhcnJheSwgaW50IGluZGV4KSB7CisJCU9iamVjdCB2YWx1ZSA9IEFycmF5LmdldChhcnJheSwgaW5kZXgpOworCQlpZiAodmFsdWUgIT0gbnVsbCAmJiBieXRlW10uY2xhc3MuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKKwkJCXJldHVybiBBcnJheXMudG9TdHJpbmcoKGJ5dGVbXSkgdmFsdWUpOworCQl9CisKKwkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IFN0cmluZy52YWx1ZU9mKHZhbHVlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyBhIGNvcHkgb2YgZ2l2ZW4ge0Bjb2RlIE9iamVjdH0sIHNvIG1vZGlmaWNhdGlvbnMgaW4gb25lIGRvIG5vdCBhZmZlY3QKKwkgKiB0byBvdGhlci4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgb2JqZWN0IHdoaWNoIHdpbGwgYmUgY29waWVkLgorCSAqIEByZXR1cm4gVGhlIGNvcHkgaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNvcHkoT2JqZWN0IHZhbHVlKSB7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUNsYXNzPD8+IHZhbHVlQ2xhc3MgPSB2YWx1ZS5nZXRDbGFzcygpOworCQlpZiAodmFsdWVDbGFzcy5pc0FycmF5KCkgJiYgQXJyYXkuZ2V0TGVuZ3RoKHZhbHVlKSA+IDApIHsKKwkJCXJldHVybiBjcmVhdGVEZWVwQ29weSh2YWx1ZSwgdmFsdWVDbGFzcyk7CisJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlTGluaykgeworCQkJcmV0dXJuIG5ldyBGaWxlTGluaygoRmlsZUxpbmspIHZhbHVlKTsKKwkJfQorCisJCS8vIHNpbXBsZSBpbW11dGFibGUgdmFsdWUKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnRseSBzdG9yZWQgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gb25lLgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSBuZXcgdmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgZW51bWVyYXRpb24gdHlwZSBhbgorCSAqICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBlbnVtZXJhdGlvbiBjb25zdGFudC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgYW4gaW5jb21wYXRpYmxlIHZhbHVlIGlzIGdpdmVuLgorCSAqLworCXByaXZhdGUgdm9pZCBzZXRGb3JFbnVtZXJhdGlvblZhbHVlKE9iamVjdCBpbnB1dCkgeworCQlTdHJpbmcgaW5wdmFsdWVUeXBlRGVzY3IgPSAoKEVudW1lcmF0aW9uVmFsdWUpIGlucHV0KS5nZXRPd25lcigpLmdldE5hbWUoKTsKKwkJaWYgKGlucHZhbHVlVHlwZURlc2NyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJFbnVtZXJhdGlvblZhbHVlIHZhbHVlIGRlc2NyaXB0aW9uIG9mIGlucHV0IHZhbHVlIG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQiKTsKKwkJfQorCQlpZiAodmFsdWVUeXBlRGVzY3IgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIkVudW1lcmF0aW9uVmFsdWUgdmFsdWUgZGVzY3JpcHRpb24gbm90IGNvcnJlY3RseSBpbml0aWFsaXplZCBnb3QgbnVsbCwgJyIgKyAiJyBleHBlY3RlZCAnIgorCQkJCQkJCSsgdmFsdWVDbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiJy4iKTsKKwkJfQorCisJCWlmICh2YWx1ZVR5cGVEZXNjci5lcXVhbHMoaW5wdmFsdWVUeXBlRGVzY3IpKSB7CisJCQl2YWx1ZSA9IGlucHV0OworCQkJc2V0VmFsaWQodHJ1ZSk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbmNvbXBhdGlibGUgdmFsdWUgdHlwZSBkZXNjcmlwdGlvbiciICsgaW5wdmFsdWVUeXBlRGVzY3IKKwkJCQkJKyAiJyBwYXNzZWQsIGV4cGVjdGVkICciICsgdmFsdWVUeXBlRGVzY3IgKyAiJy4iKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgZ2l2ZW4ge0Bjb2RlIE9iamVjdH0sIHNvIG1vZGlmaWNhdGlvbnMgaW4gb25lIGRvIG5vdAorCSAqIGFmZmVjdCB0byBvdGhlci4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSAgICAgIFRoZSBvYmplY3Qgd2hpY2ggd2lsbCBiZSBjb3BpZWQuCisJICogQHBhcmFtIHZhbHVlQ2xhc3MgVGhlIGNsYXNzIG9mIHRoZSB2YWx1ZSBvYmplY3QuCisJICogQHJldHVybiBUaGUgY29weSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBPYmplY3QgY3JlYXRlRGVlcENvcHkoT2JqZWN0IHZhbHVlLCBDbGFzczw/PiB2YWx1ZUNsYXNzKSB7CisJCWludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgodmFsdWUpOworCisJCWlmICh2YWx1ZUNsYXNzLmdldENvbXBvbmVudFR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7CisJCQlPYmplY3QgY29weSA9IEFycmF5Lm5ld0luc3RhbmNlKHZhbHVlQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLCBsZW5ndGgpOworCQkJU3lzdGVtLmFycmF5Y29weSh2YWx1ZSwgMCwgY29weSwgMCwgbGVuZ3RoKTsKKwkJCXJldHVybiBjb3B5OworCQl9IGVsc2UgeworCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdW10pIHsKKwkJCQlyZXR1cm4gQXJyYXlzLnN0cmVhbSgoYnl0ZVtdW10pIHZhbHVlKS5tYXAodiAtPiB2LmNsb25lKCkpLnRvQXJyYXkoYnl0ZVtdW106Om5ldyk7CisJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpbmtbXSkgeworCQkJCXJldHVybiBBcnJheXMuc3RyZWFtKChGaWxlTGlua1tdKSB2YWx1ZSkubWFwKEZpbGVMaW5rOjpuZXcpLnRvQXJyYXkoRmlsZUxpbmtbXTo6bmV3KTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEFycmF5cy5jb3B5T2YoKE9iamVjdFtdKSB2YWx1ZSwgbGVuZ3RoKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WYWx1ZVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WYWx1ZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWRiNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1ZhbHVlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTAzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworCisvKioKKyAqIFZhbHVlIHR5cGUgZW51bWVyYXRpb24gaXMgYSB7QGxpbmsgVmFsdWV9IGZhY3RvcnkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBWYWx1ZVR5cGU8VD4gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlIHsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBTdHJpbmd9IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBTdHJpbmd9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPFN0cmluZz4gU1RSSU5HID0gbmV3IFZhbHVlVHlwZTw+KFN0cmluZy5jbGFzcywgIlNUUklORyIsICIiKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBTdHJpbmdbXX0gdmFsdWUgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhbiBlbXB0eSB7QGNvZGUgU3RyaW5nfSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxTdHJpbmdbXT4gU1RSSU5HX1NFUVVFTkNFID0gbmV3IFZhbHVlVHlwZTw+KFN0cmluZ1tdLmNsYXNzLCAiU1RSSU5HX1NFUVVFTkNFIiwKKwkJCW5ldyBTdHJpbmdbMF0pOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0BsaW5rIExvY2FsRGF0ZVRpbWV9IHZhbHVlIGFuZAorCSAqIGRvZXMgbm90IHJlcGxhY2Uge0Bjb2RlIG51bGx9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPExvY2FsRGF0ZVRpbWU+IERBVEUgPSBuZXcgVmFsdWVUeXBlPD4oTG9jYWxEYXRlVGltZS5jbGFzcywgIkRBVEUiLCBudWxsKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBMb2NhbERhdGVUaW1lW119IHZhbHVlIGFuZAorCSAqIHJlcGxhY2VzIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBMb2NhbERhdGVUaW1lfSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxMb2NhbERhdGVUaW1lW10+IERBVEVfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oTG9jYWxEYXRlVGltZVtdLmNsYXNzLAorCQkJIkRBVEVfU0VRVUVOQ0UiLCBuZXcgTG9jYWxEYXRlVGltZVswXSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGxpbmsgQm9vbGVhbn0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGgge0BsaW5rIEJvb2xlYW4jRkFMU0V9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPEJvb2xlYW4+IEJPT0xFQU4gPSBuZXcgVmFsdWVUeXBlPD4oQm9vbGVhbi5jbGFzcywgIkJPT0xFQU4iLCBCb29sZWFuLkZBTFNFKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBib29sZWFuW119IHZhbHVlIGFuZAorCSAqIHJlcGxhY2VzIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBib29sZWFufSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxib29sZWFuW10+IEJPT0xFQU5fU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oYm9vbGVhbltdLmNsYXNzLCAiQk9PTEVBTl9TRVFVRU5DRSIsCisJCQluZXcgYm9vbGVhblswXSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGxpbmsgQnl0ZX0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYSB7QGNvZGUgQnl0ZX0gY29udGFpbmluZyB6ZXJvLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPEJ5dGU+IEJZVEUgPSBuZXcgVmFsdWVUeXBlPD4oQnl0ZS5jbGFzcywgIkJZVEUiLCBCeXRlLnZhbHVlT2YoKGJ5dGUpIDApKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBieXRlW119IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBieXRlfSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxieXRlW10+IEJZVEVfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oYnl0ZVtdLmNsYXNzLCAiQllURV9TRVFVRU5DRSIsIG5ldyBieXRlWzBdKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAbGluayBTaG9ydH0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYSB7QGNvZGUgU2hvcnR9IGNvbnRhaW5pbmcgemVyby4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxTaG9ydD4gU0hPUlQgPSBuZXcgVmFsdWVUeXBlPD4oU2hvcnQuY2xhc3MsICJTSE9SVCIsIFNob3J0LnZhbHVlT2YoKHNob3J0KSAwKSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGNvZGUgc2hvcnRbXX0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIHNob3J0fSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxzaG9ydFtdPiBTSE9SVF9TRVFVRU5DRSA9IG5ldyBWYWx1ZVR5cGU8PihzaG9ydFtdLmNsYXNzLCAiU0hPUlRfU0VRVUVOQ0UiLAorCQkJbmV3IHNob3J0WzBdKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAbGluayBJbnRlZ2VyfSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhIHtAY29kZSBJbnRlZ2VyfSBjb250YWluaW5nIHplcm8uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8SW50ZWdlcj4gSU5URUdFUiA9IG5ldyBWYWx1ZVR5cGU8PihJbnRlZ2VyLmNsYXNzLCAiSU5URUdFUiIsIEludGVnZXIudmFsdWVPZigwKSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGNvZGUgaW50W119IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBpbnR9IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPGludFtdPiBJTlRFR0VSX1NFUVVFTkNFID0gbmV3IFZhbHVlVHlwZTw+KGludFtdLmNsYXNzLCAiSU5URUdFUl9TRVFVRU5DRSIsCisJCQluZXcgaW50WzBdKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAbGluayBMb25nfSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhIHtAY29kZSBMb25nfSBjb250YWluaW5nIHplcm8uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8TG9uZz4gTE9ORyA9IG5ldyBWYWx1ZVR5cGU8PihMb25nLmNsYXNzLCAiTE9ORyIsIExvbmcudmFsdWVPZigwKSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGNvZGUgbG9uZ1tdfSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhbiBlbXB0eSB7QGNvZGUgbG9uZ30gYXJyYXkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8bG9uZ1tdPiBMT05HX1NFUVVFTkNFID0gbmV3IFZhbHVlVHlwZTw+KGxvbmdbXS5jbGFzcywgIkxPTkdfU0VRVUVOQ0UiLCBuZXcgbG9uZ1swXSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGxpbmsgRmxvYXR9IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGEge0Bjb2RlIEZsb2F0fSBjb250YWluaW5nIHplcm8uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8RmxvYXQ+IEZMT0FUID0gbmV3IFZhbHVlVHlwZTw+KEZsb2F0LmNsYXNzLCAiRkxPQVQiLCBGbG9hdC52YWx1ZU9mKDApKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBmbG9hdFtdfSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhbiBlbXB0eSB7QGNvZGUgZmxvYXR9IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPGZsb2F0W10+IEZMT0FUX1NFUVVFTkNFID0gbmV3IFZhbHVlVHlwZTw+KGZsb2F0W10uY2xhc3MsICJGTE9BVF9TRVFVRU5DRSIsCisJCQluZXcgZmxvYXRbMF0pOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0BsaW5rIERvdWJsZX0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYSB7QGNvZGUgRG91YmxlfSBjb250YWluaW5nIHplcm8uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8RG91YmxlPiBET1VCTEUgPSBuZXcgVmFsdWVUeXBlPD4oRG91YmxlLmNsYXNzLCAiRE9VQkxFIiwgRG91YmxlLnZhbHVlT2YoMCkpOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0Bjb2RlIGRvdWJsZVtdfSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhbiBlbXB0eSB7QGNvZGUgZG91YmxlfSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxkb3VibGVbXT4gRE9VQkxFX1NFUVVFTkNFID0gbmV3IFZhbHVlVHlwZTw+KGRvdWJsZVtdLmNsYXNzLCAiRE9VQkxFX1NFUVVFTkNFIiwKKwkJCW5ldyBkb3VibGVbMF0pOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0Bjb2RlIGJ5dGVbXX0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIGJ5dGV9IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPGJ5dGVbXT4gQllURV9TVFJFQU0gPSBuZXcgVmFsdWVUeXBlPD4oYnl0ZVtdLmNsYXNzLCAiQllURV9TVFJFQU0iLCBuZXcgYnl0ZVswXSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGNvZGUgYnl0ZVtdW119IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBieXRlW11bXX0gYXJyYXkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8Ynl0ZVtdW10+IEJZVEVfU1RSRUFNX1NFUVVFTkNFID0gbmV3IFZhbHVlVHlwZTw+KGJ5dGVbXVtdLmNsYXNzLAorCQkJIkJZVEVfU1RSRUFNX1NFUVVFTkNFIiwgbmV3IGJ5dGVbMF1bXSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGxpbmsgRmxvYXRDb21wbGV4fSB2YWx1ZSBhbmQgZG9lcworCSAqIG5vdCByZXBsYWNlcyB7QGNvZGUgbnVsbH0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8RmxvYXRDb21wbGV4PiBGTE9BVF9DT01QTEVYID0gbmV3IFZhbHVlVHlwZTw+KEZsb2F0Q29tcGxleC5jbGFzcywgIkZMT0FUX0NPTVBMRVgiLAorCQkJbnVsbCk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGNvZGUgRmxvYXRDb21wbGV4W119IHZhbHVlIGFuZAorCSAqIHJlcGxhY2VzIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBGbG9hdENvbXBsZXhbXX0gYXJyYXkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8RmxvYXRDb21wbGV4W10+IEZMT0FUX0NPTVBMRVhfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oRmxvYXRDb21wbGV4W10uY2xhc3MsCisJCQkiRkxPQVRfQ09NUExFWF9TRVFVRU5DRSIsIG5ldyBGbG9hdENvbXBsZXhbMF0pOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0BsaW5rIERvdWJsZUNvbXBsZXh9IHZhbHVlIGFuZAorCSAqIGRvZXMgbm90IHJlcGxhY2VzIHtAY29kZSBudWxsfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxEb3VibGVDb21wbGV4PiBET1VCTEVfQ09NUExFWCA9IG5ldyBWYWx1ZVR5cGU8PihEb3VibGVDb21wbGV4LmNsYXNzLCAiRE9VQkxFX0NPTVBMRVgiLAorCQkJbnVsbCk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGNvZGUgRG91YmxlQ29tcGxleFtdfSB2YWx1ZSBhbmQKKwkgKiByZXBsYWNlcyB7QGNvZGUgbnVsbH0gd2l0aCBhbiBlbXB0eSB7QGNvZGUgRG91YmxlQ29tcGxleFtdfSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxEb3VibGVDb21wbGV4W10+IERPVUJMRV9DT01QTEVYX1NFUVVFTkNFID0gbmV3IFZhbHVlVHlwZTw+KERvdWJsZUNvbXBsZXhbXS5jbGFzcywKKwkJCSJET1VCTEVfQ09NUExFWF9TRVFVRU5DRSIsIG5ldyBEb3VibGVDb21wbGV4WzBdKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIG1vZGVsZWQgZW51bWVyYXRpb24gY29uc3RhbnQgdmFsdWUKKwkgKiBhbmQgZG9lcyBub3QgcmVwbGFjZSB7QGNvZGUgbnVsbH0uCisJICoKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxFbnVtZXJhdGlvblZhbHVlPiBFTlVNRVJBVElPTiA9IG5ldyBWYWx1ZVR5cGU8PigiRU5VTUVSQVRJT04iKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIG1vZGVsZWQgZW51bWVyYXRpb24gY29uc3RhbnQgYXJyYXkKKwkgKiB2YWx1ZSBhbmQgcmVwbGFjZXMge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkgYXJyYXkgd2l0aCBkZWZpbmVkIGNvbXBvbmVudAorCSAqIHR5cGUuCisJICoKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxFbnVtZXJhdGlvblZhbHVlW10+IEVOVU1FUkFUSU9OX1NFUVVFTkNFID0gbmV3IFZhbHVlVHlwZTw+KCJFTlVNRVJBVElPTl9TRVFVRU5DRSIpOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0BsaW5rIEZpbGVMaW5rfSB2YWx1ZSBhbmQgZG9lcyBub3QKKwkgKiByZXBsYWNlIHtAY29kZSBudWxsfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxGaWxlTGluaz4gRklMRV9MSU5LID0gbmV3IFZhbHVlVHlwZTw+KEZpbGVMaW5rLmNsYXNzLCAiRklMRV9MSU5LIiwgbnVsbCk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGNvZGUgRmlsZUxpbmtbXX0gdmFsdWUgYW5kCisJICogcmVwbGFjZXMge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIEZpbGVMaW5rfSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxGaWxlTGlua1tdPiBGSUxFX0xJTktfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oRmlsZUxpbmtbXS5jbGFzcywKKwkJCSJGSUxFX0xJTktfU0VRVUVOQ0UiLCBuZXcgRmlsZUxpbmtbMF0pOworCisJLyoqCisJICogVE9ETyAuLi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxPYmplY3Q+IEJMT0IgPSBuZXcgVmFsdWVUeXBlPD4oT2JqZWN0LmNsYXNzLCAiIiwgbnVsbCk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGxpbmsgT2JqZWN0fSB2YWx1ZSBhbmQgZG9lcyBub3QKKwkgKiByZXBsYWNlIHtAY29kZSBudWxsfS4gVGhpcyB2YWx1ZSB0eXBlIGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIHNlcXVlbmNlCisJICogdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxPYmplY3Q+IFVOS05PV04gPSBuZXcgVmFsdWVUeXBlPD4oT2JqZWN0LmNsYXNzLCAiVU5LTk9XTiIsIG51bGwpOworCisJLyoqCisJICogVGhlIHR5cGUgaXMgdXNlZCB0byBjaGVjayBhc3NpZ25tZW50IGNvbXBhdGliaWxpdHkgb2Ygbm9uIHtAY29kZSBudWxsfSB2YWx1ZXMKKwkgKiBwYXNzZWQgdG8ge0BsaW5rIFZhbHVlI3NldChPYmplY3QpfS4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIENsYXNzPFQ+IHR5cGU7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQgaW4ge0BsaW5rIFZhbHVlI3NldChPYmplY3QpfSB0byByZXBsYWNlIGEKKwkgKiB7QGNvZGUgbnVsbH0gaW5wdXQgYXJndW1lbnQuCisJICovCisJcHJpdmF0ZSBmaW5hbCBUIGRlZmF1bHRWYWx1ZTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIC0gTWF5IG9ubHkgYmUgdXNlZCB0byBjcmVhdGUge0BsaW5rICNFTlVNRVJBVElPTn0sCisJICoge0BsaW5rICNFTlVNRVJBVElPTl9TRVFVRU5DRX0gb3Ige0BsaW5rICNVTktOT1dOfSB0eXBlcy4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqLworCXByaXZhdGUgVmFsdWVUeXBlKFN0cmluZyBuYW1lKSB7CisJCXRoaXMobnVsbCwgbmFtZSwgbnVsbCk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIHR5cGUgICAgICAgICBUaGUgdHlwZSBvZiB2YWx1ZSBhIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHZhbHVlIHR5cGUKKwkgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgYWNjZXB0LgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBXaWxsIGJlIHVzZWQgYXMge0Bjb2RlIG51bGx9IHJlcGxhY2VtZW50IGluCisJICogICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVmFsdWUjc2V0KE9iamVjdCl9LgorCSAqLworCXByaXZhdGUgVmFsdWVUeXBlKENsYXNzPFQ+IHR5cGUsIFN0cmluZyBuYW1lLCBUIGRlZmF1bHRWYWx1ZSkgeworCQlzdXBlcihuYW1lKTsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVmFsdWV9IGluaXRpYWxpemVkIHdpdGggZ2l2ZW4gbmFtZS4gVGhlIHtAY29kZQorCSAqIFZhbHVlfSdzIGluaXRpYWwgdmFsaWRpdHkgZmxhZyB3aWxsIGJlIHNldCB0byB7QGNvZGUgdHJ1ZX0sIHRoZSB1bml0IG5hbWUKKwkgKiB3aWxsIGJlIG9taXR0ZWQuCisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgb25seSBhbGxvd2VkIHRvIGJlIGNhbGxlZCB3aGVyZQorCSAqIHtAbGluayAjaXNFbnVtZXJhdGlvblR5cGUoKX0gcmV0dXJucyB7QGNvZGUgZmFsc2V9LgorCSAqCisJICogQHBhcmFtIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisJICogQHBhcmFtIGlucHV0IFRoZSBpbml0aWFsIHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIHRydWV9LgorCSAqLworCXB1YmxpYyBWYWx1ZSBjcmVhdGUoU3RyaW5nIG5hbWUsIE9iamVjdCBpbnB1dCkgeworCQlyZXR1cm4gY3JlYXRlKG5hbWUsICIiLCB0cnVlLCBpbnB1dCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVmFsdWV9IGluaXRpYWxpemVkIHdpdGggZ2l2ZW4gbmFtZS4gVGhlIHtAY29kZQorCSAqIFZhbHVlfSdzIGluaXRpYWwgdmFsaWRpdHkgZmxhZyB3aWxsIGJlIHNldCB0byB7QGNvZGUgZmFsc2V9LCB0aGUgdW5pdCBuYW1lCisJICogd2lsbCBiZSBvbWl0dGVkLiBUaGUgaW5pdGlhbCB2YWx1ZSB3aWxsIGJlIHRoZSBvbmUgZGVmaW5lZCBpbgorCSAqIHtAbGluayAjZGVmYXVsdFZhbHVlfS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgY2FsbGVkIHdoZXJlCisJICoge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zIHtAY29kZSBmYWxzZX0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIHRydWV9LgorCSAqLworCXB1YmxpYyBWYWx1ZSBjcmVhdGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGNyZWF0ZShuYW1lLCAiIiwgZmFsc2UsIGRlZmF1bHRWYWx1ZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVmFsdWV9IGluaXRpYWxpemVkIHdpdGggZ2l2ZW4gYXJndW1lbnRzLgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIG9ubHkgYWxsb3dlZCB0byBiZSBjYWxsZWQgd2hlcmUKKwkgKiB7QGxpbmsgI2lzRW51bWVyYXRpb25UeXBlKCl9IHJldHVybnMge0Bjb2RlIGZhbHNlfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorCSAqIEBwYXJhbSB1bml0ICBUaGUgdW5pdCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisJICogQHBhcmFtIHZhbGlkIFRoZSBpbml0aWFsIHZhbGlkaXR5IGZsYWcuCisJICogQHBhcmFtIGlucHV0IFRoZSBpbml0aWFsIHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIHRydWV9LgorCSAqLworCXB1YmxpYyBWYWx1ZSBjcmVhdGUoU3RyaW5nIG5hbWUsIFN0cmluZyB1bml0LCBib29sZWFuIHZhbGlkLCBPYmplY3QgaW5wdXQpIHsKKwkJaWYgKGlzRW51bWVyYXRpb25UeXBlKCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgdmFsdWUgdHlwZSBpcyBhbiBlbnVtZXJhdGlvbiB0eXBlLiIpOworCQl9CisKKwkJcmV0dXJuIG5ldyBWYWx1ZSh0aGlzLCBuYW1lLCB1bml0LCB2YWxpZCwgaW5wdXQsIHR5cGUsIGRlZmF1bHRWYWx1ZSwgbnVsbCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVmFsdWV9IGluaXRpYWxpemVkIHdpdGggZ2l2ZW4gbmFtZS4gVGhlIHtAY29kZQorCSAqIFZhbHVlfSdzIGluaXRpYWwgdmFsaWRpdHkgZmxhZyB3aWxsIGJlIHNldCB0byB7QGNvZGUgZmFsc2V9LCB0aGUgdW5pdCBuYW1lCisJICogd2lsbCBiZSBvbWl0dGVkLiBUaGUgaW5pdGlhbCB2YWx1ZSB3aWxsIGJlIHtAY29kZSBudWxsfSBpZgorCSAqIHtAbGluayAjaXNTZXF1ZW5jZSgpfSByZXR1cm5zIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlIGFuIGVtcHR5IGFycmF5IHdpdGgKKwkgKiBnaXZlbiBjb21wb25lbnQgdHlwZSBpbiBlbnVtQ2xhc3MgaXMgdXNlZC4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgY2FsbGVkIHdoZXJlCisJICoge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zIHtAY29kZSB0cnVlfS4KKwkgKgorCSAqIEBwYXJhbSA8RT4gIE1vZGVsZWQgZW51bWVyYXRpb24gdHlwZS4KKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGZhbHNlfS4KKwkgKi8KKwlwdWJsaWMgPEUgZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBWYWx1ZSBjcmVhdGUoRW51bWVyYXRpb248RT4gZW51bU9iaiwgU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGNyZWF0ZShuYW1lLCAiIiwgZmFsc2UsIG51bGwsIGVudW1PYmouZ2V0TmFtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBWYWx1ZX0gaW5pdGlhbGl6ZWQgd2l0aCBnaXZlbiBhcmd1bWVudHMuCisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgb25seSBhbGxvd2VkIHRvIGJlIGNhbGxlZCB3aGVyZQorCSAqIHtAbGluayAjaXNFbnVtZXJhdGlvblR5cGUoKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCisJICoKKwkgKiBAcGFyYW0gPEU+ICAgTW9kZWxlZCBlbnVtZXJhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSBuYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorCSAqIEBwYXJhbSB1bml0ICBUaGUgdW5pdCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisJICogQHBhcmFtIHZhbGlkIFRoZSBpbml0aWFsIHZhbGlkaXR5IGZsYWcuCisJICogQHBhcmFtIGlucHV0IFRoZSBpbml0aWFsIHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGZhbHNlfS4KKwkgKi8KKwlwdWJsaWMgPEUgZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBWYWx1ZSBjcmVhdGUoU3RyaW5nIG5hbWUsIFN0cmluZyB1bml0LCBib29sZWFuIHZhbGlkLCBPYmplY3QgaW5wdXQsCisJCQlTdHJpbmcgdmFsdWVUeXBlRGVzY3IpIHsKKwkJaWYgKGlzRW51bWVyYXRpb25UeXBlKCkpIHsKKwkJCU9iamVjdCBudWxsUmVwbGFjZW1lbnQgPSBudWxsOworCQkJQ2xhc3M8Pz4gdmFsdWVDbGFzcyA9IEVudW1lcmF0aW9uVmFsdWUuY2xhc3M7CisJCQlpZiAoaXNTZXF1ZW5jZSgpKSB7CisJCQkJbnVsbFJlcGxhY2VtZW50ID0gQXJyYXkubmV3SW5zdGFuY2UodmFsdWVDbGFzcywgMCk7CisJCQkJdmFsdWVDbGFzcyA9IG51bGxSZXBsYWNlbWVudC5nZXRDbGFzcygpOworCQkJfQorCisJCQlyZXR1cm4gbmV3IFZhbHVlKHRoaXMsIG5hbWUsIHVuaXQsIHZhbGlkLCBpbnB1dCwgdmFsdWVDbGFzcywgbnVsbFJlcGxhY2VtZW50LCB2YWx1ZVR5cGVEZXNjcik7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHZhbHVlIHR5cGUgaXMgbm90IGFuIGVudW1lcmF0aW9uIHR5cGUuIik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNTVFJJTkd9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNTVFJJTkdfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU3RyaW5nVHlwZSgpIHsKKwkJcmV0dXJuIGlzU3RyaW5nKCkgfHwgaXNTdHJpbmdTZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNTVFJJTkd9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU3RyaW5nKCkgeworCQlyZXR1cm4gU1RSSU5HID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI1NUUklOR19TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTdHJpbmdTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIFNUUklOR19TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjREFURX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RBVEVfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGF0ZVR5cGUoKSB7CisJCXJldHVybiBpc0RhdGUoKSB8fCBpc0RhdGVTZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNEQVRFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RhdGUoKSB7CisJCXJldHVybiBEQVRFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0RBVEVfU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGF0ZVNlcXVlbmNlKCkgeworCQlyZXR1cm4gREFURV9TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjQk9PTEVBTn08L2xpPgorCSAqIDxsaT57QGxpbmsgI0JPT0xFQU5fU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhblR5cGUoKSB7CisJCXJldHVybiBpc0Jvb2xlYW4oKSB8fCBpc0Jvb2xlYW5TZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNCT09MRUFOfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW4oKSB7CisJCXJldHVybiBCT09MRUFOID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0JPT0xFQU5fU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhblNlcXVlbmNlKCkgeworCQlyZXR1cm4gQk9PTEVBTl9TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjQllURX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0JZVEVfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNTSE9SVH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1NIT1JUX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjSU5URUdFUn08L2xpPgorCSAqIDxsaT57QGxpbmsgI0lOVEVHRVJfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNMT05HfTwvbGk+CisJICogPGxpPntAbGluayAjTE9OR19TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayAjRkxPQVRfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEV9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEVfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTnVtZXJpY2FsVHlwZSgpIHsKKwkJcmV0dXJuIGlzQW55SW50ZWdlclR5cGUoKSB8fCBpc0FueUZsb2F0VHlwZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjQllURX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0JZVEVfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNTSE9SVH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1NIT1JUX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjSU5URUdFUn08L2xpPgorCSAqIDxsaT57QGxpbmsgI0lOVEVHRVJfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNMT05HfTwvbGk+CisJICogPGxpPntAbGluayAjTE9OR19TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBbnlJbnRlZ2VyVHlwZSgpIHsKKwkJcmV0dXJuIGlzQnl0ZVR5cGUoKSB8fCBpc1Nob3J0VHlwZSgpIHx8IGlzSW50ZWdlclR5cGUoKSB8fCBpc0xvbmdUeXBlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayAjQllURV9TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCeXRlVHlwZSgpIHsKKwkJcmV0dXJuIGlzQnl0ZSgpIHx8IGlzQnl0ZVNlcXVlbmNlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0JZVEV9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQnl0ZSgpIHsKKwkJcmV0dXJuIEJZVEUgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjQllURV9TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCeXRlU2VxdWVuY2UoKSB7CisJCXJldHVybiBCWVRFX1NFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNTSE9SVH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1NIT1JUX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Nob3J0VHlwZSgpIHsKKwkJcmV0dXJuIGlzU2hvcnQoKSB8fCBpc1Nob3J0U2VxdWVuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjU0hPUlR9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2hvcnQoKSB7CisJCXJldHVybiBTSE9SVCA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNTSE9SVF9TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaG9ydFNlcXVlbmNlKCkgeworCQlyZXR1cm4gU0hPUlRfU0VRVUVOQ0UgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0lOVEVHRVJ9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNJTlRFR0VSX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVnZXJUeXBlKCkgeworCQlyZXR1cm4gaXNJbnRlZ2VyKCkgfHwgaXNJbnRlZ2VyU2VxdWVuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjSU5URUdFUn0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlZ2VyKCkgeworCQlyZXR1cm4gSU5URUdFUiA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNJTlRFR0VSX1NFUVVFTkNFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVnZXJTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIElOVEVHRVJfU0VRVUVOQ0UgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0xPTkd9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNMT05HX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xvbmdUeXBlKCkgeworCQlyZXR1cm4gaXNMb25nKCkgfHwgaXNMb25nU2VxdWVuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjTE9OR30uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMb25nKCkgeworCQlyZXR1cm4gTE9ORyA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNMT05HX1NFUVVFTkNFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xvbmdTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIExPTkdfU0VRVUVOQ0UgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayAjRkxPQVRfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEV9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEVfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQW55RmxvYXRUeXBlKCkgeworCQlyZXR1cm4gaXNGbG9hdFR5cGUoKSB8fCBpc0RvdWJsZVR5cGUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayAjRkxPQVRfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmxvYXRUeXBlKCkgeworCQlyZXR1cm4gaXNGbG9hdCgpIHx8IGlzRmxvYXRTZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNGTE9BVH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGbG9hdCgpIHsKKwkJcmV0dXJuIEZMT0FUID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0ZMT0FUX1NFUVVFTkNFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0U2VxdWVuY2UoKSB7CisJCXJldHVybiBGTE9BVF9TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjRE9VQkxFfTwvbGk+CisJICogPGxpPntAbGluayAjRE9VQkxFX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RvdWJsZVR5cGUoKSB7CisJCXJldHVybiBpc0RvdWJsZSgpIHx8IGlzRG91YmxlU2VxdWVuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjRE9VQkxFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RvdWJsZSgpIHsKKwkJcmV0dXJuIERPVUJMRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNET1VCTEVfU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRG91YmxlU2VxdWVuY2UoKSB7CisJCXJldHVybiBET1VCTEVfU0VRVUVOQ0UgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0JZVEVfU1RSRUFNfTwvbGk+CisJICogPGxpPntAbGluayAjQllURV9TVFJFQU1fU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQnl0ZVN0cmVhbVR5cGUoKSB7CisJCXJldHVybiBpc0J5dGVTdHJlYW0oKSB8fCBpc0J5dGVTdHJlYW1TZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNCWVRFX1NUUkVBTX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCeXRlU3RyZWFtKCkgeworCQlyZXR1cm4gQllURV9TVFJFQU0gPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjQllURV9TVFJFQU1fU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQnl0ZVN0cmVhbVNlcXVlbmNlKCkgeworCQlyZXR1cm4gQllURV9TVFJFQU1fU0VRVUVOQ0UgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0ZMT0FUX0NPTVBMRVh9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVF9DT01QTEVYX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjRE9VQkxFX0NPTVBMRVh9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEVfQ09NUExFWF9TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDb21wbGV4VHlwZSgpIHsKKwkJcmV0dXJuIGlzRmxvYXRDb21wbGV4VHlwZSgpIHx8IGlzRG91YmxlQ29tcGxleFR5cGUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0ZMT0FUX0NPTVBMRVh9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVF9DT01QTEVYX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0Q29tcGxleFR5cGUoKSB7CisJCXJldHVybiBpc0Zsb2F0Q29tcGxleCgpIHx8IGlzRmxvYXRDb21wbGV4U2VxdWVuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjRkxPQVRfQ09NUExFWH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGbG9hdENvbXBsZXgoKSB7CisJCXJldHVybiBGTE9BVF9DT01QTEVYID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0ZMT0FUX0NPTVBMRVhfU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmxvYXRDb21wbGV4U2VxdWVuY2UoKSB7CisJCXJldHVybiBGTE9BVF9DT01QTEVYX1NFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEVfQ09NUExFWH08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRV9DT01QTEVYX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RvdWJsZUNvbXBsZXhUeXBlKCkgeworCQlyZXR1cm4gaXNEb3VibGVDb21wbGV4KCkgfHwgaXNEb3VibGVDb21wbGV4U2VxdWVuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjRE9VQkxFX0NPTVBMRVh9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRG91YmxlQ29tcGxleCgpIHsKKwkJcmV0dXJuIERPVUJMRV9DT01QTEVYID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0RPVUJMRV9DT01QTEVYX1NFUVVFTkNFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RvdWJsZUNvbXBsZXhTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIERPVUJMRV9DT01QTEVYX1NFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNFTlVNRVJBVElPTn08L2xpPgorCSAqIDxsaT57QGxpbmsgI0VOVU1FUkFUSU9OX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VudW1lcmF0aW9uVHlwZSgpIHsKKwkJcmV0dXJuIGlzRW51bWVyYXRpb24oKSB8fCBpc0VudW1lcmF0aW9uU2VxdWVuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjRU5VTUVSQVRJT059LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW51bWVyYXRpb24oKSB7CisJCXJldHVybiBFTlVNRVJBVElPTiA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNFTlVNRVJBVElPTl9TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbnVtZXJhdGlvblNlcXVlbmNlKCkgeworCQlyZXR1cm4gRU5VTUVSQVRJT05fU0VRVUVOQ0UgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0ZJTEVfTElOS308L2xpPgorCSAqIDxsaT57QGxpbmsgI0ZJTEVfTElOS19TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGaWxlTGlua1R5cGUoKSB7CisJCXJldHVybiBpc0ZpbGVMaW5rKCkgfHwgaXNGaWxlTGlua1NlcXVlbmNlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0ZJTEVfTElOS30uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGaWxlTGluaygpIHsKKwkJcmV0dXJuIEZJTEVfTElOSyA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNGSUxFX0xJTktfU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmlsZUxpbmtTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIEZJTEVfTElOS19TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNCTE9CfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoKSB7CisJCXJldHVybiBCTE9CID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI1VOS05PV059LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVW5rbm93bigpIHsKKwkJcmV0dXJuIFVOS05PV04gPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI1NUUklOR19TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RBVEVfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNCT09MRUFOX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjQllURV9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI1NIT1JUX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjSU5URUdFUl9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0xPTkdfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVF9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRV9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0JZVEVfU1RSRUFNX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjRkxPQVRfQ09NUExFWF9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRV9DT01QTEVYX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjRU5VTUVSQVRJT05fU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNGSUxFX0xJTktfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2VxdWVuY2UoKSB7CisJCXJldHVybiBuYW1lKCkgIT0gbnVsbCAmJiBuYW1lKCkuZW5kc1dpdGgoIlNFUVVFTkNFIik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2VxdWVuY2UgdmVyc2lvbiBvZiB0aGlzIHZhbHVlIHR5cGUuIFRoaXMgbWV0aG9kIHJldHVybnMgaXRzZWxmLAorCSAqIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBhIHNlcXVlbmNlIHR5cGUuCisJICogCisJICogSWYgeW91IGV4dGVuZCB0aGUgY2xhc3MgVmFsdWVUeXBlLCB5b3UgaGF2ZSB0byBlbnN1cmUgdGhhdCBUIGNvbnRhaW5zIGEgZmllbGQKKwkgKiBvZiB0aGUgY29ycmVjdCBuYW1lIGFuZCB0eXBlLCBvdGhlcndpc2UgYSBydW50aW1lIGVycm9yIHdpbGwgb2NjdXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzZXF1ZW5jZSB2ZXJzaW9uIG9mIHRoaXMgdmFsdWUgdHlwZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFMgZXh0ZW5kcyBWYWx1ZVR5cGU8Pz4+IFMgdG9TZXF1ZW5jZVR5cGUoKSB7CisJCWlmIChpc1NlcXVlbmNlKCkpIHsKKwkJCXJldHVybiAoUykgdGhpczsKKwkJfQorCisJCXJldHVybiAoUykgdmFsdWVPZihuYW1lKCkgKyAiX1NFUVVFTkNFIik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2NhbGFyIHZlcnNpb24gb2YgdGhpcyB2YWx1ZSB0eXBlLiBUaGlzIG1ldGhvZCByZXR1cm5zIGl0c2VsZiwgaWYKKwkgKiB0aGlzIHZhbHVlIHR5cGUgaXMgYSBzY2FsYXIgdHlwZS4KKwkgKiAKKwkgKiBJZiB5b3UgZXh0ZW5kIHRoZSBjbGFzcyBWYWx1ZVR5cGUsIHlvdSBoYXZlIHRvIGVuc3VyZSB0aGF0IFQgY29udGFpbnMgYSBmaWVsZAorCSAqIG9mIHRoZSBjb3JyZWN0IG5hbWUgYW5kIHR5cGUsIG90aGVyd2lzZSBhIHJ1bnRpbWUgZXJyb3Igd2lsbCBvY2N1ci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNlcXVlbmNlIHZlcnNpb24gb2YgdGhpcyB2YWx1ZSB0eXBlIGlzIHJldHVybmVkLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyA8UyBleHRlbmRzIFZhbHVlVHlwZTw/Pj4gUyB0b1NpbmdsZVR5cGUoKSB7CisKKwkJaWYgKGlzRW51bWVyYXRpb25UeXBlKCkpIHsKKwkJCWlmIChpc1NlcXVlbmNlKCkpIHsKKwkJCQlyZXR1cm4gKFMpIHZhbHVlT2YobmFtZSgpLnJlcGxhY2UoIl9TRVFVRU5DRSIsICIiKSk7CisJCQl9CisKKwkJCXJldHVybiAoUykgdGhpczsKKwkJfSBlbHNlIHsKKwkJCXRyeSB7CisJCQkJaWYgKGlzU2VxdWVuY2UoKSkgeworCQkJCQlGaWVsZCBmaWVsZCA9IGdldENsYXNzKCkuZ2V0RmllbGQobmFtZSgpLnJlcGxhY2UoIl9TRVFVRU5DRSIsICIiKSk7CisJCQkJCXJldHVybiAoUykgZmllbGQuZ2V0KHRoaXMpOworCQkJCX0KKwkJCQlyZXR1cm4gKFMpIHRoaXM7CisJCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB8IENsYXNzQ2FzdEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBmaWd1cmUgb3V0IHNpbmdsZSB0eXBlIGZvciAiICsgbmFtZSgpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIGNsYXNzIGZvciB0aGlzIHZhbHVlIHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBjbGFzcyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIHRydWV9LgorCSAqLworCXB1YmxpYyBDbGFzczw/PiBnZXRWYWx1ZUNsYXNzKCkgeworCQlpZiAoaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIik7CisJCX0KKwkJcmV0dXJuIHR5cGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVmVyc2lvblN0YXRlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVmVyc2lvblN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiNmFjYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WZXJzaW9uU3RhdGUuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCisvKioKKyAqIFZlcnNpb24gc3RhdGUgZW51bWVyYXRpb24uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIEZpbGVMaW5rCisgKi8KK3B1YmxpYyBjbGFzcyBWZXJzaW9uU3RhdGUgZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBFbnVtZXJhdGlvbnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBbiBlbnRpdHkgd2l0aCB0aGlzIHZlcnNpb24gc3RhdGUgaXMgc3RpbGwgZWRpdGFibGUgYW5kIGhlbmNlIG5vdCBhbGxvd2VkIGJlCisJICogdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyBlbnRpdGllcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb25TdGF0ZSBFRElUQUJMRSA9IG5ldyBWZXJzaW9uU3RhdGUoIkVESVRBQkxFIiwgMCk7CisKKwkvKioKKwkgKiBBbiBlbnRpdHkgd2l0aCB0aGlzIHZlcnNpb24gc3RhdGUgaXMgbm8gbG9uZ2VyIGVkaXRhYmxlIGFuZCBpcyBhbGxvd2VkIHRvIGJlCisJICogdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyBlbnRpdGllcy4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBJZiBhbiBlbnRpdHkncyB2ZXJzaW9uIHN0YXRlIGlzIHRoaXMgc3RhdGUsIHRoZW4gaXRzIHZlcnNpb24KKwkgKiBzdGF0ZSBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgY2hhbmdlZCB0byB7QGxpbmsgI0FSQ0hJVkVEfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb25TdGF0ZSBWQUxJRCA9IG5ldyBWZXJzaW9uU3RhdGUoIlZBTElEIiwgMSk7CisKKwkvKioKKwkgKiBBbiBlbnRpdHkgd2l0aCB0aGlzIHZlcnNpb24gc3RhdGUgaXMgbmVpdGhlciBlZGl0YWJsZSBub3IgaXMgaXQgYWxsb3dlZCB0bworCSAqIHVzZSBpdCB3aGVuIGNyZWF0aW5nIG5ldyBlbnRpdGllcworCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IElmIGFuIGVudGl0eSdzIHZlcnNpb24gc3RhdGUgaXMgdGhpcyBzdGF0ZSwgdGhlbiBpdHMgdmVyc2lvbgorCSAqIHN0YXRlIGlzIG5vIGxvbmdlciBhbGxvd2VkIHRvIGJlIGNoYW5nZWQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWZXJzaW9uU3RhdGUgQVJDSElWRUQgPSBuZXcgVmVyc2lvblN0YXRlKCJBUkNISVZFRCIsIDIpOworCisJcHJpdmF0ZSBWZXJzaW9uU3RhdGUoU3RyaW5nIG5hbWUsIGludCBvcmRpbmFsKSB7CisJCXN1cGVyKG5hbWUsIG9yZGluYWwpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZlcnNpb24gc3RhdGUgaXMge0BsaW5rICNFRElUQUJMRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKKwkJcmV0dXJuIEVESVRBQkxFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmVyc2lvbiBzdGF0ZSBpcyB7QGxpbmsgI1ZBTElEfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworCQlyZXR1cm4gVkFMSUQgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2ZXJzaW9uIHN0YXRlIGlzIHtAbGluayAjQVJDSElWRUR9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZWQoKSB7CisJCXJldHVybiBBUkNISVZFRCA9PSB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3NDRmNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb247CisKKy8qKgorICogVGhyb3duIHRvIGluZGljYXRlIGEgZXJyb3JzIGNvbmNlcm5pbmcgbm90aWZpY2F0aW9ucy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgTWF0dGhpYXMgS29sbGVyLCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqLworcHVibGljIGNsYXNzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MDExODc3NjMxNTU5MjYxNzE2TDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihtZXNzYWdlKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtZXNzYWdlICAgVGhlIGVycm9yIG1lc3NhZ2UuCisJICogQHBhcmFtIHRocm93YWJsZSBUaGUgb3JpZ2luIGNhdXNlLgorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25GaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjhlZWEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKKworLyoqCisgKiBDbGFzcyByZXByZXNlbnRzIGEgZmlsdGVyIGZvciBub3RpZmljYXRpb25zLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgTWF0dGhpYXMgS29sbGVyLCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqLworcHVibGljIGNsYXNzIE5vdGlmaWNhdGlvbkZpbHRlciB7CisKKwkvKioKKwkgKiBNb2RpZmljYXRpb24gdHlwZSBlbnVtZXJhdGlvbgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqIEBhdXRob3IgTWF0dGhpYXMgS29sbGVyLCBQZWFrIFNvbHV0aW9uIEdtYkgKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGVudW0gTW9kaWZpY2F0aW9uVHlwZSB7CisJCUlOU1RBTkNFX0NSRUFURUQsIElOU1RBTkNFX01PRElGSUVELCBJTlNUQU5DRV9ERUxFVEVELCBNT0RFTF9NT0RJRklFRCwgU0VDVVJJVFlfTU9ESUZJRUQ7CisJfQorCisJcHJpdmF0ZSBFbnVtU2V0PE1vZGlmaWNhdGlvblR5cGU+IHR5cGVzID0gRW51bVNldC5hbGxPZihNb2RpZmljYXRpb25UeXBlLmNsYXNzKTsKKworCXByaXZhdGUgU2V0PEVudGl0eVR5cGU+IGVudGl0eVR5cGVzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBNb2RpZmljYXRpb25UeXBlfXMgb2YgdGhpcyBmaWx0ZXIuCisJICogCisJICogQHJldHVybiBTZXQgd2l0aCB7QGxpbmsgTW9kaWZpY2F0aW9uVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFNldDxNb2RpZmljYXRpb25UeXBlPiBnZXRUeXBlcygpIHsKKwkJcmV0dXJuIHR5cGVzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHtAbGluayBNb2RpZmljYXRpb25UeXBlfXMgdXNlZCB0byBmaWx0ZXIgdGhlIG5vdGlmaWNhdGlvbnMuCisJICogCisJICogQHBhcmFtIHR5cGVzIFNldCB3aXRoIHtAbGluayBNb2RpZmljYXRpb25UeXBlfQorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGVzKFNldDxNb2RpZmljYXRpb25UeXBlPiB0eXBlcykgeworCQl0aGlzLnR5cGVzID0gRW51bVNldC5jb3B5T2YodHlwZXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBFbnRpdHlUeXBlfXMgb2YgdGhpcyBmaWx0ZXIuCisJICogCisJICogQHJldHVybiBTZXQgd2l0aCB7QGxpbmsgRW50aXR5VHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFNldDxFbnRpdHlUeXBlPiBnZXRFbnRpdHlUeXBlcygpIHsKKwkJcmV0dXJuIGVudGl0eVR5cGVzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHtAbGluayBFbnRpdHlUeXBlfXMgdXNlZCB0byBmaWx0ZXIgdGhlIG5vdGlmaWNhdGlvbnMuCisJICogCisJICogQHBhcmFtIGVudGl0eVR5cGVzIFNldCB3aXRoIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbnRpdHlUeXBlcyhTZXQ8RW50aXR5VHlwZT4gZW50aXR5VHlwZXMpIHsKKwkJdGhpcy5lbnRpdHlUeXBlcyA9IG5ldyBIYXNoU2V0PD4oZW50aXR5VHlwZXMpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg2Y2QwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlVzZXI7CisKKy8qKgorICogTGlzdGVuZXIgaW50ZXJmYWNlIGZvciBub3RpZmljYXRpb25zLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgTWF0dGhpYXMgS29sbGVyLCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBOb3RpZmljYXRpb25MaXN0ZW5lciB7CisJLyoqCisJICogQ2FsbGVkIHdoZW4gYSBuZXcgaW5zdGFuY2UgZWxlbWVudCB3YXMgY3JlYXRlZCBieSB0aGUgc2VydmVyLgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdGllcyBBIGxpc3Qgb2YgbmV3bHkgY3JlYXRlZCBlbnRpdGllcy4KKwkgKiBAcGFyYW0gdXNlciAgICAgVGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhlIGVudGl0aWVzLgorCSAqLworCXZvaWQgaW5zdGFuY2VDcmVhdGVkKExpc3Q8PyBleHRlbmRzIEVudGl0eT4gZW50aXRpZXMsIFVzZXIgdXNlcik7CisKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiBhIGV4aXN0aW5nIGluc3RhbmNlIGVsZW1lbnQgd2FzIG1vZGlmaWVkIGJ5IHRoZSBzZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGVudGl0aWVzIEEgbGlzdCBvZiBtb2RpZmllZCBlbnRpdGllcy4KKwkgKiBAcGFyYW0gdXNlciAgICAgVGhlIHVzZXIgd2hvIG1vZGlmaWVkIHRoZSBlbnRpdGllcy4KKwkgKi8KKwl2b2lkIGluc3RhbmNlTW9kaWZpZWQoTGlzdDw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdGllcywgVXNlciB1c2VyKTsKKworCS8qKgorCSAqIENhbGxlZCB3aGVuIGEgZXhpc3RpbmcgaW5zdGFuY2UgZWxlbWVudCB3YXMgZGVsZXRlZCBieSB0aGUgc2VydmVyLgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eVR5cGUgb2YgdGhlIGRlbGV0ZWQgZW50aXRpZXMuCisJICogQHBhcmFtIGVudGl0aWVzICAgQSBsaXN0IHdpdGggdGhlIElEcyBvZiBkZWxldGVkIGVudGl0aWVzLgorCSAqIEBwYXJhbSB1c2VyICAgICAgIFRoZSB1c2VyIHdobyBkZWxldGVkIHRoZSBlbnRpdGllcy4KKwkgKi8KKwl2b2lkIGluc3RhbmNlRGVsZXRlZChFbnRpdHlUeXBlIGVudGl0eVR5cGUsIExpc3Q8U3RyaW5nPiBpZHMsIFVzZXIgdXNlcik7CisKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gbW9kZWwgaXMgY2hhbmdlZCBieSB0aGUgc2VydmVyCisJICogCisJICogQHBhcmFtIGVudGl0eVR5cGUgTW9kaWZpZWQgZW50aXR5VHlwZS4KKwkgKiBAcGFyYW0gdXNlciAgICAgICBUaGUgdXNlciB3aG8gbW9kaWZpZWQgdGhlIGFwcGxpY2F0aW9uIG1vZGVsLgorCSAqLworCXZvaWQgbW9kZWxNb2RpZmllZChFbnRpdHlUeXBlIGVudGl0eVR5cGUsIFVzZXIgdXNlcik7CisKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiBzZWN1cml0eSByZWxhdGVkIGluZm9ybWF0aW9uIGlzIGNoYW5nZWQgYnkgdGhlIHNlcnZlcgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eVR5cGUgd2l0aCBjaGFuZ2VkIHNlY3VyaXR5CisJICogQHBhcmFtIGVudGl0aWVzICAgQSBsaXN0IHdpdGggdGhlIElEcyBvZiBlbnRpdGllcyByZWxhdGVkIHRvIHRoZSBjaGFuZ2UuCisJICogICAgICAgICAgICAgICAgICAgRW1wdHkgaWYgY2hhbmdlIHdhcyBvbmx5IHJlbGV2YW50IGZvciBlbnRpdHlUeXBlLgorCSAqIEBwYXJhbSB1c2VyICAgICAgIFRoZSB1c2VyIHdobyBtb2RpZmllZCBzZWN1cml0eSBpbmZvcm1hdGlvbi4KKwkgKi8KKwl2b2lkIHNlY3VyaXR5TW9kaWZpZWQoRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBMaXN0PFN0cmluZz4gaWRzLCBVc2VyIHVzZXIpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25TZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvblNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2FjYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb247CisKKy8qKgorICogTWFuYWdlcyByZWdpc3RyYXRpb25zIHRvIGEgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vdGlmaWNhdGlvblNlcnZpY2UgeworCisJLyoqCisJICogUmVnaXN0ZXJzIGEgTm90aWZpY2F0aW9uTGlzdGVuZXIgYXQgdGhlIHVuZGVybHlpbmcgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisJICogCisJICogQHBhcmFtIHJlZ2lzdHJhdGlvbk5hbWUgQW4gdW5pcXVlIG5hbWUgdXNlZCBmb3IgdGhlIHJlZ2lzdHJhdGlvbi4KKwkgKiBAcGFyYW0gZmlsdGVyICAgICAgICAgICBBIG5vdGlmaWNhdGlvbiBmaWx0ZXIsIHNwZWNpZnlpbmcgd2hpY2ggZXZlbnRzIHNob3VsZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlY2VpdmVkIGJ5IHRoZSBsaXN0ZW5lci4KKwkgKiBAcGFyYW0gbGlzdGVuZXIgICAgICAgICBBIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciB3aGljaCBpcyBpbmZvcm1lZCBpZiBuZXcKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgYXJlIHJlY2VpdmVkLgorCSAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIEluIGNhc2UgdGhlIGxpc3RlbmVyIGNhbm5vdCBiZSByZWdpc3RlcmVkIGF0CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5vdGlmaWNhdGlvbiBzZXJ2aWNlLgorCSAqLworCXZvaWQgcmVnaXN0ZXIoU3RyaW5nIHJlZ2lzdHJhdGlvbk5hbWUsIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQorCQkJdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFVucmVnaXN0ZXJzIGEgTm90aWZpY2F0aW9uTGlzdGVuZXIgZnJvbSB0aGUgdW5kZXJseWluZyBub3RpZmljYXRpb24gc2VydmljZS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVnaXN0cmF0aW9uTmFtZSBUaGUgdW5pcXVlIG5hbWUgcHJldmlvdXNseSB1c2VkIGZvciB0aGUgcmVnaXN0cmF0aW9uLgorCSAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIEluIGNhc2UgdGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQuCisJICovCisJdm9pZCBkZXJlZ2lzdGVyKFN0cmluZyByZWdpc3RyYXRpb25OYW1lKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uOworCisJLyoqCisJICogQ2xvc2VzIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyIGFuZCBhbGwgcmVnaXN0ZXJlZCBOb3RpZmljYXRpb25MaXN0ZW5lcnMKKwkgKiAKKwkgKiBAcGFyYW0gZGVyZWdpc3RlckFsbCBpZiB0cnVlLCBhbGwgTm90aWZpY2F0aW9uTGlzdGVuZXJzIGFyZSBhbHNvIGRlcmVnaXN0ZXJlZAorCSAqICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjbG9zaW5nLgorCSAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIEluIGNhc2UgdGhlIGxpc3RlbmVycyBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkIG9yCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hbmFnZXIgY2Fubm90IGJlIGNsb3NlZC4KKwkgKi8KKwl2b2lkIGNsb3NlKGJvb2xlYW4gZGVyZWdpc3RlckFsbCkgdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9BZ2dyZWdhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0FnZ3JlZ2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2ZmIyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9BZ2dyZWdhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnk7CisKKy8qKgorICogQWdncmVnYXRpb24gZW51bWVyYXRpb24uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFF1ZXJ5CisgKi8KK3B1YmxpYyBlbnVtIEFnZ3JlZ2F0aW9uIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBFbnVtZXJhdGlvbnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBObyBhZ2dyZWdhdGUgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZS4KKwkgKi8KKwlOT05FLAorCisJLyoqCisJICogVXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHJlc3VsdCByb3dzLgorCSAqLworCUNPVU5ULAorCisJLyoqCisJICogV2l0aGluIHRoZSByZXN1bHQgcm93cyBmb3IgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZSBhbGwgZGlzdGluY3QgdmFsdWVzIGFyZQorCSAqIGNvdW50ZWQuCisJICovCisJRElTVElOQ1RfQ09VTlQsCisKKwkvKioKKwkgKiBXaXRoaW4gdGhlIHJlc3VsdCByb3dzIGZvciB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIHRoZSBzbWFsbGVzdCB2YWx1ZSBpcworCSAqIHNlbGVjdGVkLiBPbmx5IGZvciBudW1lcmljYWwgdmFsdWVzLgorCSAqLworCU1JTklNVU0sCisKKwkvKioKKwkgKiBXaXRoaW4gdGhlIHJlc3VsdCByb3dzIGZvciB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIHRoZSBoaWdoZXN0IHZhbHVlIGlzCisJICogc2VsZWN0ZWQuIE9ubHkgZm9yIG51bWVyaWNhbCB2YWx1ZXMuCisJICovCisJTUFYSU1VTSwKKworCS8qKgorCSAqIE92ZXIgYWxsIHJlc3VsdCByb3dzIGZvciB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIHRoZSBhdmVyYWdlIHZhbHVlIGlzCisJICogY2FsY3VsYXRlZC4gT25seSBmb3IgbnVtZXJpY2FsIHZhbHVlcy4KKwkgKi8KKwlBVkVSQUdFLAorCisJLyoqCisJICogT3ZlciBhbGwgcmVzdWx0IHJvd3MgZm9yIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiB2YWx1ZQorCSAqIGlzIGNhbGN1bGF0ZWQuIE9ubHkgZm9yIG51bWVyaWNhbCB2YWx1ZXMuCisJICovCisJREVWSUFUSU9OLAorCisJLyoqCisJICogQWxsIHJlc3VsdCByb3dzIGZvciB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIGFyZSBzdW1tZWQuIE9ubHkgZm9yIG51bWVyaWNhbAorCSAqIHZhbHVlcy4KKwkgKi8KKwlTVU0sCisKKwkvKioKKwkgKiBXaXRoaW4gdGhlIHJlc3VsdCByb3dzIGZvciB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIGFsbCBkaXN0aW5jdCB2YWx1ZXMgYXJlCisJICogY29sbGVjdGVkLgorCSAqLworCURJU1RJTkNUCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9Cb29sZWFuT3BlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9Cb29sZWFuT3BlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2QxNDRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0Jvb2xlYW5PcGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnk7CisKKy8qKgorICogVGhlIG9wZXJhdG9yIGVudW1lcmF0aW9uLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDb25kaXRpb24KKyAqIEBzZWUgRmlsdGVyCisgKi8KK3B1YmxpYyBlbnVtIEJvb2xlYW5PcGVyYXRvciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gRW51bWVyYXRpb25zCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTG9naWNhbCBjb25qdW5jdGlvbi4KKwkgKi8KKwlBTkQsCisKKwkvKioKKwkgKiBMb2dpY2FsIGRpc2p1bmN0aW9uLgorCSAqLworCU9SLAorCisJLyoqCisJICogTG9naWNhbCBOZWdhdGlvbi4KKwkgKi8KKwlOT1QKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0JyYWNrZXRPcGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0JyYWNrZXRPcGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGE5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQnJhY2tldE9wZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworLyoqCisgKiBUaGUgYnJhY2tldCBvcGVyYXRvciBlbnVtZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBzZWUgQ29uZGl0aW9uCisgKiBAc2VlIEZpbHRlcgorICovCisKK3B1YmxpYyBlbnVtIEJyYWNrZXRPcGVyYXRvciB7CisJLyoqCisJICogTGVmdCBwYXJlbnRoZXNpcy4KKwkgKi8KKwlPUEVOLAorCisJLyoqCisJICogUmlnaHQgcGFyZW50aGVzaXMuCisJICovCisJQ0xPU0U7CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5FbnVtI3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlzd2l0Y2ggKHRoaXMpIHsKKwkJY2FzZSBPUEVOOgorCQkJcmV0dXJuICIoIjsKKwkJY2FzZSBDTE9TRToKKwkJCXJldHVybiAiKSI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gdGhpcy50b1N0cmluZygpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0NvbXBhcmlzb25PcGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0NvbXBhcmlzb25PcGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjNjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQ29tcGFyaXNvbk9wZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CisKKy8qKgorICogVGhlIHNlbGVjdGlvbiBvcGVyYXRpb25zIGRlZmluZSBxdWVyeSBpbnN0cnVjdGlvbnMgbGlrZSAiZXF1YWwiLCAiZ3JlYXRlciIsCisgKiBldGMuIFN1Y2ggb3BlcmF0aW9ucyBhcmUgY2FzZSBzZW5zaXRpdmUuIElmIGFuIGluc2Vuc2l0aXZlIGluc3RydWN0aW9uIGlzCisgKiByZXF1aXJlZCwgdGhlbiBpdHMgY291bnRlcnBhcnQgc3RhcnRpbmcgd2l0aCB0aGUgIkNJXyIgcHJlZml4IGhhcyB0byBiZSB1c2VkLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDb25kaXRpb24KKyAqIEBzZWUgRmlsdGVyCisgKi8KK3B1YmxpYyBlbnVtIENvbXBhcmlzb25PcGVyYXRvciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gRW51bWVyYXRpb25zCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogRXhhY3QgbWF0Y2gKKwkgKi8KKwlFUVVBTCwKKworCS8qKgorCSAqIE5vdCBlcXVhbCAoIT0pCisJICovCisJTk9UX0VRVUFMLAorCisJLyoqCisJICogTGVzcyB0aGFuICgmbHQ7KQorCSAqLworCUxFU1NfVEhBTiwKKworCS8qKgorCSAqIExlc3MgdGhhbiBlcXVhbCAoJmx0Oz0pCisJICovCisJTEVTU19USEFOX09SX0VRVUFMLAorCisJLyoqCisJICogR3JlYXRlciB0aGFuICgmZ3Q7KQorCSAqLworCUdSRUFURVJfVEhBTiwKKworCS8qKgorCSAqIEdyZWF0ZXIgdGhhbiBlcXVhbCAoJmd0Oz0pCisJICovCisJR1JFQVRFUl9USEFOX09SX0VRVUFMLAorCisJLyoqCisJICogSW4gc2V0LCB2YWx1ZSBjYW4gYmUgYSBzZXF1ZW5jZS4KKwkgKi8KKwlJTl9TRVQsCisKKwkvKioKKwkgKiBOb3QgaW4gc2V0LCB2YWx1ZSBjYW4gYmUgYSBzZXF1ZW5jZS4KKwkgKi8KKwlOT1RfSU5fU0VULAorCisJLyoqCisJICogbGlrZSwgdXNlIHBhdHRlcm4gbWF0Y2hpbmcsIHNlZSBQYXR0ZXJuIGZvciB0aGUgd2lsZGNhcmQgZGVmaW5pdGlvbnMuCisJICovCisJTElLRSwKKworCS8qKgorCSAqIE5vdCBMSUtFCisJICovCisJTk9UX0xJS0UsCisKKwkvKioKKwkgKiBFcXVhbC4gY2FzZSBpbnNlbnNpdGl2ZSBmb3Ige0BsaW5rIFZhbHVlVHlwZSNTVFJJTkd9CisJICovCisJQ0FTRV9JTlNFTlNJVElWRV9FUVVBTCwKKworCS8qKgorCSAqIE5vdCBlcXVhbC4gY2FzZSBpbnNlbnNpdGl2ZSBmb3Ige0BsaW5rIFZhbHVlVHlwZSNTVFJJTkd9CisJICovCisJQ0FTRV9JTlNFTlNJVElWRV9OT1RfRVFVQUwsCisKKwkvKioKKwkgKiBMZXNzIHRoYW4uIGNhc2UgaW5zZW5zaXRpdmUgZm9yIHtAbGluayBWYWx1ZVR5cGUjU1RSSU5HfQorCSAqLworCUNBU0VfSU5TRU5TSVRJVkVfTEVTU19USEFOLAorCisJLyoqCisJICogTGVzcyB0aGFuIGVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciB7QGxpbmsgVmFsdWVUeXBlI1NUUklOR30KKwkgKi8KKwlDQVNFX0lOU0VOU0lUSVZFX0xFU1NfVEhBTl9PUl9FUVVBTCwKKworCS8qKgorCSAqIEdyZWF0ZXIgdGhhbi4gY2FzZSBpbnNlbnNpdGl2ZSBmb3Ige0BsaW5rIFZhbHVlVHlwZSNTVFJJTkd9CisJICovCisJQ0FTRV9JTlNFTlNJVElWRV9HUkVBVEVSX1RIQU4sCisKKwkvKioKKwkgKiBHcmVhdGVyIHRoYW4gZXF1YWwuIGNhc2UgaW5zZW5zaXRpdmUgZm9yIHtAbGluayBWYWx1ZVR5cGUjU1RSSU5HfQorCSAqLworCUNBU0VfSU5TRU5TSVRJVkVfR1JFQVRFUl9USEFOX09SX0VRVUFMLAorCisJLyoqCisJICogSW4gc2V0LCB2YWx1ZSBjYW4gYmUgYSBzZXF1ZW5jZS4gY2FzZSBpbnNlbnNpdGl2ZSBmb3IKKwkgKiB7QGxpbmsgVmFsdWVUeXBlI1NUUklOR30KKwkgKi8KKwlDQVNFX0lOU0VOU0lUSVZFX0lOX1NFVCwKKworCS8qKgorCSAqIE5vdCBpbiBzZXQsIHZhbHVlIGNhbiBiZSBhIHNlcXVlbmNlLiBjYXNlIGluc2Vuc2l0aXZlIGZvcgorCSAqIHtAbGluayBWYWx1ZVR5cGUjU1RSSU5HfQorCSAqLworCUNBU0VfSU5TRU5TSVRJVkVfTk9UX0lOX1NFVCwKKworCS8qKgorCSAqIGxpa2UsIHVzZSBwYXR0ZXJuIG1hdGNoaW5nLCBzZWUgUGF0dGVybiBmb3IgdGhlIHdpbGRjYXJkIGRlZmluaXRpb25zLiBjYXNlCisJICogaW5zZW5zaXRpdmUgZm9yIERUX1NUUklORy4KKwkgKi8KKwlDQVNFX0lOU0VOU0lUSVZFX0xJS0UsCisKKwkvKioKKwkgKiBOb3QgTElLRSwgY2FzZSBpbnNlbnNpdGl2ZSBmb3IgRFRfU1RSSU5HLgorCSAqLworCUNBU0VfSU5TRU5TSVRJVkVfTk9UX0xJS0UsCisKKwkvKioKKwkgKiBWYWx1ZSBpcyBOVUxMCisJICovCisJSVNfTlVMTCwKKworCS8qKgorCSAqIFZhbHVlIGlzIG5vdCBOVUxMCisJICovCisJSVNfTk9UX05VTEwsCisKKwkvKioKKwkgKiBCZXR3ZWVuOyBzZWxlY3RzIGFsbCBpbnN0YW5jZXMgd2hlcmUgdGhlIHZhbHVlIG9mICdhdHRyJyBsaWVzIGJldHdlZW4gdGhlCisJICogZmlyc3QgdHdvIHZhbHVlcyBnaXZlbiBpbiAndmFsdWUnICh3aXRoICdhdHRyJywgJ3ZhbHVlJyBiZWluZyBlbGVtZW50cyBvZiB0aGUKKwkgKiBTZWxWYWx1ZSBzdHJ1Y3R1cmU7ICd2YWx1ZScgbXVzdCBiZSBvZiBkYXRhIHR5cGUgU18qKS4KKwkgKi8KKwlCRVRXRUVOOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29uZGl0aW9ufSBmb3IgZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0gYW5kIHZhbHVlLgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUge0Bjb2RlIEF0dHJpYnV0ZX0gdGhlIGNvbmRpdGlvbiB3aWxsIGJlIGFwcGxpZWQgdG8uCisJICogQHBhcmFtIHZhbHVlICAgICBUaGUgdmFsdWUuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ29uZGl0aW9ufSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ29uZGl0aW9uIGNyZWF0ZShBdHRyaWJ1dGUgYXR0cmlidXRlLCBPYmplY3QgdmFsdWUpIHsKKwkJcmV0dXJuIG5ldyBDb25kaXRpb24oYXR0cmlidXRlLCB0aGlzLCAiIiwgdmFsdWUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQYWNrYWdlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGlzIG9wZXJhdGlvbiByZXF1aXJlcyBhIHNlcXVlbmNlIHZhbHVlIGNvbnRhaW5lci4gVGhpcyBpcworCSAqIHRoZSBjYXNlIGZvciB0aGUgZm9sbG93aW5nIHR5cGVzOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yI0lOX1NFVH08L2xpPgorCSAqIDxsaT57QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yI05PVF9JTl9TRVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIENvbXBhcmlzb25PcGVyYXRvciNDQVNFX0lOU0VOU0lUSVZFX0lOX1NFVH08L2xpPgorCSAqIDxsaT57QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yI0NBU0VfSU5TRU5TSVRJVkVfTk9UX0lOX1NFVH08L2xpPgorCSAqIDxsaT57QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yI0JFVFdFRU59PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBUcnVlIGlmIHRoaXMgb3BlcmF0aW9uIGlzIG9uZSBvZiB0aG9zZSBsaXN0ZWQgYWJvdmUuCisJICovCisJYm9vbGVhbiByZXF1aXJlc1NlcXVlbmNlKCkgeworCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChJTl9TRVQsIE5PVF9JTl9TRVQsIENBU0VfSU5TRU5TSVRJVkVfSU5fU0VULCBDQVNFX0lOU0VOU0lUSVZFX05PVF9JTl9TRVQsIEJFVFdFRU4pCisJCQkJLmNvbnRhaW5zKHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0NvbmRpdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0NvbmRpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNTllNDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQ29uZGl0aW9uLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CisKKy8qKgorICogRGVzY3JpYmVzIGEgZmlsdGVyIGNvbmRpdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgQXR0cmlidXRlCisgKiBAc2VlIENvbXBhcmlzb25PcGVyYXRvcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uZGl0aW9uIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIEF0dHJpYnV0ZSBhdHRyaWJ1dGU7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZSB2YWx1ZTsKKwlwcml2YXRlIGZpbmFsIENvbXBhcmlzb25PcGVyYXRvciBjb21wYXJpc29uT3BlcmF0b3I7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlICAgICAgICAgIFRoZSB7QGxpbmsgQXR0cmlidXRlfSB0aGlzIGNvbmRpdGlvbiB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkIHRvLgorCSAqIEBwYXJhbSBjb21wYXJpc29uT3BlcmF0b3IgVGhlIGNvbmRpdGlvbiB7QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yfS4KKwkgKiBAcGFyYW0gdW5pdCAgICAgICAgICAgICAgIFRoZSB1bml0IG9mIHRoZSBjcmVhdGVkIHZhbHVlLgorCSAqIEBwYXJhbSBpbnB1dCAgICAgICAgICAgICAgVGhlIGNvbmRpdGlvbiB2YWx1ZS4KKwkgKi8KKwlDb25kaXRpb24oQXR0cmlidXRlIGF0dHJpYnV0ZSwgQ29tcGFyaXNvbk9wZXJhdG9yIGNvbXBhcmlzb25PcGVyYXRvciwgU3RyaW5nIHVuaXQsIE9iamVjdCBpbnB1dCkgeworCQl0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKKwkJdGhpcy5jb21wYXJpc29uT3BlcmF0b3IgPSBjb21wYXJpc29uT3BlcmF0b3I7CisJCXZhbHVlID0gY29tcGFyaXNvbk9wZXJhdG9yLnJlcXVpcmVzU2VxdWVuY2UoKSA/IGF0dHJpYnV0ZS5jcmVhdGVWYWx1ZVNlcSh1bml0LCBpbnB1dCkKKwkJCQk6IGF0dHJpYnV0ZS5jcmVhdGVWYWx1ZSh1bml0LCBpbnB1dCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdGFyZ2V0IHtAbGluayBBdHRyaWJ1dGV9LgorCSAqCisJICogQHJldHVybiBUaGUgdGFyZ2V0IHtAY29kZSBBdHRyaWJ1dGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKCkgeworCQlyZXR1cm4gYXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbmRpdGlvbiB7QGxpbmsgVmFsdWV9LgorCSAqCisJICogQHJldHVybiBUaGUgY29uZGl0aW9uIHtAY29kZSBWYWx1ZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFZhbHVlIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29uZGl0aW9uIHtAbGluayBDb21wYXJpc29uT3BlcmF0b3J9LgorCSAqCisJICogQHJldHVybiBUaGUgY29uZGl0aW9uIHtAY29kZSBDb21wYXJpc29uT3BlcmF0b3J9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDb21wYXJpc29uT3BlcmF0b3IgZ2V0Q29tcGFyaXNvbk9wZXJhdG9yKCkgeworCQlyZXR1cm4gY29tcGFyaXNvbk9wZXJhdG9yOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisJCWlmIChvdGhlciA9PSB0aGlzKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIENvbmRpdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUNvbmRpdGlvbiBjb25kaXRpb24gPSAoQ29uZGl0aW9uKSBvdGhlcjsKKworCQlyZXR1cm4gT2JqZWN0cy5lcXVhbHModGhpcy5hdHRyaWJ1dGUsIGNvbmRpdGlvbi5hdHRyaWJ1dGUpICYmIE9iamVjdHMuZXF1YWxzKHRoaXMudmFsdWUsIGNvbmRpdGlvbi52YWx1ZSkKKwkJCQkmJiBPYmplY3RzLmVxdWFscyh0aGlzLmNvbXBhcmlzb25PcGVyYXRvciwgY29uZGl0aW9uLmNvbXBhcmlzb25PcGVyYXRvcik7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gT2JqZWN0cy5oYXNoKGF0dHJpYnV0ZSwgdmFsdWUsIGNvbXBhcmlzb25PcGVyYXRvcik7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gYXR0cmlidXRlLmdldEVudGl0eVR5cGUoKS5nZXROYW1lKCkgKyAiLiIgKyBhdHRyaWJ1dGUuZ2V0TmFtZSgpICsgIiAiICsgY29tcGFyaXNvbk9wZXJhdG9yICsgIiAiICsgdmFsdWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0RhdGFBY2Nlc3NFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9EYXRhQWNjZXNzRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0NzdmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9EYXRhQWNjZXNzRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworLyoqCisgKiBUaHJvd24gdG8gaW5kaWNhdGUgZXJyb3JzIHdoaWxlIHF1ZXJ5aW5nIGRhdGEuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEYXRhQWNjZXNzRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTAyNDE4NDU1NTI3NDUxODQ1MUw7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgRGF0YUFjY2Vzc0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihtZXNzYWdlKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtZXNzYWdlICAgVGhlIGVycm9yIG1lc3NhZ2UuCisJICogQHBhcmFtIHRocm93YWJsZSBUaGUgb3JpZ2luIGNhdXNlLgorCSAqLworCXB1YmxpYyBEYXRhQWNjZXNzRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCXN1cGVyKG1lc3NhZ2UsIHRocm93YWJsZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyOWFjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDUxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRlcXVlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hTZXJ2aWNlOworCisvKioKKyAqIEEgZmlsdGVyIGlzIGEgc2VxdWVuY2Ugb2Yge0BsaW5rIEZpbHRlckl0ZW19cyBjb250YWluaW5nCisgKiB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yfXMgb3Ige0BsaW5rIENvbmRpdGlvbn1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBRdWVyeQorICogQHNlZSBTZWFyY2hRdWVyeQorICogQHNlZSBTZWFyY2hTZXJ2aWNlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGaWx0ZXIgaW1wbGVtZW50cyBJdGVyYWJsZTxGaWx0ZXJJdGVtPiB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBEZXF1ZTxGaWx0ZXJJdGVtPiBmaWx0ZXJJdGVtcyA9IG5ldyBBcnJheURlcXVlPD4oKTsKKwlwcml2YXRlIGZpbmFsIEZpbHRlckl0ZW0gb3BlcmF0b3JJdGVtOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG9wZXJhdG9ySXRlbSBXaWxsIGJlIGFkZGVkIGJldHdlZW4ge0BsaW5rIENvbmRpdGlvbn1zIG9yIG1lcmdlZAorCSAqICAgICAgICAgICAgICAgICAgICAgZmlsdGVycy4KKwkgKi8KKwlwcml2YXRlIEZpbHRlcihGaWx0ZXJJdGVtIG9wZXJhdG9ySXRlbSkgeworCQl0aGlzLm9wZXJhdG9ySXRlbSA9IG9wZXJhdG9ySXRlbTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGZpbHRlciB3aXRoIGFuIGluc3RhbmNlIElEIGNvbmRpdGlvbiBmb3IgZ2l2ZW4KKwkgKiB7QGxpbmsgRW50aXR5VHlwZX0gYW5kIGluc3RhbmNlIElELgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gaWQgICAgICAgICBUaGUgaW5zdGFuY2UgSUQuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCBmaWx0ZXIgaXMgcmV0dXJuZWQuCisJICogQHNlZSAjaWQoRW50aXR5VHlwZSwgU3RyaW5nKQorCSAqLworCXB1YmxpYyBzdGF0aWMgRmlsdGVyIGlkT25seShFbnRpdHlUeXBlIGVudGl0eVR5cGUsIFN0cmluZyBpZCkgeworCQlyZXR1cm4gYW5kKCkuaWQoZW50aXR5VHlwZSwgaWQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgZmlsdGVyIHdpdGggYW4gZm9yZWlnbiBJRCBjb25kaXRpb24gZm9yIGdpdmVuIHtAbGluayBSZWxhdGlvbn0KKwkgKiBhbmQgaW5zdGFuY2UgSUQuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb24gVGhlIHtAY29kZSBSZWxhdGlvbn0uCisJICogQHBhcmFtIGlkICAgICAgIFRoZSBpbnN0YW5jZSBJRC4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGZpbHRlciBpcyByZXR1cm5lZC4KKwkgKiBAc2VlICNpZChSZWxhdGlvbiwgU3RyaW5nKQorCSAqLworCXB1YmxpYyBzdGF0aWMgRmlsdGVyIGlkT25seShSZWxhdGlvbiByZWxhdGlvbiwgU3RyaW5nIGlkKSB7CisJCXJldHVybiBhbmQoKS5pZChyZWxhdGlvbiwgaWQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgZmlsdGVyIHdpdGggYW4gaW5zdGFuY2UgSURzIGNvbmRpdGlvbiBmb3IgZ2l2ZW4KKwkgKiB7QGxpbmsgRW50aXR5VHlwZX0gYW5kIGluc3RhbmNlIElEcy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIGlkcyAgICAgICAgVGhlIGluc3RhbmNlIElEcy4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGZpbHRlciBpcyByZXR1cm5lZC4KKwkgKiBAc2VlICNpZHMoRW50aXR5VHlwZSwgQ29sbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEZpbHRlciBpZHNPbmx5KEVudGl0eVR5cGUgZW50aXR5VHlwZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGlkcykgeworCQlyZXR1cm4gYW5kKCkuaWRzKGVudGl0eVR5cGUsIGlkcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXIgd2l0aCBhbiBmb3JlaWduIElEcyBjb25kaXRpb24gZm9yIGdpdmVuIHtAbGluayBSZWxhdGlvbn0KKwkgKiBhbmQgaW5zdGFuY2UgSURzLgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uIFRoZSB7QGNvZGUgUmVsYXRpb259LgorCSAqIEBwYXJhbSBpZHMgICAgICBUaGUgaW5zdGFuY2UgSURzLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgZmlsdGVyIGlzIHJldHVybmVkLgorCSAqIEBzZWUgI2lkcyhSZWxhdGlvbiwgQ29sbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEZpbHRlciBpZHNPbmx5KFJlbGF0aW9uIHJlbGF0aW9uLCBDb2xsZWN0aW9uPFN0cmluZz4gaWRzKSB7CisJCXJldHVybiBhbmQoKS5pZHMocmVsYXRpb24sIGlkcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXIgd2l0aCBhbiBpbnN0YW5jZSBuYW1lIGNvbmRpdGlvbiBmb3IgZ2l2ZW4KKwkgKiB7QGxpbmsgRW50aXR5VHlwZX0gYW5kIGluc3RhbmNlIG5hbWUgcGF0dGVybi4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIHBhdHRlcm4gICAgSXMgYWx3YXlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZAorCSAqICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgYXMgZm9sbG93czogIj8iIGZvciBvbmUgbWF0Y2hpbmcgY2hhcmFjdGVyIGFuZAorCSAqICAgICAgICAgICAgICAgICAgICIqIiBmb3IgYSBzZXF1ZW5jZSBvZiBtYXRjaGluZyBjaGFyYWN0ZXJzLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgZmlsdGVyIGlzIHJldHVybmVkLgorCSAqIEBzZWUgI25hbWUoRW50aXR5VHlwZSwgU3RyaW5nKQorCSAqLworCXB1YmxpYyBzdGF0aWMgRmlsdGVyIG5hbWVPbmx5KEVudGl0eVR5cGUgZW50aXR5VHlwZSwgU3RyaW5nIHBhdHRlcm4pIHsKKwkJcmV0dXJuIGFuZCgpLm5hbWUoZW50aXR5VHlwZSwgcGF0dGVybik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRoYXQgaW1wbGljaXRseSBhZGRzCisJICoge0BsaW5rIEJvb2xlYW5PcGVyYXRvciNBTkR9IHtAY29kZSBGaWx0ZXJJdGVtfXMgYmV0d2VlbiB7QGxpbmsgQ29uZGl0aW9ufXMgb3IKKwkgKiBtZXJnZWQgZmlsdGVycy4KKwkgKgorCSAqIDxwcmU+CisJICogRmlsdGVyIGZpbHRlciA9IEZpbHRlci5hbmQoKTsKKwkgKiBmaWx0ZXIuYWRkKGNvbmRpdGlvbkEpOyAvLyBjb25kaXRpb25BCisJICogZmlsdGVyLmFkZChjb25kaXRpb25CKTsgLy8gY29uZGl0aW9uQSBBTkQgY29uZGl0aW9uQgorCSAqIGZpbHRlci5pbnZlcnQoKTsgLy8gIShjb25kaXRpb25BIEFORCBjb25kaXRpb25CKQorCSAqIGZpbHRlci5tZXJnZShvdGhlckZpbHRlcik7IC8vICEoY29uZGl0aW9uQSBBTkQgY29uZGl0aW9uQikgQU5ECisJICogCQkJCQkJCS8vIChvdGhlckZpbHRlcikKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEByZXR1cm4gQSBuZXdseSBjcmVhdGVkIGZpbHRlciBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEZpbHRlciBhbmQoKSB7CisJCXJldHVybiBuZXcgRmlsdGVyKEZpbHRlckl0ZW0uQU5EKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdGhhdCBpbXBsaWNpdGx5IGFkZHMKKwkgKiB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yI09SfSB7QGNvZGUgRmlsdGVySXRlbX1zIGJldHdlZW4ge0BsaW5rIENvbmRpdGlvbn1zIG9yCisJICogbWVyZ2VkIGZpbHRlcnMuCisJICoKKwkgKiA8cHJlPgorCSAqIEZpbHRlciBmaWx0ZXIgPSBGaWx0ZXIub3IoKTsKKwkgKiBmaWx0ZXIuYWRkKGNvbmRpdGlvbkEpOyAvLyBjb25kaXRpb25BCisJICogZmlsdGVyLmFkZChjb25kaXRpb25CKTsgLy8gY29uZGl0aW9uQSBPUiBjb25kaXRpb25CCisJICogZmlsdGVyLmludmVydCgpOyAvLyAhKGNvbmRpdGlvbkEgT1IgY29uZGl0aW9uQikKKwkgKiBmaWx0ZXIubWVyZ2Uob3RoZXJGaWx0ZXIpOyAvLyAhKGNvbmRpdGlvbkEgT1IgY29uZGl0aW9uQikgT1Igb3RoZXJGaWx0ZXIKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEByZXR1cm4gQSBuZXdseSBjcmVhdGVkIGZpbHRlciBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEZpbHRlciBvcigpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXIoRmlsdGVySXRlbS5PUik7CisJfQorCisJLyoqCisJICogQWRkcyBhbGwge0BsaW5rIENvbmRpdGlvbn1zIHRvIHRoaXMgZmlsdGVyLgorCSAqCisJICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIHtAbGluayBDb25kaXRpb259cyB0aGF0IHdpbGwgYmUgYWRkZWQuCisJICogQHJldHVybiBSZXR1cm5zIHRoaXMgZmlsdGVyLgorCSAqIEBzZWUgRmlsdGVyI2FkZChDb25kaXRpb24pCisJICovCisJcHVibGljIEZpbHRlciBhZGRBbGwoTGlzdDxDb25kaXRpb24+IGNvbmRpdGlvbnMpIHsKKwkJY29uZGl0aW9ucy5mb3JFYWNoKHRoaXM6OmFkZCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYWxsIHtAbGluayBDb25kaXRpb259cyB0byB0aGlzIGZpbHRlci4KKwkgKgorCSAqIEBwYXJhbSBjb25kaXRpb25zIFRoZSB7QGxpbmsgQ29uZGl0aW9ufXMgdGhhdCB3aWxsIGJlIGFkZGVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGlzIGZpbHRlci4KKwkgKiBAc2VlIEZpbHRlciNhZGQoQ29uZGl0aW9uKQorCSAqLworCXB1YmxpYyBGaWx0ZXIgYWRkQWxsKENvbmRpdGlvbi4uLiBjb25kaXRpb25zKSB7CisJCUFycmF5cy5zdHJlYW0oY29uZGl0aW9ucykuZm9yRWFjaCh0aGlzOjphZGQpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgbmV3IGluc3RhbmNlIElEIGNvbmRpdGlvbiAoe0BsaW5rIENvbXBhcmlzb25PcGVyYXRvciNFUVVBTH0pIGZvciBnaXZlbgorCSAqIHtAbGluayBFbnRpdHlUeXBlfSBhbmQgaW5zdGFuY2UgSUQgdG8gdGhpcyBmaWx0ZXIuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBpZCAgICAgICAgIFRoZSBpbnN0YW5jZSBJRC4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhpcyBmaWx0ZXIuCisJICogQHNlZSAjYWRkKENvbmRpdGlvbikKKwkgKi8KKwlwdWJsaWMgRmlsdGVyIGlkKEVudGl0eVR5cGUgZW50aXR5VHlwZSwgU3RyaW5nIGlkKSB7CisJCWFkZChDb21wYXJpc29uT3BlcmF0b3IuRVFVQUwuY3JlYXRlKGVudGl0eVR5cGUuZ2V0SURBdHRyaWJ1dGUoKSwgaWQpKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhIG5ldyBmb3JlaWduIElEIGNvbmRpdGlvbiAoe0BsaW5rIENvbXBhcmlzb25PcGVyYXRvciNFUVVBTH0pIGZvciBnaXZlbgorCSAqIHtAbGluayBSZWxhdGlvbn0gYW5kIGluc3RhbmNlIElEIHRvIHRoaXMgZmlsdGVyLgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uIFRoZSB7QGNvZGUgUmVsYXRpb259LgorCSAqIEBwYXJhbSBpZCAgICAgICBUaGUgaW5zdGFuY2UgSUQuCisJICogQHJldHVybiBSZXR1cm5zIHRoaXMgZmlsdGVyLgorCSAqIEBzZWUgI2FkZChDb25kaXRpb24pCisJICovCisJcHVibGljIEZpbHRlciBpZChSZWxhdGlvbiByZWxhdGlvbiwgU3RyaW5nIGlkKSB7CisJCWFkZChDb21wYXJpc29uT3BlcmF0b3IuRVFVQUwuY3JlYXRlKHJlbGF0aW9uLmdldEF0dHJpYnV0ZSgpLCBpZCkpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgbmV3IGluc3RhbmNlIElEcyBjb25kaXRpb24gKHtAbGluayBDb21wYXJpc29uT3BlcmF0b3IjSU5fU0VUfSkgZm9yCisJICogZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9IGFuZCBpbnN0YW5jZSBJRHMgdG8gdGhpcyBmaWx0ZXIuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBpZHMgICAgICAgIFRoZSBpbnN0YW5jZSBJRHMuCisJICogQHJldHVybiBSZXR1cm5zIHRoaXMgZmlsdGVyCisJICogQHNlZSAjYWRkKENvbmRpdGlvbikKKwkgKi8KKwlwdWJsaWMgRmlsdGVyIGlkcyhFbnRpdHlUeXBlIGVudGl0eVR5cGUsIENvbGxlY3Rpb248U3RyaW5nPiBpZHMpIHsKKwkJYWRkKENvbXBhcmlzb25PcGVyYXRvci5JTl9TRVQuY3JlYXRlKGVudGl0eVR5cGUuZ2V0SURBdHRyaWJ1dGUoKSwKKwkJCQlpZHMuc3RyZWFtKCkuZGlzdGluY3QoKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpKSk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBuZXcgZm9yZWlnbiBJRHMgY29uZGl0aW9uICh7QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yI0lOX1NFVH0pIGZvcgorCSAqIGdpdmVuIHtAbGluayBSZWxhdGlvbn0gYW5kIGluc3RhbmNlIElEcyB0byB0aGlzIGZpbHRlci4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGlvbiBUaGUge0Bjb2RlIFJlbGF0aW9ufS4KKwkgKiBAcGFyYW0gaWRzICAgICAgVGhlIGluc3RhbmNlIElEcy4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhpcyBmaWx0ZXIuCisJICogQHNlZSAjYWRkKENvbmRpdGlvbikKKwkgKi8KKwlwdWJsaWMgRmlsdGVyIGlkcyhSZWxhdGlvbiByZWxhdGlvbiwgQ29sbGVjdGlvbjxTdHJpbmc+IGlkcykgeworCQlhZGQoQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVC5jcmVhdGUocmVsYXRpb24uZ2V0QXR0cmlidXRlKCksIGlkcy5zdHJlYW0oKS5kaXN0aW5jdCgpLnRvQXJyYXkoU3RyaW5nW106Om5ldykpKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhIGluc3RhbmNlIG5hbWUgY29uZGl0aW9uICh7QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yI0xJS0V9KSBmb3IgZ2l2ZW4KKwkgKiB7QGxpbmsgRW50aXR5VHlwZX0gYW5kIGluc3RhbmNlIG5hbWUgcGF0dGVybi4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5PVEU6PC9iPiBJZiB0aGUgZ2l2ZW4gcGF0dGVybiBlcXVhbHMgIioiLCB0aGVuIG5vIHtAbGluayBDb25kaXRpb259IHdpbGwKKwkgKiBiZSBhZGRlZCBzaW5jZSAiKiIgbWVhbnMgdGFrZSBhbGwuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBwYXR0ZXJuICAgIElzIGFsd2F5cyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQKKwkgKiAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6ICI/IiBmb3Igb25lIG1hdGNoaW5nIGNoYXJhY3RlciBhbmQKKwkgKiAgICAgICAgICAgICAgICAgICAiKiIgZm9yIGEgc2VxdWVuY2Ugb2YgbWF0Y2hpbmcgY2hhcmFjdGVycy4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhpcyBmaWx0ZXIuCisJICogQHNlZSAjYWRkKENvbmRpdGlvbikKKwkgKi8KKwlwdWJsaWMgRmlsdGVyIG5hbWUoRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBTdHJpbmcgcGF0dGVybikgeworCQlpZiAoISIqIi5lcXVhbHMocGF0dGVybikpIHsKKwkJCWFkZChDb21wYXJpc29uT3BlcmF0b3IuTElLRS5jcmVhdGUoZW50aXR5VHlwZS5nZXROYW1lQXR0cmlidXRlKCksIHBhdHRlcm4pKTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBDb25kaXRpb259IHRvIHRoaXMgZmlsdGVyJ3Mge0BsaW5rIEZpbHRlckl0ZW19IHNlcXVlbmNlLgorCSAqCisJICogQHBhcmFtIGNvbmRpdGlvbiB7QGNvZGUgQ29uZGl0aW9ufSB0aGF0IHdpbGwgYmUgYWRkZWQuCisJICogQHJldHVybiBSZXR1cm5zIHRoaXMgZmlsdGVyLgorCSAqLworCXB1YmxpYyBGaWx0ZXIgYWRkKENvbmRpdGlvbiBjb25kaXRpb24pIHsKKwkJaW5zZXJ0T3BlcmF0b3IoKTsKKwkJZmlsdGVySXRlbXMuYWRkTGFzdChuZXcgRmlsdGVySXRlbShjb25kaXRpb24pKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogTWVyZ2VzIGFsbCBnaXZlbiBmaWx0ZXJzIHdpdGggdGhpcyBmaWx0ZXIuCisJICoKKwkgKiBAcGFyYW0gZmlsdGVycyBGaWx0ZXJzIHRoYXQgd2lsbCBiZSBtZXJnZWQuCisJICogQHJldHVybiBSZXR1cm5zIHRoaXMgZmlsdGVyLgorCSAqIEBzZWUgI21lcmdlKEZpbHRlcikKKwkgKi8KKwlwdWJsaWMgRmlsdGVyIG1lcmdlKExpc3Q8RmlsdGVyPiBmaWx0ZXJzKSB7CisJCWZpbHRlcnMuc3RyZWFtKCkuZm9yRWFjaCh0aGlzOjptZXJnZSk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIE1lcmdlcyBhbGwgZ2l2ZW4gZmlsdGVycyB3aXRoIHRoaXMgZmlsdGVyLgorCSAqCisJICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyB0aGF0IHdpbGwgYmUgbWVyZ2VkLgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGlzIGZpbHRlci4KKwkgKiBAc2VlICNtZXJnZShGaWx0ZXIpCisJICovCisJcHVibGljIEZpbHRlciBtZXJnZShGaWx0ZXIuLi4gZmlsdGVycykgeworCQlBcnJheXMuc3RyZWFtKGZpbHRlcnMpLmZvckVhY2godGhpczo6bWVyZ2UpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIEZpbHRlckl0ZW19cyBvZiB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSBhZGRlZCB0byB0aGlzIGZpbHRlci4gSWYKKwkgKiByZXF1aXJlZCwgdGhlbiBwYXJlbnRoZXNpcyBhcmUgaW1wbGljaXRseSBhZGRlZCBhcyBzaG93biBpbiB0aGUgZXhhbXBsZQorCSAqIGJlbG93OgorCSAqCisJICogPHByZT4KKwkgKiBGaWx0ZXIgZmlsdGVyMSA9IEZpbHRlci5hbmQoKTsKKwkgKiBDb25kaXRpb24gYSA9IC4uLjsKKwkgKiBDb25kaXRpb24gYiA9IC4uLjsKKwkgKiBmaWx0ZXIxLmFkZEFsbChhLCBiKTsgLy8gYSBBTkQgYgorCSAqCisJICogRmlsdGVyIGZpbHRlcjIgPSBGaWx0ZXIub3IoKTsKKwkgKiBDb25kaXRpb24gYyA9IC4uLjsKKwkgKiBDb25kaXRpb24gZCA9IC4uLjsKKwkgKiBDb25kaXRpb24gZSA9IC4uLjsKKwkgKiBmaWx0ZXIyLmFkZEFsbChjLCBkLCBlKTsgLy8gYyBPUiBkIE9SIGUKKwkgKgorCSAqIEZpbHRlciBmaWx0ZXIgPSBGaWx0ZXIub3IoKTsKKwkgKiBmaWx0ZXIubWVyZ2UoZmlsdGVyMSwgZmlsdGVyMik7IC8vIChmaWx0ZXIxKSBPUiBmaWx0ZXIyCisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gZmlsdGVyIEZpbHRlciB0aGF0IHdpbGwgYmUgbWVyZ2VkLgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGlzIGZpbHRlci4KKwkgKi8KKwlwdWJsaWMgRmlsdGVyIG1lcmdlKEZpbHRlciBmaWx0ZXIpIHsKKwkJYm9vbGVhbiBhZGRCcmFja2V0cyA9IGZpbHRlci5oYXNNdWx0aXBsZSgpICYmIG9wZXJhdG9ySXRlbSAhPSBmaWx0ZXIub3BlcmF0b3JJdGVtICYmICFmaWx0ZXIuaXNJbnZlcnRlZCgpOworCQlpbnNlcnRPcGVyYXRvcigpOworCisJCWlmIChhZGRCcmFja2V0cykgeworCQkJZmlsdGVySXRlbXMuYWRkTGFzdChGaWx0ZXJJdGVtLk9QRU4pOworCQl9CisKKwkJZmlsdGVyLmZpbHRlckl0ZW1zLnN0cmVhbSgpLmZvckVhY2goZmlsdGVySXRlbXM6OmFkZExhc3QpOworCisJCWlmIChhZGRCcmFja2V0cykgeworCQkJZmlsdGVySXRlbXMuYWRkTGFzdChGaWx0ZXJJdGVtLkNMT1NFKTsKKwkJfQorCisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEludmVydHMgdGhpcyBmaWx0ZXIgYnkgcHJlcGVuZGluZyB0aGUge0BsaW5rIEJvb2xlYW5PcGVyYXRvciNOT1R9IHRvIHRoZQorCSAqIHtAbGluayBGaWx0ZXJJdGVtfSBzZXF1ZW5jZSBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzOgorCSAqCisJICogPHByZT4KKwkgKiAvLyBpbnZlcnRpbmcgYW4gQU5EIGZpbHRlcgorCSAqIEZpbHRlciBhbmRGaWx0ZXIgPSBGaWx0ZXIuYW5kKCk7CisJICogQ29uZGl0aW9uIGEgPSAuLi47ICAgICAgLy8gYW55IGNvbmRpdGlvbgorCSAqIENvbmRpdGlvbiBiID0gLi4uOyAgICAgIC8vIGFub3RoZXIgY29uZGl0aW9uCisJICogYW5kRmlsdGVyLmFkZEFsbChhLCBiKTsgLy8gYSBBTkQgYgorCSAqIGFuZEZpbHRlci5pbnZlcnQoKTsgICAgIC8vICEoYSBBTkQgYikKKwkgKgorCSAqIC8vIGludmVydGluZyBhbiBPUiBmaWx0ZXIKKwkgKiBGaWx0ZXIgb3JGaWx0ZXIgPSBGaWx0ZXIub3IoKTsKKwkgKiBDb25kaXRpb24gYSA9IC4uLjsgICAgIC8vIGFueSBjb25kaXRpb24KKwkgKiBDb25kaXRpb24gYiA9IC4uLjsgICAgIC8vIGFub3RoZXIgY29uZGl0aW9uCisJICogb3JGaWx0ZXIuYWRkQWxsKGEsIGIpOyAvLyBhIE9SIGIKKwkgKiBvckZpbHRlci5pbnZlcnQoKTsgICAgIC8vICEoYSBPUiBiKQorCSAqIG9yRmlsdGVyLmludmVydCgpOyAgICAgLy8gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0mZ3Q7IGZpbHRlciBpcyBhbHJlYWR5IGludmVydGVkIQorCSAqIDwvcHJlPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHRoaXMgZmlsdGVyLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBlaXRoZXIgaWYgdGhlIGN1cnJlbnQgc2V0IG9mIGNvbmRpdGlvbnMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlbXB0eSBvciB0aGlzIGZpbHRlciBpcyBhbHJlYWR5IGludmVydGVkLgorCSAqLworCXB1YmxpYyBGaWx0ZXIgaW52ZXJ0KCkgeworCQlpZiAoZmlsdGVySXRlbXMuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDdXJyZW50IHNldCBvZiBjb25kaXRpb25zIGlzIGVtcHR5LiIpOworCQl9CisKKwkJaWYgKGlzSW52ZXJ0ZWQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ3VycmVudCBzZXQgb2YgY29uZGl0aW9ucyBpcyBhbHJlYWR5IGludmVydGVkLiIpOworCQl9IGVsc2UgaWYgKGhhc011bHRpcGxlKCkpIHsKKwkJCWZpbHRlckl0ZW1zLmFkZEZpcnN0KEZpbHRlckl0ZW0uT1BFTik7CisJCQlmaWx0ZXJJdGVtcy5hZGRMYXN0KEZpbHRlckl0ZW0uQ0xPU0UpOworCQl9CisKKwkJZmlsdGVySXRlbXMuYWRkRmlyc3QoRmlsdGVySXRlbS5OT1QpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGZpbHRlciBoYXMgbm8gY29uZGl0aW9ucyBhdCBhbGwuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIGZhbHNlfSBpZiBhdCBsZWFzdCBvbmUge0BsaW5rIENvbmRpdGlvbn0gaXMgY29udGFpbmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW10cHR5KCkgeworCQlyZXR1cm4gZmlsdGVySXRlbXMuaXNFbXB0eSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBzZXF1ZW50aWFsIHN0cmVhbSB3aXRoIHRoZSBpbnRlcm5hbGx5IHN0b3JlZCB7QGxpbmsgRmlsdGVySXRlbX1zIGFzCisJICogaXRzIHNvdXJjZS4KKwkgKgorCSAqIEByZXR1cm4gQSBzdHJlYW0gb3ZlciB0aGUgY29udGFpbmVkIHtAY29kZSBGaWx0ZXJJdGVtfXMgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmVhbTxGaWx0ZXJJdGVtPiBzdHJlYW0oKSB7CisJCXJldHVybiBmaWx0ZXJJdGVtcy5zdHJlYW0oKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHtAbGluayBGaWx0ZXJJdGVtfXMgY29udGFpbmVkIGluIHRoaXMgZmlsdGVyIGluCisJICogcHJvcGVyIHNlcXVlbmNlLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCB0aGUge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfQorCSAqICAgICAgICAgb3BlcmF0aW9uLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxGaWx0ZXJJdGVtPiBpdGVyYXRvcigpIHsKKwkJSXRlcmF0b3I8RmlsdGVySXRlbT4gaW50ZXJuYWwgPSBmaWx0ZXJJdGVtcy5pdGVyYXRvcigpOworCQlyZXR1cm4gbmV3IEl0ZXJhdG9yPEZpbHRlckl0ZW0+KCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisJCQkJcmV0dXJuIGludGVybmFsLmhhc05leHQoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgRmlsdGVySXRlbSBuZXh0KCkgeworCQkJCXJldHVybiBpbnRlcm5hbC5uZXh0KCk7CisJCQl9CisJCX07CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIElmIHJlcXVpcmVkIHRoZSB7QGxpbmsgI29wZXJhdG9ySXRlbX0gaXMgYWRkZWQgdG8gdGhlIGVuZCAodGFpbCkgb2YgdGhlCisJICoge0BsaW5rIEZpbHRlckl0ZW19IHNlcXVlbmNlLgorCSAqLworCXByaXZhdGUgdm9pZCBpbnNlcnRPcGVyYXRvcigpIHsKKwkJaWYgKCFmaWx0ZXJJdGVtcy5pc0VtcHR5KCkpIHsKKwkJCWZpbHRlckl0ZW1zLmFkZExhc3Qob3BlcmF0b3JJdGVtKTsKKwkJfQorCX0KKworCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciB0aGUge0BsaW5rIEZpbHRlckl0ZW19IHNlcXVlbmNlIHN0YXJ0cyB3aXRoIHRoZQorCSAqIHtAbGluayBCb29sZWFuT3BlcmF0b3IjTk9UfS4KKwkgKgorCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGZpbHRlciBpcyBpbnZlcnRlZC4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbnZlcnRlZCgpIHsKKwkJcmV0dXJuICFmaWx0ZXJJdGVtcy5pc0VtcHR5KCkgJiYgRmlsdGVySXRlbS5OT1QgPT0gZmlsdGVySXRlbXMuZ2V0Rmlyc3QoKTsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgbXVsdGlwbGUge0BsaW5rIEZpbHRlckl0ZW19cyBhcmUgY29udGFpbmVkLgorCSAqCisJICogQHJldHVybiBUcnVlIGlmIG11bHRpcGxlIHtAY29kZSBGaWx0ZXJJdGVtfXMgYXJlIGNvbnRhaW5lZC4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaGFzTXVsdGlwbGUoKSB7CisJCXJldHVybiBmaWx0ZXJJdGVtcy5zaXplKCkgPiAxOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisJCWlmIChvdGhlciA9PSB0aGlzKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIEZpbHRlcikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKSBvdGhlcjsKKworCQkvLyBEZXF1ZSBkb2VzIG5vdCBpbXBsZW1lbnQgZXF1YWxzCisJCXJldHVybiBBcnJheXMuZXF1YWxzKHRoaXMuZmlsdGVySXRlbXMudG9BcnJheShuZXcgRmlsdGVySXRlbVswXSksIGZpbHRlci5maWx0ZXJJdGVtcy50b0FycmF5KG5ldyBGaWx0ZXJJdGVtWzBdKSkKKwkJCQkmJiBPYmplY3RzLmVxdWFscyh0aGlzLm9wZXJhdG9ySXRlbSwgZmlsdGVyLm9wZXJhdG9ySXRlbSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gT2JqZWN0cy5oYXNoKGZpbHRlckl0ZW1zLCBvcGVyYXRvckl0ZW0pOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHRoaXMuc3RyZWFtKCkubWFwKGkgLT4gT2JqZWN0cy50b1N0cmluZyhpKSkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiIpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvRmlsdGVySXRlbS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0ZpbHRlckl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI4OTdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0ZpbHRlckl0ZW0uamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCisvKioKKyAqIEZpbHRlciBpdGVtIGNvbnRhaW5zIGVpdGhlciBhIHtAbGluayBDb25kaXRpb259IG9yIGFuCisgKiB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yfS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpbHRlckl0ZW0geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnRhaW5zIHRoZSB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yI0FORH0uCisJICovCisJc3RhdGljIGZpbmFsIEZpbHRlckl0ZW0gQU5EID0gbmV3IEZpbHRlckl0ZW0oQm9vbGVhbk9wZXJhdG9yLkFORCk7CisKKwkvKioKKwkgKiBDb250YWlucyB0aGUge0BsaW5rIEJvb2xlYW5PcGVyYXRvciNPUn0uCisJICovCisJc3RhdGljIGZpbmFsIEZpbHRlckl0ZW0gT1IgPSBuZXcgRmlsdGVySXRlbShCb29sZWFuT3BlcmF0b3IuT1IpOworCisJLyoqCisJICogQ29udGFpbnMgdGhlIHtAbGluayBCb29sZWFuT3BlcmF0b3IjTk9UfS4KKwkgKi8KKwlzdGF0aWMgZmluYWwgRmlsdGVySXRlbSBOT1QgPSBuZXcgRmlsdGVySXRlbShCb29sZWFuT3BlcmF0b3IuTk9UKTsKKworCS8qKgorCSAqIENvbnRhaW5zIHRoZSB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yI09QRU59LgorCSAqLworCXN0YXRpYyBmaW5hbCBGaWx0ZXJJdGVtIE9QRU4gPSBuZXcgRmlsdGVySXRlbShCcmFja2V0T3BlcmF0b3IuT1BFTik7CisKKwkvKioKKwkgKiBDb250YWlucyB0aGUge0BsaW5rIEJvb2xlYW5PcGVyYXRvciNDTE9TRX0uCisJICovCisJc3RhdGljIGZpbmFsIEZpbHRlckl0ZW0gQ0xPU0UgPSBuZXcgRmlsdGVySXRlbShCcmFja2V0T3BlcmF0b3IuQ0xPU0UpOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgQ29uZGl0aW9uIGNvbmRpdGlvbjsKKwlwcml2YXRlIGZpbmFsIEJvb2xlYW5PcGVyYXRvciBib29sZWFuT3BlcmF0b3I7CisJcHJpdmF0ZSBmaW5hbCBCcmFja2V0T3BlcmF0b3IgYnJhY2tldE9wZXJhdG9yOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvbmRpdGlvbiBUaGUge0BsaW5rIENvbmRpdGlvbn0uCisJICovCisJRmlsdGVySXRlbShDb25kaXRpb24gY29uZGl0aW9uKSB7CisJCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCQl0aGlzLmJyYWNrZXRPcGVyYXRvciA9IG51bGw7CisJCXRoaXMuYm9vbGVhbk9wZXJhdG9yID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBib29sZWFuT3BlcmF0b3IgVGhlIHtAbGluayBCb29sZWFuT3BlcmF0b3J9LgorCSAqLworCXByaXZhdGUgRmlsdGVySXRlbShCb29sZWFuT3BlcmF0b3IgYm9vbGVhbk9wZXJhdG9yKSB7CisJCXRoaXMuY29uZGl0aW9uID0gbnVsbDsKKwkJdGhpcy5icmFja2V0T3BlcmF0b3IgPSBudWxsOworCQl0aGlzLmJvb2xlYW5PcGVyYXRvciA9IGJvb2xlYW5PcGVyYXRvcjsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBicmFja2V0b3BlcmF0b3IgVGhlIHtAbGluayBCcmFja2V0T3BlcmF0b3J9LgorCSAqLworCXByaXZhdGUgRmlsdGVySXRlbShCcmFja2V0T3BlcmF0b3IgYnJhY2tldG9wZXJhdG9yKSB7CisJCXRoaXMuY29uZGl0aW9uID0gbnVsbDsKKwkJdGhpcy5ib29sZWFuT3BlcmF0b3IgPSBudWxsOworCQl0aGlzLmJyYWNrZXRPcGVyYXRvciA9IGJyYWNrZXRvcGVyYXRvcjsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBhbiB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yfSBpcyBjb250YWluZWQuCisJICoKKwkgKiBAcmV0dXJuIFRydWUgaWYgYW4ge0Bjb2RlIEJvb2xlYW5PcGVyYXRvcn0gaXMgY29udGFpbmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhbk9wZXJhdG9yKCkgeworCQlyZXR1cm4gYm9vbGVhbk9wZXJhdG9yICE9IG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29udGFpbmVkIHtAbGluayBCb29sZWFuT3BlcmF0b3J9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEJvb2xlYW5PcGVyYXRvcn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIGlmIHtAY29kZSBCb29sZWFuT3BlcmF0b3J9IGlzIG5vdAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZC4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbk9wZXJhdG9yIGdldEJvb2xlYW5PcGVyYXRvcigpIHsKKwkJaWYgKGlzQm9vbGVhbk9wZXJhdG9yKCkpIHsKKwkJCXJldHVybiBib29sZWFuT3BlcmF0b3I7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdGVtIGRvZXMgbm90IGNvbnRhaW4gYW4gYm9vbGVhbk9wZXJhdG9yLiIpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGFuIHtAbGluayBDb25kaXRpb259IGlzIGNvbnRhaW5lZC4KKwkgKgorCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbiB7QGNvZGUgQ29uZGl0aW9ufSBpcyBjb250YWluZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDb25kaXRpb24oKSB7CisJCXJldHVybiBjb25kaXRpb24gIT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb250YWluZWQge0BsaW5rIENvbmRpdGlvbn0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ29uZGl0aW9ufSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0Bjb2RlIENvbmRpdGlvbn0gaXMgbm90IGNvbnRhaW5lZC4KKwkgKi8KKwlwdWJsaWMgQ29uZGl0aW9uIGdldENvbmRpdGlvbigpIHsKKwkJaWYgKGlzQ29uZGl0aW9uKCkpIHsKKwkJCXJldHVybiBjb25kaXRpb247CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdGVtIGRvZXMgbm90IGNvbnRhaW4gYSBjb25kaXRpb24uIik7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgYW4ge0BsaW5rIEJyYWNrZXJPcGVyYXRvcn0gaXMgY29udGFpbmVkLgorCSAqCisJICogQHJldHVybiBUcnVlIGlmIGFuIHtAY29kZSBCcmFja2V0T3BlcmF0b3J9IGlzIGNvbnRhaW5lZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0JyYWNrZXRPcGVyYXRvcigpIHsKKwkJcmV0dXJuIGJyYWNrZXRPcGVyYXRvciAhPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbnRhaW5lZCB7QGxpbmsgQ29uZGl0aW9ufS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBDb25kaXRpb259IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGNvZGUgQ29uZGl0aW9ufSBpcyBub3QgY29udGFpbmVkLgorCSAqLworCXB1YmxpYyBCcmFja2V0T3BlcmF0b3IgZ2V0QnJhY2tldE9wZXJhdG9yKCkgeworCQlpZiAoaXNCcmFja2V0T3BlcmF0b3IoKSkgeworCQkJcmV0dXJuIGJyYWNrZXRPcGVyYXRvcjsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0ZW0gZG9lcyBub3QgY29udGFpbiBhIGNvbmRpdGlvbi4iKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworCQlpZiAob3RoZXIgPT0gdGhpcykgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBGaWx0ZXJJdGVtKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJRmlsdGVySXRlbSBmaWx0ZXJJdGVtID0gKEZpbHRlckl0ZW0pIG90aGVyOworCisJCXJldHVybiBPYmplY3RzLmVxdWFscyh0aGlzLmNvbmRpdGlvbiwgZmlsdGVySXRlbS5jb25kaXRpb24pCisJCQkJJiYgT2JqZWN0cy5lcXVhbHModGhpcy5ib29sZWFuT3BlcmF0b3IsIGZpbHRlckl0ZW0uYm9vbGVhbk9wZXJhdG9yKQorCQkJCSYmIE9iamVjdHMuZXF1YWxzKHRoaXMuYnJhY2tldE9wZXJhdG9yLCBmaWx0ZXJJdGVtLmJyYWNrZXRPcGVyYXRvcik7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gT2JqZWN0cy5oYXNoKGNvbmRpdGlvbiwgYm9vbGVhbk9wZXJhdG9yLCBicmFja2V0T3BlcmF0b3IpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGlzQm9vbGVhbk9wZXJhdG9yKCkpIHsKKwkJCXJldHVybiAiICIgKyBib29sZWFuT3BlcmF0b3IudG9TdHJpbmcoKSArICIgIjsKKwkJfSBlbHNlIGlmIChpc0JyYWNrZXRPcGVyYXRvcigpKSB7CisJCQlyZXR1cm4gYnJhY2tldE9wZXJhdG9yLnRvU3RyaW5nKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gY29uZGl0aW9uLnRvU3RyaW5nKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9Kb2luVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0pvaW5UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlNWNlNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9Kb2luVHlwZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnk7CisKKy8qKgorICogSm9pblR5cGUgZW51bWVyYXRpb24uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFF1ZXJ5CisgKi8KK3B1YmxpYyBlbnVtIEpvaW5UeXBlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBFbnVtZXJhdGlvbnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBFbmZvcmNlcyBhbiBpbm5lciBqb2luLgorCSAqLworCUlOTkVSLAorCisJLyoqCisJICogRW5mb3JjZXMgYW4gb3V0ZXIgam9pbi4KKwkgKi8KKwlPVVRFUgorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvUXVlcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9RdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNGYyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvUXVlcnkuamF2YQpAQCAtMCwwICsxLDM1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CisKKy8qKgorICogUHJvdmlkZXMgbWV0aG9kcyB0byBlYXNpbHkgYnVpbGQgcXVlcmllcyBieSBhZGRpbmcgc2VsZWN0LCBqb2luLCBncm91cCBieSBhbmQKKyAqIG9yZGVyIGJ5IHN0YXRlbWVudHMuIEZpbmFsbHkgYW4gb3B0aW9uYWwge0BsaW5rIEZpbHRlcn0gbWF5IGJlIGdpdmVuIHRvCisgKiBzZWxlY3QgZGF0YSB0aGF0IG1hdGNoIHNwZWNpZmllZCBjcml0ZXJpYS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgRW50aXR5VHlwZQorICogQHNlZSBBdHRyaWJ1dGUKKyAqIEBzZWUgQWdncmVnYXRpb24KKyAqIEBzZWUgUmVsYXRpb24KKyAqIEBzZWUgSm9pblR5cGUKKyAqIEBzZWUgUmVzdWx0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUXVlcnkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9IHdpbGwgYmUgcXVlcmllZCBpbiBhbnkgd2F5IChzZWxlY3Qgb3IKKwkgKiBqb2luKS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBjaGVja2VkIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcmV0dXJuIFRydWUgaWYgZ2l2ZW4ge0Bjb2RlIEVudGl0eVR5cGV9IHdpbGwgYmUgcXVlcmllZC4KKwkgKi8KKwlib29sZWFuIGlzUXVlcmllZChFbnRpdHlUeXBlIGVudGl0eVR5cGUpOworCisJLyoqCisJICogQWRkcyBzZWxlY3Qgc3RhdGVtZW50cyBmb3IgYWxsIHtAbGluayBBdHRyaWJ1dGV9cyBvZiBlYWNoIGdpdmVuCisJICoge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGVzIFRoZSB7QGNvZGUgQXR0cmlidXRlfXMgb2YgZWFjaCB7QGNvZGUgRW50aXR5VHlwZX0gd2lsbCBiZQorCSAqICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8ge0BsaW5rICNzZWxlY3QoTGlzdCl9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IHNlbGVjdEFsbChMaXN0PEVudGl0eVR5cGU+IGVudGl0eVR5cGVzKSB7CisJCWVudGl0eVR5cGVzLnN0cmVhbSgpLm1hcChFbnRpdHlUeXBlOjpnZXRBdHRyaWJ1dGVzKS5mb3JFYWNoKHRoaXM6OnNlbGVjdCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgc2VsZWN0IHN0YXRlbWVudHMgZm9yIGFsbCB7QGxpbmsgQXR0cmlidXRlfXMgb2YgZWFjaCBnaXZlbgorCSAqIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlcyBUaGUge0Bjb2RlIEF0dHJpYnV0ZX1zIG9mIGVhY2gge0Bjb2RlIEVudGl0eVR5cGV9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIHtAbGluayAjc2VsZWN0KExpc3QpfS4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBRdWVyeSBzZWxlY3RBbGwoRW50aXR5VHlwZS4uLiBlbnRpdHlUeXBlcykgeworCQlBcnJheXMuc3RyZWFtKGVudGl0eVR5cGVzKS5tYXAoRW50aXR5VHlwZTo6Z2V0QXR0cmlidXRlcykuZm9yRWFjaCh0aGlzOjpzZWxlY3QpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIHNlbGVjdCBzdGF0ZW1lbnRzIGZvciBhbGwge0BsaW5rIEF0dHJpYnV0ZX1zIGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZXMKKwkgKiBhdCBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUge0Bjb2RlIEVudGl0eVR5cGV9IHdob3NlIHtAY29kZSBBdHRyaWJ1dGV9cyB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIHtAbGluayAjc2VsZWN0KEF0dHJpYnV0ZSl9LgorCSAqIEBwYXJhbSBuYW1lcyAgICAgIFRoZSBuYW1lcyBvZiB0aGUge0Bjb2RlIEF0dHJpYnV0ZX1zIHRoYXQgaGF2ZSB0byBiZSBhZGRlZC4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICogQHNlZSBFbnRpdHlUeXBlI2dldEF0dHJpYnV0ZShTdHJpbmcpCisJICovCisJZGVmYXVsdCBRdWVyeSBzZWxlY3QoRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBTdHJpbmcuLi4gbmFtZXMpIHsKKwkJQXJyYXlzLnN0cmVhbShuYW1lcykubWFwKGVudGl0eVR5cGU6OmdldEF0dHJpYnV0ZSkuZm9yRWFjaCh0aGlzOjpzZWxlY3QpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgc2VsZWN0IHN0YXRlbWVudCBmb3IgdGhlIElEIHtAbGluayBBdHRyaWJ1dGV9IG9mIGVhY2ggZ2l2ZW4KKwkgKiB7QGxpbmsgRW50aXR5VHlwZX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZXMgVGhlIHtAY29kZSBFbnRpdHlUeXBlfXMgd2hvc2UgSUQge0Bjb2RlIEF0dHJpYnV0ZX1zIHdpbGwKKwkgKiAgICAgICAgICAgICAgICAgICAgYmUgcGFzc2VkIHRvIHtAbGluayAjc2VsZWN0KEF0dHJpYnV0ZSl9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IHNlbGVjdElEKEVudGl0eVR5cGUuLi4gZW50aXR5VHlwZXMpIHsKKwkJQXJyYXlzLnN0cmVhbShlbnRpdHlUeXBlcykubWFwKEVudGl0eVR5cGU6OmdldElEQXR0cmlidXRlKS5mb3JFYWNoKHRoaXM6OnNlbGVjdCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBzZWxlY3Qgc3RhdGVtZW50IGZvciBlYWNoIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9LgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZXMgRWFjaCB7QGNvZGUgQXR0cmlidXRlfSB3aWxsIGJlIHBhc3NlZCB0bworCSAqICAgICAgICAgICAgICAgICAgIHtAbGluayAjc2VsZWN0KEF0dHJpYnV0ZSl9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IHNlbGVjdChMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcykgeworCQlhdHRyaWJ1dGVzLmZvckVhY2godGhpczo6c2VsZWN0KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhIHNlbGVjdCBzdGF0ZW1lbnQgZm9yIGVhY2ggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlcyBFYWNoIHtAY29kZSBBdHRyaWJ1dGV9IHdpbGwgYmUgcGFzc2VkIHRvCisJICogICAgICAgICAgICAgICAgICAge0BsaW5rICNzZWxlY3QoQXR0cmlidXRlKX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgc2VsZWN0KEF0dHJpYnV0ZS4uLiBhdHRyaWJ1dGVzKSB7CisJCUFycmF5cy5zdHJlYW0oYXR0cmlidXRlcykuZm9yRWFjaCh0aGlzOjpzZWxlY3QpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgc2VsZWN0IHN0YXRlbWVudCBmb3IgZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIHtAY29kZSBBdHRyaWJ1dGV9IHdpbGwgYmUgcGFzc2VkIHRvCisJICogICAgICAgICAgICAgICAgICB7QGxpbmsgI3NlbGVjdChBdHRyaWJ1dGUsIEFnZ3JlZ2F0aW9uKX0gd2l0aAorCSAqICAgICAgICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uI05PTkV9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IHNlbGVjdChBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXJldHVybiBzZWxlY3QoYXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5OT05FKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgc2VsZWN0IHN0YXRlbWVudCBmb3IgZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0gd2l0aCBnaXZlbgorCSAqIHtAbGluayBBZ2dyZWdhdGlvbn0gZnVuY3Rpb24uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlICAgVGhlIHtAY29kZSBBdHRyaWJ1dGV9IGEgc2VsZWN0IHN0YXRlbWVudCB3aWxsIGJlIGFkZGVkCisJICogICAgICAgICAgICAgICAgICAgIGZvci4KKwkgKiBAcGFyYW0gYWdncmVnYXRpb24gVGhlIHtAY29kZSBBZ2dyZWdhdGlvbn0gdGhhdCB3aWxsIGJlIGFwcGxpZWQuCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCVF1ZXJ5IHNlbGVjdChBdHRyaWJ1dGUgYXR0cmlidXRlLCBBZ2dyZWdhdGlvbiBhZ2dyZWdhdGlvbik7CisKKwkvKioKKwkgKiBGb3IgYWxsIHVuYW1iaWd1b3VzIHtAbGluayBSZWxhdGlvbn1zIGZyb20gdGhlIHNvdXJjZSB7QGxpbmsgRW50aXR5VHlwZX0gdG8KKwkgKiBlYWNoIGdpdmVuIHRhcmdldCB7QGNvZGUgRW50aXR5VHlwZX0gYSBqb2luIHN0YXRlbWVudCB3aWxsIGJlIGFkZGVkLgorCSAqCisJICogQHBhcmFtIHNvdXJjZSAgVGhlIHNvdXJjZSB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIHRhcmdldHMgVGhlIHVuYW1iaWd1b3VzIHtAY29kZSBSZWxhdGlvbn0gZm9yIGVhY2ggdGFyZ2V0IHtAY29kZQorCSAqIAkJRW50aXR5VHlwZX0gaXMgcmV0cmlldmVkIGZyb20gdGhlIHNvdXJjZSB7QGNvZGUgRW50aXR5VHlwZX0gdXNpbmcKKwkgKiAgICAgICAgICAgICAgICB7QGxpbmsgRW50aXR5VHlwZSNnZXRSZWxhdGlvbihFbnRpdHlUeXBlKX0gYW5kIHBhc3NlZCB0bworCSAqICAgICAgICAgICAgICAgIHtAbGluayAjam9pbihSZWxhdGlvbil9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IGpvaW4oRW50aXR5VHlwZSBzb3VyY2UsIEVudGl0eVR5cGUuLi4gdGFyZ2V0cykgeworCQlBcnJheXMuc3RyZWFtKHRhcmdldHMpLm1hcChzb3VyY2U6OmdldFJlbGF0aW9uKS5mb3JFYWNoKHRoaXM6OmpvaW4pOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgam9pbiBzdGF0ZW1lbnQgZm9yIGVhY2ggZ2l2ZW4ge0BsaW5rIFJlbGF0aW9ufXMuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb25zIEVhY2gge0Bjb2RlIFJlbGF0aW9ufSB3aWxsIGJlIHBhc3NlZCB0bworCSAqICAgICAgICAgICAgICAgICAge0BsaW5rICNqb2luKFJlbGF0aW9uKX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgam9pbihMaXN0PFJlbGF0aW9uPiByZWxhdGlvbnMpIHsKKwkJcmVsYXRpb25zLmZvckVhY2godGhpczo6am9pbik7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBqb2luIHN0YXRlbWVudCBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgUmVsYXRpb259cy4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGlvbnMgRWFjaCB7QGNvZGUgUmVsYXRpb259IHdpbGwgYmUgcGFzc2VkIHRvCisJICogICAgICAgICAgICAgICAgICB7QGxpbmsgI2pvaW4oUmVsYXRpb24pfS4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBRdWVyeSBqb2luKFJlbGF0aW9uLi4uIHJlbGF0aW9ucykgeworCQlBcnJheXMuc3RyZWFtKHJlbGF0aW9ucykuZm9yRWFjaCh0aGlzOjpqb2luKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhIGpvaW4gc3RhdGVtZW50IGZvciBnaXZlbiB7QGxpbmsgUmVsYXRpb259LgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uIHtAY29kZSBSZWxhdGlvbn0gd2lsbCBiZSBwYXNzZWQgdG8KKwkgKiAgICAgICAgICAgICAgICAge0BsaW5rICNqb2luKFJlbGF0aW9uLCBKb2luVHlwZSl9IHdpdGgKKwkgKiAgICAgICAgICAgICAgICAge0BsaW5rIEpvaW5UeXBlI0lOTkVSfS4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBRdWVyeSBqb2luKFJlbGF0aW9uIHJlbGF0aW9uKSB7CisJCXJldHVybiBqb2luKHJlbGF0aW9uLCBKb2luVHlwZS5JTk5FUik7CisJfQorCisJLyoqCisJICogQWRkcyBhIGpvaW4gc3RhdGVtZW50IGZvciBnaXZlbiB7QGxpbmsgUmVsYXRpb259IHdpdGggZ2l2ZW4ge0BsaW5rIEpvaW5UeXBlfQorCSAqIHR5cGUuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb24gVGhlIHtAY29kZSBSZWxhdGlvbn0gYSBqb2luIHN0YXRlbWVudCB3aWxsIGJlIGFkZGVkIGZvci4KKwkgKiBAcGFyYW0gam9pbiAgICAgVGhlIHtAY29kZSBKb2luVHlwZX0gdHlwZSB0aGF0IHdpbGwgYmUgYXBwbGllZC4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJUXVlcnkgam9pbihSZWxhdGlvbiByZWxhdGlvbiwgSm9pblR5cGUgam9pbik7CisKKwkvKioKKwkgKiBBZGRzIGEgZ3JvdXAgYnkgc3RhdGVtZW50IGZvciBlYWNoIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9LgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZXMgRWFjaCB7QGNvZGUgQXR0cmlidXRlfSB3aWxsIGJlIHBhc3NlZCB0bworCSAqICAgICAgICAgICAgICAgICAgIHtAbGluayAjZ3JvdXAoQXR0cmlidXRlKX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgZ3JvdXAoTGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKKwkJYXR0cmlidXRlcy5mb3JFYWNoKHRoaXM6Omdyb3VwKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhIGdyb3VwIGJ5IHN0YXRlbWVudCBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIEVhY2gge0Bjb2RlIEF0dHJpYnV0ZX0gd2lsbCBiZSBwYXNzZWQgdG8KKwkgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgI2dyb3VwKEF0dHJpYnV0ZSl9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IGdyb3VwKEF0dHJpYnV0ZS4uLiBhdHRyaWJ1dGVzKSB7CisJCUFycmF5cy5zdHJlYW0oYXR0cmlidXRlcykuZm9yRWFjaCh0aGlzOjpncm91cCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBncm91cCBieSBzdGF0ZW1lbnQgZm9yIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9LgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUge0Bjb2RlIEF0dHJpYnV0ZX0gYSBncm91cCBieSBzdGF0ZW1lbnQgd2lsbCBiZSBhZGRlZAorCSAqICAgICAgICAgICAgICAgICAgZm9yLgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlRdWVyeSBncm91cChBdHRyaWJ1dGUgYXR0cmlidXRlKTsKKworCS8qKgorCSAqIEFkZHMgYW4gb3JkZXIgYnkgc3RhdGVtZW50IGZvciBlYWNoIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9LgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZXMgRWFjaCB7QGNvZGUgQXR0cmlidXRlfSB3aWxsIGJlIHBhc3NlZCB0bworCSAqICAgICAgICAgICAgICAgICAgIHtAbGluayAjb3JkZXIoQXR0cmlidXRlKX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgb3JkZXIoTGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKKwkJYXR0cmlidXRlcy5mb3JFYWNoKHRoaXM6Om9yZGVyKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhbiBvcmRlciBieSBzdGF0ZW1lbnQgZm9yIGVhY2ggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlcyBFYWNoIHtAY29kZSBBdHRyaWJ1dGV9IHdpbGwgYmUgcGFzc2VkIHRvCisJICogICAgICAgICAgICAgICAgICAge0BsaW5rICNvcmRlcihBdHRyaWJ1dGUpfS4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBRdWVyeSBvcmRlcihBdHRyaWJ1dGUuLi4gYXR0cmlidXRlcykgeworCQlBcnJheXMuc3RyZWFtKGF0dHJpYnV0ZXMpLmZvckVhY2godGhpczo6b3JkZXIpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGFuIG9yZGVyIGJ5IHN0YXRlbWVudCBmb3IgZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSB7QGNvZGUgQXR0cmlidXRlfSBpcyBwYXNzZWQgdG8KKwkgKiAgICAgICAgICAgICAgICAgIHtAbGluayAjb3JkZXIoQXR0cmlidXRlLCBib29sZWFuKX0gd2l0aAorCSAqICAgICAgICAgICAgICAgICAge0Bjb2RlIGFzY2VuZGluZyA9IHRydWV9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IG9yZGVyKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJcmV0dXJuIG9yZGVyKGF0dHJpYnV0ZSwgdHJ1ZSk7CisJfQorCisJLyoqCisJICogQWRkcyBhbiBvcmRlciBieSBzdGF0ZW1lbnQgZm9yIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9IHdpdGggZ2l2ZW4gYXNjZW5kaW5nCisJICogZmxhZy4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIHtAY29kZSBBdHRyaWJ1dGV9IGFuIG9yZGVyIGJ5IHN0YXRlbWVudCB3aWxsIGJlIGFkZGVkCisJICogICAgICAgICAgICAgICAgICBmb3IuCisJICogQHBhcmFtIGFzY2VuZGluZyBUaGUgYXNjZW5kaW5nIGZsYWcgdGhhdCB3aWxsIGJlIGFwcGxpZWQuCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCVF1ZXJ5IG9yZGVyKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIGJvb2xlYW4gYXNjZW5kaW5nKTsKKworCS8qKgorCSAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgZmV0Y2hlZCBieSB0aGUgcXVlcnkuIDAgZGVub3RlcyBubyBsaW1pdC4KKwkgKgorCSAqIEBwYXJhbSBsaW1pdCBudW1iZXIgb2YgbWF4aW11bSByb3dzLgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlRdWVyeSBsaW1pdChpbnQgbGltaXQpOworCisJLyoqCisJICogRXhlY3V0ZXMgdGhpcyBxdWVyeSB3aXRoIGFuIGVtcHR5IHtAbGluayBGaWx0ZXJ9IGFuZCByZXR1cm5zIHRoZQorCSAqIHtAbGluayBSZXN1bHR9LgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHtAY29kZSBSZXN1bHR9IGNvdWxkIG5vdCBiZSBmb3VuZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgb3IgZ2VuZXJhdGluZyB0aGUge0Bjb2RlIFJlc3VsdH0uCisJICovCisJZGVmYXVsdCBPcHRpb25hbDxSZXN1bHQ+IGZldGNoU2luZ2xldG9uKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZmV0Y2hTaW5nbGV0b24oRmlsdGVyLmFuZCgpKTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGlzIHF1ZXJ5IHdpdGggZ2l2ZW4ge0BsaW5rIEZpbHRlcn0gYW5kIHJldHVybnMgdGhlIHtAbGluayBSZXN1bHR9LgorCSAqCisJICogQHBhcmFtIGZpbHRlciBUaGUgY3JpdGVyaWEgc2VxdWVuY2UuCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHtAY29kZSBSZXN1bHR9IGNvdWxkIG5vdCBiZSBmb3VuZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgb3IgZ2VuZXJhdGluZyB0aGUge0Bjb2RlIFJlc3VsdH0uCisJICovCisJT3B0aW9uYWw8UmVzdWx0PiBmZXRjaFNpbmdsZXRvbihGaWx0ZXIgZmlsdGVyKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoaXMgcXVlcnkgd2l0aCBhbiBlbXB0eSB7QGxpbmsgRmlsdGVyfSBhbmQgcmV0dXJucyB0aGUKKwkgKiB7QGxpbmsgUmVzdWx0fXMuCisJICoKKwkgKiBAcmV0dXJuIEFsbCB7QGNvZGUgUmVzdWx0fXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSB7QGNvZGUgUmVzdWx0fXMuCisJICovCisJZGVmYXVsdCBMaXN0PFJlc3VsdD4gZmV0Y2goKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBmZXRjaChGaWx0ZXIuYW5kKCkpOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoaXMgcXVlcnkgd2l0aCBnaXZlbiB7QGxpbmsgRmlsdGVyfSBhbmQgcmV0dXJucyB0aGUKKwkgKiB7QGxpbmsgUmVzdWx0fXMuCisJICoKKwkgKiBAcGFyYW0gZmlsdGVyIFRoZSBjcml0ZXJpYSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIEFsbCB7QGNvZGUgUmVzdWx0fXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSB7QGNvZGUgUmVzdWx0fXMuCisJICovCisJTGlzdDxSZXN1bHQ+IGZldGNoKEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvUXVlcnlTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvUXVlcnlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyMDA3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9RdWVyeVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5OworCisvKioKKyAqIFRoZSB7QGxpbmsgUXVlcnlTZXJ2aWNlfSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxvdyBsZXZlbCBxdWVyeSBBUEkuCisgKiAKKyAqIEEge0BsaW5rIFF1ZXJ5fSwgY3JlYXRlZCBieSB0aGlzIHNlcnZpY2UsIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGFuZCBleGVjdXRlCisgKiBxdWVyaWVzIG9uIHRoZSB1bmRlcmx5aW5nIGRhdGFzdG9yZS4gVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGFzIGEgbGlzdCBvZgorICoge0BsaW5rIFJlc3VsdH1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5U2VydmljZSB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFuZCBlbXB0eSB7QGxpbmsgUXVlcnl9LgorCSAqCisJICogQHJldHVybiBDcmVhdGVkIHtAY29kZSBRdWVyeX0gaXMgcmV0dXJuZWQuCisJICovCisJUXVlcnkgY3JlYXRlUXVlcnkoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9SZWNvcmQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9SZWNvcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzMzYjc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L1JlY29yZC5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CisKKy8qKgorICogQSByZWNvcmQgY29ycmVzcG9uZHMgdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIHVuZGVybHlpbmcge0BsaW5rIEVudGl0eVR5cGV9LiBJdAorICogY29udGFpbnMgYSBzdWJzZXQgb2YgaXRzIHtAbGluayBWYWx1ZX1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBBdHRyaWJ1dGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlY29yZCB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hNYXA8PigpOworCXByaXZhdGUgZmluYWwgRW50aXR5VHlwZSBlbnRpdHlUeXBlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHtAbGluayBFbnRpdHlUeXBlfSB0aGlzIHJlY29yZCBpcyBhc3NvY2lhdGVkIHdpdGguCisJICovCisJcHVibGljIFJlY29yZChFbnRpdHlUeXBlIGVudGl0eVR5cGUpIHsKKwkJdGhpcy5lbnRpdHlUeXBlID0gZW50aXR5VHlwZTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQge0Bjb2RlIEVudGl0eVR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoKSB7CisJCXJldHVybiBlbnRpdHlUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIGNvbnRhaW5lZCB7QGxpbmsgVmFsdWV9cyBtYXBwZWQgYnkgdGhlaXIgbmFtZXMuCisJICoKKwkgKiBAcmV0dXJuIEF2YWlsYWJsZSB7QGNvZGUgVmFsdWV9cyBpbiBhIG11dGFibGUge0Bjb2RlIE1hcH0gYXJlIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBWYWx1ZT4gZ2V0VmFsdWVzKCkgeworCQlyZXR1cm4gdmFsdWVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlY29yZCBJRCwgd2hpY2ggaXMgdGhlIElEIG9mIHRoZSBpbnN0YW5jZSwgcmVwcmVzZW50ZWQgYnkgdGhpcworCSAqIHJlY29yZC4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgSUQgb2YgdGhpcyByZWNvcmQuCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBJRCB7QGNvZGUgVmFsdWV9IGNvbnRhaW5lciBpcyBub3QKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuCisJICovCisJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKwkJVmFsdWUgaWRWYWx1ZSA9IGdldFZhbHVlcygpLmdldChnZXRFbnRpdHlUeXBlKCkuZ2V0SURBdHRyaWJ1dGUoKS5nZXROYW1lKCkpOworCQlpZiAoaWRWYWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJRCBhdHRyaWJ1dGUgd2FzIG5vdCBzZWxlY3RlZC4iKTsKKwkJfQorCisJCXJldHVybiBpZFZhbHVlLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBJRCBvZiB0aGUgcmVsYXRlZCBlbnRpdHkgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4KKwkgKiB7QGxpbmsgUmVsYXRpb259LgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uIFRoZSBmb3JlaWduIGtleSB7QGNvZGUgUmVsYXRpb259LgorCSAqIEByZXR1cm4ge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiB0aGVyZSBpcyBubyByZWxhdGVkIGVudGl0eS4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYgdGhlIHJlcXVlc3RlZCBmb3JlaWduIGtleSB3YXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgcHJpb3IgZXhlY3V0aW5nIHRoZSBxdWVyeS4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRJRChSZWxhdGlvbiByZWxhdGlvbikgeworCQlWYWx1ZSBpZFZhbHVlID0gZ2V0VmFsdWVzKCkuZ2V0KHJlbGF0aW9uLmdldE5hbWUoKSk7CisJCWlmIChpZFZhbHVlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlbGF0aW9uIGF0dHJpYnV0ZSAnIiArIHJlbGF0aW9uICsgIicgd2FzIG5vdCBzZWxlY3RlZC4iKTsKKwkJfQorCisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGlkVmFsdWUuaXNWYWxpZCgpID8gaWRWYWx1ZS5leHRyYWN0KCkgOiBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBWYWx1ZX0gdG8gdGhpcyByZWNvcmQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUge0BsaW5rIFZhbHVlfSB0aGF0IHdpbGwgYmUgYWRkZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHtAY29kZSBWYWx1ZX0gb3ZlcndyaXRlcyBhbgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nIG9uZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRWYWx1ZShWYWx1ZSB2YWx1ZSkgeworCQlpZiAodmFsdWVzLnB1dCh2YWx1ZS5nZXROYW1lKCksIHZhbHVlKSAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSB3aXRoIG5hbWUgJyIgKyB2YWx1ZS5nZXROYW1lKCkgKyAiJyBmb3IgZW50aXR5IHR5cGUgJyIKKwkJCQkJKyBlbnRpdHlUeXBlICsgIicgcmVjb3JkIGlzIGFscmVhZHkgZGVmaW5lZC4iKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJlY29yZC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmVjb3JkLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiUmVjb3JkKEVudGl0eVR5cGUgPSAiKS5hcHBlbmQoZ2V0RW50aXR5VHlwZSgpKTsKKwkJcmV0dXJuIHNiLmFwcGVuZCgiLCBWYWx1ZXMgPSAiKS5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkpLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFBhY2thZ2UgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIE1lcmdlcyBnaXZlbiByZWNvcmQgd2l0aCB0aGlzIGluc3RhbmNlLiBUbyBiZSBhYmxlIHRvIGRvIHNvLCB0aGUgZ2l2ZW4gcmVjb3JkCisJICogbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyByZWNvcmQuIFJlY29yZHMgYXJlIGNvbXBhdGlibGUgaWYgdGhlIHVuZGVybHlpbmcKKwkgKiB7QGxpbmsgRW50aXR5VHlwZX0gYW5kIHRoZSBzdWJzZXQgb2Yge0BsaW5rIFZhbHVlfXMgaXMgdGhlIHNhbWUuCisJICoKKwkgKiBAcGFyYW0gcmVjb3JkIFRoZSByZWNvcmQgdGhhdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoaXMgaW5zdGFuY2UuCisJICogQHJldHVybiBBIG5ldyByZWNvcmQgd2l0aCBtZXJnZWQge0Bjb2RlIFZhbHVlfXMgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHJlY29yZCBpcyBub3QgY29tcGF0aWJsZS4KKwkgKi8KKwlSZWNvcmQgbWVyZ2UoUmVjb3JkIHJlY29yZCkgeworCQlib29sZWFuIGVudGl0eVR5cGVNaXNzbWF0Y2ggPSAhZ2V0RW50aXR5VHlwZSgpLmVxdWFscyhyZWNvcmQuZ2V0RW50aXR5VHlwZSgpKTsKKwkJYm9vbGVhbiB2YWx1ZXNNaXNzbWF0Y2ggPSBnZXRWYWx1ZXMoKS5zaXplKCkgIT0gcmVjb3JkLmdldFZhbHVlcygpLnNpemUoKTsKKwkJaWYgKGVudGl0eVR5cGVNaXNzbWF0Y2ggfHwgdmFsdWVzTWlzc21hdGNoKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gbWVyZ2UsIGluY29tcGF0aWJsZSByZWNvcmQgcGFzc2VkLiIpOworCQl9CisKKwkJUmVjb3JkIG1lcmdlZFJlY29yZCA9IG5ldyBSZWNvcmQoZ2V0RW50aXR5VHlwZSgpKTsKKwkJZ2V0VmFsdWVzKCkua2V5U2V0KCkuc3RyZWFtKCkuZm9yRWFjaChuIC0+IG1lcmdlZFJlY29yZC5hZGRWYWx1ZShnZXRWYWx1ZShuKS5tZXJnZShyZWNvcmQuZ2V0VmFsdWUobikpKSk7CisJCXJldHVybiBtZXJnZWRSZWNvcmQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB7QGxpbmsgVmFsdWV9IHdpdGggZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIHtAY29kZSBWYWx1ZX0gd2l0aCBnaXZlbiBuYW1lIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB2YWx1ZSB3aXRoIGdpdmVuIG5hbWUgaXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkLgorCSAqLworCVZhbHVlIGdldFZhbHVlKFN0cmluZyBuYW1lKSB7CisJCVZhbHVlIHZhbHVlID0gZ2V0VmFsdWVzKCkuZ2V0KG5hbWUpOworCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgd2l0aCBuYW1lICciICsgbmFtZSArICInIG5vdCBmb3VuZC4iKTsKKwkJfQorCisJCXJldHVybiB2YWx1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9SZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9SZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzExYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L1Jlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEEgcmVzdWx0IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIHtAbGluayBSZWNvcmR9cywgd2hpY2ggaXMgbWFwcGVkIGZyb20gYW4KKyAqIHtAbGluayBFbnRpdHlUeXBlfQorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVzdWx0IGltcGxlbWVudHMgSXRlcmFibGU8UmVjb3JkPiB7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxFbnRpdHlUeXBlLCBSZWNvcmQ+IHJlY29yZHMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBSZWNvcmR9IHRvIHRoaXMgcmVzdWx0LgorCSAqCisJICogQHBhcmFtIHJlY29yZCB7QGNvZGUgUmVjb3JkfSB0aGF0IHdpbGwgYmUgYWRkZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHtAY29kZSBSZWNvcmR9IG92ZXJ3cml0ZXMgYW4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyBvbmUuCisJICovCisJcHVibGljIHZvaWQgYWRkUmVjb3JkKFJlY29yZCByZWNvcmQpIHsKKwkJaWYgKHJlY29yZHMucHV0KHJlY29yZC5nZXRFbnRpdHlUeXBlKCksIHJlY29yZCkgIT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIlJlY29yZCBmb3IgZW50aXR5IHR5cGUgJyIgKyByZWNvcmQuZ2V0RW50aXR5VHlwZSgpICsgIicgaXMgYWxyZWFkeSBkZWZpbmVkLiIpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFJlY29yZH0gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgUmVjb3JkfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0Bjb2RlIEVudGl0eVR5cGV9IGlzCisJICogICAgICAgICByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgYXNzb2NpYXRlZCB7QGNvZGUgUmVjb3JkfSBkb2VzIG5vdAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0LgorCSAqLworCXB1YmxpYyBSZWNvcmQgZ2V0UmVjb3JkKEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQlSZWNvcmQgcmVjb3JkID0gcmVjb3Jkcy5nZXQoZW50aXR5VHlwZSk7CisJCWlmIChyZWNvcmQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjb3JkIGZvciBlbnRpdHkgdHlwZSAnIiArIGVudGl0eVR5cGUgKyAiJyBpcyBub3QgYXZhaWxhYmxlLiIpOworCQl9CisKKwkJcmV0dXJuIHJlY29yZDsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSB7QGxpbmsgUmVjb3JkfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9IGZyb20gdGhpcworCSAqIHJlc3VsdCBhbmQgcmV0dXJucyBpdC4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSByZW1vdmVkIHtAY29kZSBSZWNvcmR9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0KKwkgKiAgICAgICAgIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBhc3NvY2lhdGVkIHtAY29kZSBSZWNvcmR9IGRvZXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzLgorCSAqLworCXB1YmxpYyBSZWNvcmQgcmVtb3ZlUmVjb3JkKEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQlSZWNvcmQgcmVjb3JkID0gcmVjb3Jkcy5yZW1vdmUoZW50aXR5VHlwZSk7CisJCWlmIChyZWNvcmQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjb3JkIGZvciBlbnRpdHkgdHlwZSAnIiArIGVudGl0eVR5cGUgKyAiJyBpcyBub3QgYXZhaWxhYmxlLiIpOworCQl9CisKKwkJcmV0dXJuIHJlY29yZDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmFsdWV9IGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0KKwkgKiBhbmQgbm8gYWdncmVnYXRpb24uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFVzZWQgYXMgaWRlbnRpZmllciB0byBmaW5kIHRoZSBhc3NvY2lhdGVkIHtAY29kZSBWYWx1ZX0uCisJICogQHJldHVybiBBc3NvY2lhdGVkIHtAY29kZSBWYWx1ZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFZhbHVlIGdldFZhbHVlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJcmV0dXJuIGdldFZhbHVlKGF0dHJpYnV0ZSwgQWdncmVnYXRpb24uTk9ORSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFZhbHVlfSBjb250YWluZXIgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9CisJICogYW5kIHtAbGluayBBZ2dyZWdhdGlvbn0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlICAgVXNlZCBhcyBpZGVudGlmaWVyIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQge0Bjb2RlIFZhbHVlfS4KKwkgKiBAcGFyYW0gYWdncmVnYXRpb24ge0BsaW5rIEFnZ3JlZ2F0aW9ufSB1c2VkIHdpdGggdGhlIGF0dHJpYnV0ZS4KKwkgKiBAcmV0dXJuIEFzc29jaWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVmFsdWUgZ2V0VmFsdWUoQXR0cmlidXRlIGF0dHJpYnV0ZSwgQWdncmVnYXRpb24gYWdncmVnYXRpb24pIHsKKwkJU3RyaW5nIGtleTsKKwkJaWYgKEFnZ3JlZ2F0aW9uLk5PTkUgPT0gYWdncmVnYXRpb24pIHsKKwkJCWtleSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7CisJCX0gZWxzZSB7CisJCQlrZXkgPSBTdHJpbmcuZm9ybWF0KCIlcyglcykiLCBhZ2dyZWdhdGlvbi5uYW1lKCksIGF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQl9CisKKwkJcmV0dXJuIGdldFJlY29yZChhdHRyaWJ1dGUuZ2V0RW50aXR5VHlwZSgpKS5nZXRWYWx1ZShrZXkpOworCX0KKworCS8qKgorCSAqIE1lcmdlcyBnaXZlbiByZXN1bHQgd2l0aCB0aGlzIGluc3RhbmNlLiBUbyBiZSBhYmxlIHRvIGRvIHNvLCB0aGUgZ2l2ZW4gcmVzdWx0CisJICogbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyByZXN1bHQuIFJlc3VsdHMgYXJlIGNvbXBhdGlibGUgaWYgdGhlIHN1YnNldCBvZgorCSAqIHtAbGluayBSZWNvcmR9cyBpcyB0aGUgc2FtZS4KKwkgKgorCSAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdCB0aGF0IHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhpcyBpbnN0YW5jZS4KKwkgKiBAcmV0dXJuIEEgbmV3IHJlc3VsdCB3aXRoIG1lcmdlZCB7QGNvZGUgUmVjb3JkfXMgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHJlc3VsdCBpcyBub3QgY29tcGF0aWJsZS4KKwkgKi8KKwlwdWJsaWMgUmVzdWx0IG1lcmdlKFJlc3VsdCByZXN1bHQpIHsKKwkJaWYgKHJlY29yZHMuc2l6ZSgpICE9IHJlc3VsdC5yZWNvcmRzLnNpemUoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIG1lcmdlLCBpbmNvbXBhdGlibGUgcmVzdWx0IHBhc3NlZC4iKTsKKwkJfQorCisJCVJlc3VsdCBtZXJnZWRSZXN1bHQgPSBuZXcgUmVzdWx0KCk7CisJCXJlY29yZHMua2V5U2V0KCkuc3RyZWFtKCkuZm9yRWFjaChlIC0+IG1lcmdlZFJlc3VsdC5hZGRSZWNvcmQoZ2V0UmVjb3JkKGUpLm1lcmdlKHJlc3VsdC5nZXRSZWNvcmQoZSkpKSk7CisJCXJldHVybiBtZXJnZWRSZXN1bHQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHNlcXVlbnRpYWwgc3RyZWFtIHdpdGggdGhpcyByZXN1bHQgYXMgaXRzIHNvdXJjZS4KKwkgKgorCSAqIEByZXR1cm4gQSBzZXF1ZW50aWFsIHN0cmVhbSB3aXRoIHJlY29yZHMgb2YgdGhpcyByZXN1bHQuCisJICovCisJcHVibGljIFN0cmVhbTxSZWNvcmQ+IHN0cmVhbSgpIHsKKwkJcmV0dXJuIFN0cmVhbVN1cHBvcnQuc3RyZWFtKHNwbGl0ZXJhdG9yKCksIGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHtAbGluayBSZWNvcmR9cyBjb250YWluZWQgaW4gdGhpcyByZXN1bHQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBpdGVyYXRvciBvdmVyIHRoZSBjb250YWluZWQge0Bjb2RlIFJlY29yZH1zIGlzIHJldHVybmVkLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxSZWNvcmQ+IGl0ZXJhdG9yKCkgeworCQlyZXR1cm4gcmVjb3Jkcy52YWx1ZXMoKS5pdGVyYXRvcigpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJlc3VsdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmVzdWx0LgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigiUmVzdWx0KFJlY29yZHMgPSAiKS5hcHBlbmQocmVjb3Jkcy52YWx1ZXMoKSkuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9zZWFyY2gvU2VhcmNoUXVlcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9zZWFyY2gvU2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzdmMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3NlYXJjaC9TZWFyY2hRdWVyeS5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlc3VsdDsKKworLyoqCisgKiBUaGlzIGlzIGFuIGludGVyZmFjZSBmb3IgcHJlZGVmaW5lZCBzZWFyY2ggcXVlcnkgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBFbnRpdHlUeXBlCisgKiBAc2VlIFNlYXJjaGFibGUKKyAqIEBzZWUgQXR0cmlidXRlCisgKiBAc2VlIFZhbHVlCisgKiBAc2VlIEZpbHRlcgorICogQHNlZSBSZXN1bHQKKyAqLworcHVibGljIGludGVyZmFjZSBTZWFyY2hRdWVyeSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCB7QGxpbmsgRW50aXR5VHlwZX1zIHN1cHBvcnRlZCBieSB0aGlzIHNlYXJjaCBxdWVyeS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBtYXkgYmUgaW1tdXRhYmxlLgorCSAqLworCUxpc3Q8RW50aXR5VHlwZT4gbGlzdEVudGl0eVR5cGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2VhcmNoYWJsZX0sIHdoaWNoIGRlc2NyaWJlcyBhIGhpZXJhcmNoaWNhbCBvcmRlciBvZiB0aGUKKwkgKiB7QGxpbmsgRW50aXR5VHlwZX1zIHN1cHBvcnRlZCBieSB0aGlzIHNlYXJjaCBxdWVyeS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTZWFyY2hhYmxlfSByb290IGlzIHJldHVybmVkLgorCSAqLworCVNlYXJjaGFibGUgZ2V0U2VhcmNoYWJsZVJvb3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRpc3RpbmN0IHtAbGluayBWYWx1ZX0gc2VxdWVuY2UgZm9yIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9LiBUaGUKKwkgKiB7QGNvZGUgQXR0cmlidXRlfSBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGlzIHNlYXJjaCBxdWVyeS4gVGhlIHJldHVybmVkCisJICoge0Bjb2RlIFZhbHVlfSBzZXF1ZW5jZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBidWlsZGluZyBmaWx0ZXIgY3JpdGVyaWEKKwkgKiBmb3IgdGhpcyBzZWFyY2ggcXVlcnkuCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSB7QGNvZGUgQXR0cmlidXRlfSB3aG9zZSBkaXN0aW5jdCB2YWx1ZXMgd2lsbCBiZSBxdWVyaWVkLgorCSAqIEByZXR1cm4gQSBkaXN0aW5jdCB7QGNvZGUgTGlzdH0gb2YgYWxsIGF2YWlsYWJsZSB7QGNvZGUgVmFsdWV9cyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgb3IgZ2VuZXJhdGluZyB0aGUgZGlzdGluY3Qge0Bjb2RlIFZhbHVlfQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS4KKwkgKiBAc2VlICNnZXRTZWFyY2hhYmxlUm9vdCgpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKCkKKwkgKiBAc2VlICNnZXRGaWx0ZXJWYWx1ZXMoQXR0cmlidXRlLCBGaWx0ZXIpCisJICovCisJZGVmYXVsdCBMaXN0PFZhbHVlPiBnZXRGaWx0ZXJWYWx1ZXMoQXR0cmlidXRlIGF0dHJpYnV0ZSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0RmlsdGVyVmFsdWVzKGF0dHJpYnV0ZSwgRmlsdGVyLmFuZCgpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkaXN0aW5jdCB7QGxpbmsgVmFsdWV9IHNlcXVlbmNlIGZvciBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfSBhbmQKKwkgKiB7QGxpbmsgRmlsdGVyfS4gQm90aCBtdXN0IGJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIHNlYXJjaCBxdWVyeS4gVGhlCisJICogcmV0dXJuZWQge0Bjb2RlIFZhbHVlfSBzZXF1ZW5jZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBidWlsZGluZyBmaWx0ZXIKKwkgKiBjcml0ZXJpYSBmb3IgdGhpcyBzZWFyY2ggcXVlcnkuCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSB7QGNvZGUgQXR0cmlidXRlfSB3aG9zZSBkaXN0aW5jdCB2YWx1ZXMgd2lsbCBiZSBxdWVyaWVkLgorCSAqIEBwYXJhbSBmaWx0ZXIgICAgVGhlIGNyaXRlcmlhIHNlcXVlbmNlLgorCSAqIEByZXR1cm4gQSBkaXN0aW5jdCB7QGNvZGUgTGlzdH0gb2Yge0Bjb2RlIFZhbHVlfXMgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IG9yIGdlbmVyYXRpbmcgdGhlIGRpc3RpbmN0IHtAY29kZSBWYWx1ZX0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoKQorCSAqIEBzZWUgI2xpc3RFbnRpdHlUeXBlcygpCisJICogQHNlZSAjZ2V0RmlsdGVyVmFsdWVzKEF0dHJpYnV0ZSkKKwkgKi8KKwlMaXN0PFZhbHVlPiBnZXRGaWx0ZXJWYWx1ZXMoQXR0cmlidXRlIGF0dHJpYnV0ZSwgRmlsdGVyIGZpbHRlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGlzIHNlYXJjaCBxdWVyeSB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHlUeXBlfXMuIFRoZSB7QGNvZGUKKwkgKiBFbnRpdHlUeXBlfXMgbXVzdCBiZSBmdWxseSBzdXBwb3J0ZWQgYnkgdGhpcyBzZWFyY2ggcXVlcnkuIFRoaXMgbWV0aG9kCisJICogc2VsZWN0cyBhbGwge0BsaW5rIEF0dHJpYnV0ZX1zIG9mIGVhY2ggZ2l2ZW4ge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGVzIFNlbGVjdCBzdGF0ZW1lbnRzIHdpbGwgYmUgYWRkZWQgZm9yIGFsbCB7QGNvZGUgQXR0cmlidXRlfXMKKwkgKiAgICAgICAgICAgICAgICAgICAgb2YgZWFjaCBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogQHJldHVybiBBbGwge0Bjb2RlIFJlc3VsdH1zIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgb3IgZ2VuZXJhdGluZyB0aGUge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEBzZWUgI2dldFNlYXJjaGFibGVSb290KCkKKwkgKiBAc2VlICNsaXN0RW50aXR5VHlwZXMoKQorCSAqIEBzZWUgI2ZldGNoQ29tcGxldGUoTGlzdCwgRmlsdGVyKQorCSAqIEBzZWUgI2ZldGNoKExpc3QpCisJICovCisJZGVmYXVsdCBMaXN0PFJlc3VsdD4gZmV0Y2hDb21wbGV0ZShMaXN0PEVudGl0eVR5cGU+IGVudGl0eVR5cGVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBmZXRjaENvbXBsZXRlKGVudGl0eVR5cGVzLCBGaWx0ZXIuYW5kKCkpOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoaXMgc2VhcmNoIHF1ZXJ5IHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9cyBhbmQge0BsaW5rIEZpbHRlcn0uCisJICogQm90aCBtdXN0IGJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIHNlYXJjaCBxdWVyeS4gVGhpcyBtZXRob2Qgc2VsZWN0cyBhbGwKKwkgKiB7QGxpbmsgQXR0cmlidXRlfXMgb2YgZWFjaCBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZXMgU2VsZWN0IHN0YXRlbWVudHMgd2lsbCBiZSBhZGRlZCBmb3IgYWxsIHtAY29kZSBBdHRyaWJ1dGV9cworCSAqICAgICAgICAgICAgICAgICAgICBvZiBlYWNoIGdpdmVuIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gZmlsdGVyICAgICAgVGhlIGNyaXRlcmlhIHNlcXVlbmNlLgorCSAqIEByZXR1cm4gQWxsIHtAY29kZSBSZXN1bHR9cyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IG9yIGdlbmVyYXRpbmcgdGhlIHtAY29kZSBSZXN1bHR9cy4KKwkgKiBAc2VlICNnZXRTZWFyY2hhYmxlUm9vdCgpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKCkKKwkgKiBAc2VlICNmZXRjaENvbXBsZXRlKExpc3QpCisJICogQHNlZSAjZmV0Y2goTGlzdCwgRmlsdGVyKQorCSAqLworCUxpc3Q8UmVzdWx0PiBmZXRjaENvbXBsZXRlKExpc3Q8RW50aXR5VHlwZT4gZW50aXR5VHlwZXMsIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogRXhlY3V0ZXMgdGhpcyBzZWFyY2ggcXVlcnkgd2l0aCBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfXMuIFRoZSB7QGNvZGUKKwkgKiBBdHRyaWJ1dGV9cyBtdXN0IGJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIHNlYXJjaCBxdWVyeS4gVGhpcyBtZXRob2QgYWxsb3dzCisJICogZmluZSBncmFpbmVkIHtAbGluayBSZXN1bHR9IGNvbmZpZ3VyYXRpb24uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlcyBTZWxlY3Qgc3RhdGVtZW50cyB3aWxsIGJlIGFkZGVkIGZvciBlYWNoIHtAY29kZQorCSAqIAkJQXR0cmlidXRlfS4KKwkgKiBAcmV0dXJuIEFsbCB7QGNvZGUgUmVzdWx0fXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSB7QGNvZGUgUmVzdWx0fXMuCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoKQorCSAqIEBzZWUgI2xpc3RFbnRpdHlUeXBlcygpCisJICogQHNlZSAjZmV0Y2goTGlzdCwgRmlsdGVyKQorCSAqIEBzZWUgI2ZldGNoQ29tcGxldGUoTGlzdCkKKwkgKi8KKwlkZWZhdWx0IExpc3Q8UmVzdWx0PiBmZXRjaChMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZmV0Y2goYXR0cmlidXRlcywgRmlsdGVyLmFuZCgpKTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGlzIHNlYXJjaCBxdWVyeSB3aXRoIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9cyBhbmQge0BsaW5rIEZpbHRlcn0uCisJICogQm90aCBtdXN0IGJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIHNlYXJjaCBxdWVyeS4gVGhpcyBtZXRob2QgYWxsb3dzIGZpbmUKKwkgKiBncmFpbmVkIHtAbGluayBSZXN1bHR9IGNvbmZpZ3VyYXRpb24uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlcyBTZWxlY3Qgc3RhdGVtZW50cyB3aWxsIGJlIGFkZGVkIGZvciBlYWNoIHtAY29kZQorCSAqIAkJQXR0cmlidXRlfS4KKwkgKiBAcGFyYW0gZmlsdGVyICAgICBUaGUgY3JpdGVyaWEgc2VxdWVuY2UuCisJICogQHJldHVybiBBbGwge0Bjb2RlIFJlc3VsdH1zIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgb3IgZ2VuZXJhdGluZyB0aGUge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEBzZWUgI2dldFNlYXJjaGFibGVSb290KCkKKwkgKiBAc2VlICNsaXN0RW50aXR5VHlwZXMoKQorCSAqIEBzZWUgI2ZldGNoKExpc3QpCisJICogQHNlZSAjZmV0Y2hDb21wbGV0ZShMaXN0LCBGaWx0ZXIpCisJICovCisJTGlzdDxSZXN1bHQ+IGZldGNoKExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzLCBGaWx0ZXIgZmlsdGVyKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3NlYXJjaC9TZWFyY2hTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTIwMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3NlYXJjaC9TZWFyY2hTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZWNvcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlc3VsdDsKKworLyoqCisgKiBUaGlzIHNlYXJjaCBzZXJ2aWNlIHVzZXMgZ2l2ZW4ge0BsaW5rIEVudGl0eX0gdHlwZSB0byBleGVjdXRlIHRoZSBhc3NvY2lhdGVkCisgKiBwcmVkZWZpbmVkIHtAbGluayBTZWFyY2hRdWVyeX0gYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIEVudGl0eVR5cGUKKyAqIEBzZWUgU2VhcmNoYWJsZQorICogQHNlZSBBdHRyaWJ1dGUKKyAqIEBzZWUgVmFsdWUKKyAqIEBzZWUgRmlsdGVyCisgKiBAc2VlIFJlc3VsdAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNlYXJjaFNlcnZpY2UgeworCisJLyoqCisJICogUmV0dXJucyBhbGwge0BsaW5rIEVudGl0eX0gdHlwZXMgdGhpcyBzZWFyY2ggc2VydmljZSBwcm92aWRlcyBhIHByZWRlZmluZWQKKwkgKiB7QGxpbmsgU2VhcmNoUXVlcnl9IGZvci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSB3aXRoIHN1cHBvcnRlZCB0eXBlcyBtYXkgYmUgaW1tdXRhYmxlLgorCSAqLworCUxpc3Q8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4+IGxpc3RTZWFyY2hhYmxlVHlwZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgYWxsIHtAbGluayBFbnRpdHlUeXBlfXMgc3VwcG9ydGVkIGJ5IHRoZSB7QGxpbmsgU2VhcmNoUXVlcnl9CisJICogYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHl9IHR5cGUuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBtYXkgYmUgaW1tdXRhYmxlLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB0eXBlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHByZWRlZmluZWQge0Bjb2RlIFNlYXJjaFF1ZXJ5fS4KKwkgKiBAc2VlICNsaXN0U2VhcmNoYWJsZVR5cGVzKCkKKwkgKi8KKwlMaXN0PEVudGl0eVR5cGU+IGxpc3RFbnRpdHlUeXBlcyhDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcyk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2VhcmNoYWJsZX0sIHdoaWNoIGRlc2NyaWJlcyBhIGhpZXJhcmNoaWNhbCBvcmRlciBvZiB0aGUKKwkgKiB7QGxpbmsgRW50aXR5VHlwZX1zIHN1cHBvcnRlZCBieSB0aGUge0BsaW5rIFNlYXJjaFF1ZXJ5fSBhc3NvY2lhdGVkIHdpdGgKKwkgKiBnaXZlbiB7QGxpbmsgRW50aXR5fSB0eXBlLgorCSAqCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgdGhlIHtAY29kZSBTZWFyY2hRdWVyeX0gaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgU2VhcmNoYWJsZX0gcm9vdCBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdHlwZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVkZWZpbmVkIHtAY29kZSBTZWFyY2hRdWVyeX0uCisJICogQHNlZSAjbGlzdFNlYXJjaGFibGVUeXBlcygpCisJICovCisJU2VhcmNoYWJsZSBnZXRTZWFyY2hhYmxlUm9vdChDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcyk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkaXN0aW5jdCB7QGxpbmsgVmFsdWV9IHNlcXVlbmNlIGZvciBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfS4gVGhlCisJICoge0Bjb2RlIEF0dHJpYnV0ZX0gbXVzdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIHtAbGluayBTZWFyY2hRdWVyeX0gYXNzb2NpYXRlZAorCSAqIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eX0gdHlwZS4gVGhlIHJldHVybmVkIHtAY29kZSBWYWx1ZX0gc2VxdWVuY2UgaXMKKwkgKiBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBidWlsZGluZyBmaWx0ZXIgY3JpdGVyaWEuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgICBUaGUge0Bjb2RlIEF0dHJpYnV0ZX0gd2hvc2UgZGlzdGluY3QgdmFsdWVzIHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgcXVlcmllZC4KKwkgKiBAcmV0dXJuIEEgZGlzdGluY3Qge0Bjb2RlIExpc3R9IG9mIGFsbCBhdmFpbGFibGUge0Bjb2RlIFZhbHVlfXMgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uICAgICAgVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSBkaXN0aW5jdAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBWYWx1ZX0gc2VxdWVuY2UuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHR5cGUgaXMgbm90IGFzc29jaWF0ZWQgd2l0aAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcHJlZGVmaW5lZCB7QGNvZGUgU2VhcmNoUXVlcnl9LgorCSAqIEBzZWUgI2xpc3RTZWFyY2hhYmxlVHlwZXMoKQorCSAqIEBzZWUgI2dldFNlYXJjaGFibGVSb290KENsYXNzKQorCSAqIEBzZWUgI2xpc3RFbnRpdHlUeXBlcyhDbGFzcykKKwkgKiBAc2VlICNnZXRGaWx0ZXJWYWx1ZXMoQ2xhc3MsIEF0dHJpYnV0ZSwgRmlsdGVyKQorCSAqLworCWRlZmF1bHQgTGlzdDxWYWx1ZT4gZ2V0RmlsdGVyVmFsdWVzKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzLCBBdHRyaWJ1dGUgYXR0cmlidXRlKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0RmlsdGVyVmFsdWVzKGVudGl0eUNsYXNzLCBhdHRyaWJ1dGUsIEZpbHRlci5hbmQoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGlzdGluY3Qge0BsaW5rIFZhbHVlfSBzZXF1ZW5jZSBmb3IgZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0gYW5kCisJICoge0BsaW5rIEZpbHRlcn0uIEJvdGggbXVzdCBiZSBmdWxseSBzdXBwb3J0ZWQgYnkgdGhlIHtAbGluayBTZWFyY2hRdWVyeX0KKwkgKiBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eX0gdHlwZS4gVGhlIHJldHVybmVkIHtAY29kZSBWYWx1ZX0KKwkgKiBzZXF1ZW5jZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBidWlsZGluZyBmaWx0ZXIgY3JpdGVyaWEuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgICBUaGUge0Bjb2RlIEF0dHJpYnV0ZX0gd2hvc2UgZGlzdGluY3QgdmFsdWVzIHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgcXVlcmllZC4KKwkgKiBAcGFyYW0gZmlsdGVyICAgICAgVGhlIGNyaXRlcmlhIHNlcXVlbmNlLgorCSAqIEByZXR1cm4gQSBkaXN0aW5jdCB7QGNvZGUgTGlzdH0gb2Yge0Bjb2RlIFZhbHVlfXMgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uICAgICAgVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSBkaXN0aW5jdAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBWYWx1ZX0gc2VxdWVuY2UuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHR5cGUgaXMgbm90IGFzc29jaWF0ZWQgd2l0aAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcHJlZGVmaW5lZCB7QGNvZGUgU2VhcmNoUXVlcnl9LgorCSAqIEBzZWUgI2xpc3RTZWFyY2hhYmxlVHlwZXMoKQorCSAqIEBzZWUgI2dldFNlYXJjaGFibGVSb290KENsYXNzKQorCSAqIEBzZWUgI2xpc3RFbnRpdHlUeXBlcyhDbGFzcykKKwkgKiBAc2VlICNnZXRGaWx0ZXJWYWx1ZXMoQ2xhc3MsIEF0dHJpYnV0ZSkKKwkgKi8KKwlMaXN0PFZhbHVlPiBnZXRGaWx0ZXJWYWx1ZXMoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEZpbHRlciBmaWx0ZXIpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoZSBhc3NvY2lhdGVkIHtAbGluayBTZWFyY2hRdWVyeX0gd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX1zLgorCSAqIFRoZSB7QGNvZGUgRW50aXR5VHlwZX1zIG11c3QgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9CisJICogYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHl9IHR5cGUuIFRoaXMgbWV0aG9kIHNlbGVjdHMgYWxsCisJICoge0BsaW5rIEF0dHJpYnV0ZX1zIG9mIGVhY2ggZ2l2ZW4ge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqCisJICogSXQgaXMgb25seSBndWFyYW50ZWVkIHRoYXQgdGhpcyBtZXRob2QgbG9hZHMgdGhlIHNlbGVjdGVkIGVudGl0aWVzLCBhbmQgdGhlaXIKKwkgKiByZWxhdGlvbnMgYW1vbmcgdGhlbXNlbHZlcy4gTm8gaW5mb3JtYXRpb24gYWJvdXQgYWRkaXRpb25hbCByZWxhdGVkIGVudGl0aWVzCisJICogaXMgbmVjZXNzYXJpbHkgbG9hZGVkLgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IFJlbGF0ZWQge0Bjb2RlIFJlY29yZH1zIG1heSBiZSBtZXJnZWQgYWNjb3JkaW5nIHRvIHRoZQorCSAqIGNhcmRpbmFsaXR5IG9mIHRoZSBhc3NvY2lhdGVkIHtAbGluayBSZWxhdGlvbn0uCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVHlwZSBvZiB0aGUgZW50aXRpZXMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgZWFjaAorCSAqICAgICAgICAgICAgICAgICAgICByZXN1bHQuCisJICogQHBhcmFtIGVudGl0eUNhc3MgIFVzZWQgYXMgdGhlIHtAY29kZSBTZWFyY2hRdWVyeX0gaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gZW50aXR5VHlwZXMgU2VsZWN0IHN0YXRlbWVudHMgd2lsbCBiZSBhZGRlZCBmb3IgYWxsIHtAY29kZSBBdHRyaWJ1dGV9cworCSAqICAgICAgICAgICAgICAgICAgICBvZiBlYWNoIGdpdmVuIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcmV0dXJuIEFsbCBtYXRjaGVkIGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBTZWFyY2hRdWVyeX0gb3IgYW5hbHl6aW5nIGl0cworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBSZXN1bHR9cy4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdHlwZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVkZWZpbmVkIHtAY29kZSBTZWFyY2hRdWVyeX0uCisJICogQHNlZSAjbGlzdFNlYXJjaGFibGVUeXBlcygpCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoQ2xhc3MpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKENsYXNzKQorCSAqIEBzZWUgI2ZldGNoKENsYXNzLCBMaXN0KQorCSAqIEBzZWUgUmVjb3JkI21lcmdlKFJlY29yZCkKKwkgKi8KKwlkZWZhdWx0IDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGZldGNoQ29tcGxldGUoQ2xhc3M8VD4gZW50aXR5Q2FzcywgTGlzdDxFbnRpdHlUeXBlPiBlbnRpdHlUeXBlcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZldGNoQ29tcGxldGUoZW50aXR5Q2FzcywgZW50aXR5VHlwZXMsIEZpbHRlci5hbmQoKSk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZXMgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFNlYXJjaFF1ZXJ5fSB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHlUeXBlfXMKKwkgKiBhbmQge0BsaW5rIEZpbHRlcn0uIEJvdGggbXVzdCBiZSBmdWxseSBzdXBwb3J0ZWQgYnkgdGhlIHtAY29kZSBTZWFyY2hRdWVyeX0KKwkgKiBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eX0gdHlwZS4gVGhpcyBtZXRob2Qgc2VsZWN0cyBhbGwKKwkgKiB7QGxpbmsgQXR0cmlidXRlfXMgb2YgZWFjaCBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogCisJICogSXQgaXMgb25seSBndWFyYW50ZWVkIHRoYXQgdGhpcyBtZXRob2QgbG9hZHMgdGhlIHNlbGVjdGVkIGVudGl0aWVzLCBhbmQgdGhlaXIKKwkgKiByZWxhdGlvbnMgYW1vbmcgdGhlbXNlbHZlcy4gTm8gaW5mb3JtYXRpb24gYWJvdXQgYWRkaXRpb25hbCByZWxhdGVkIGVudGl0aWVzCisJICogaXMgbmVjZXNzYXJpbHkgbG9hZGVkLgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IFJlbGF0ZWQge0Bjb2RlIFJlY29yZH1zIG1heSBiZSBtZXJnZWQgYWNjb3JkaW5nIHRvIHRoZQorCSAqIGNhcmRpbmFsaXR5IG9mIHRoZSBhc3NvY2lhdGVkIHtAbGluayBSZWxhdGlvbn0uCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVHlwZSBvZiB0aGUgZW50aXRpZXMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgZWFjaC4KKwkgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9IGlkZW50aWZpZXIuCisJICogQHBhcmFtIGVudGl0eVR5cGVzIFNlbGVjdCBzdGF0ZW1lbnRzIHdpbGwgYmUgYWRkZWQgZm9yIGFsbCB7QGNvZGUgQXR0cmlidXRlfXMKKwkgKiAgICAgICAgICAgICAgICAgICAgb2YgZWFjaCBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIGZpbHRlciAgICAgIFRoZSBjcml0ZXJpYSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIEFsbCBtYXRjaGVkIGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBTZWFyY2hRdWVyeX0gb3IgYW5hbHl6aW5nIGl0cworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBSZXN1bHR9cy4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdHlwZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVkZWZpbmVkIHtAY29kZSBTZWFyY2hRdWVyeX0uCisJICogQHNlZSAjbGlzdFNlYXJjaGFibGVUeXBlcygpCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoQ2xhc3MpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKENsYXNzKQorCSAqIEBzZWUgI2ZldGNoKENsYXNzLCBMaXN0LCBGaWx0ZXIpCisJICogQHNlZSBSZWNvcmQjbWVyZ2UoUmVjb3JkKQorCSAqLworCTxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGZldGNoQ29tcGxldGUoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIExpc3Q8RW50aXR5VHlwZT4gZW50aXR5VHlwZXMsIEZpbHRlciBmaWx0ZXIpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoZSBhc3NvY2lhdGVkIHtAbGluayBTZWFyY2hRdWVyeX0gYW5kIHJldHVybnMgYWxsIGF2YWlsYWJsZQorCSAqIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lmaWVkIHtAbGluayBFbnRpdHl9IHR5cGUuCisJICogCisJICogSXQgaXMgb25seSBndWFyYW50ZWVkIHRoYXQgdGhpcyBtZXRob2QgbG9hZHMgdGhlIHNlbGVjdGVkIGVudGl0eSwgbm8KKwkgKiBpbmZvcm1hdGlvbiBhYm91dCByZWxhdGVkIGVudGl0aWVzIGlzIG5lY2Vzc2FyaWx5IGxvYWRlZC4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUeXBlIG9mIHRoZSBlbnRpdGllcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoCisJICogICAgICAgICAgICAgICAgICAgIHJlc3VsdC4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gQWxsIGF2YWlsYWJsZSBlbnRpdGllcyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uICAgICAgVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgU2VhcmNoUXVlcnl9IG9yIGFuYWx5emluZyBpdHMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgUmVzdWx0fXMuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHR5cGUgaXMgbm90IGFzc29jaWF0ZWQgd2l0aAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcHJlZGVmaW5lZCB7QGNvZGUgU2VhcmNoUXVlcnl9LgorCSAqIEBzZWUgI2xpc3RTZWFyY2hhYmxlVHlwZXMoKQorCSAqIEBzZWUgI2ZldGNoKENsYXNzLCBGaWx0ZXIpCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBmZXRjaChDbGFzczxUPiBlbnRpdHlDbGFzcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZmV0Y2goZW50aXR5Q2xhc3MsIEZpbHRlci5hbmQoKSk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZXMgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFNlYXJjaFF1ZXJ5fSB3aXRoIGdpdmVuIHtAbGluayBGaWx0ZXJ9LiBUaGUKKwkgKiB7QGNvZGUgRmlsdGVyfSBtdXN0IGJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBhc3NvY2lhdGVkCisJICogd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5fSB0eXBlLiBJdCBpcyBvbmx5IGd1YXJhbnRlZWQgdGhhdCB0aGlzIG1ldGhvZCBsb2FkcworCSAqIHRoZSBzZWxlY3RlZCBlbnRpdHksIG5vIGluZm9ybWF0aW9uIGFib3V0IHJlbGF0ZWQgZW50aXRpZXMgaXMgbmVjZXNzYXJpbHkKKwkgKiBsb2FkZWQuCisJICogCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVHlwZSBvZiB0aGUgZW50aXRpZXMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgZWFjaAorCSAqICAgICAgICAgICAgICAgICAgICByZXN1bHQuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgdGhlIHtAY29kZSBTZWFyY2hRdWVyeX0gaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gZmlsdGVyICAgICAgVGhlIGNyaXRlcmlhIHNlcXVlbmNlLgorCSAqIEByZXR1cm4gQWxsIG1hdGNoZWQgZW50aXRpZXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiAgICAgIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBvciBhbmFseXppbmcgaXRzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB0eXBlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHByZWRlZmluZWQge0Bjb2RlIFNlYXJjaFF1ZXJ5fS4KKwkgKiBAc2VlICNsaXN0U2VhcmNoYWJsZVR5cGVzKCkKKwkgKiBAc2VlICNnZXRTZWFyY2hhYmxlUm9vdChDbGFzcykKKwkgKiBAc2VlICNsaXN0RW50aXR5VHlwZXMoQ2xhc3MpCisJICogQHNlZSAjZmV0Y2goQ2xhc3MpCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBmZXRjaChDbGFzczxUPiBlbnRpdHlDbGFzcywgRmlsdGVyIGZpbHRlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZmV0Y2goZW50aXR5Q2xhc3MsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBmaWx0ZXIpOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoZSBhc3NvY2lhdGVkIHtAbGluayBTZWFyY2hRdWVyeX0gd2l0aCBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfXMuCisJICogVGhlIHtAY29kZSBBdHRyaWJ1dGV9cyBtdXN0IGJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fQorCSAqIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5fSB0eXBlLiBUaGlzIG1ldGhvZCBhbGxvd3MgZmluZSBncmFpbmVkCisJICoge0BsaW5rIFJlY29yZH0gY29uZmlndXJhdGlvbi4KKwkgKiAKKwkgKiBJdCBpcyBvbmx5IGd1YXJhbnRlZWQgdGhhdCB0aGlzIG1ldGhvZCBsb2FkcyB0aGUgc2VsZWN0ZWQgZW50aXR5IG9yCisJICogYXR0cmlidXRlcywgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCByZWxhdGVkIGVudGl0aWVzIGlzIG5lY2Vzc2FyaWx5CisJICogbG9hZGVkLgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IFJlbGF0ZWQge0Bjb2RlIFJlY29yZH1zIG1heSBiZSBtZXJnZWQgYWNjb3JkaW5nIHRvIHRoZQorCSAqIGNhcmRpbmFsaXR5IG9mIHRoZSBhc3NvY2lhdGVkIHtAbGluayBSZWxhdGlvbn0uCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVHlwZSBvZiB0aGUgZW50aXRpZXMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgZWFjaAorCSAqICAgICAgICAgICAgICAgICAgICByZXN1bHQuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgdGhlIHtAY29kZSBTZWFyY2hRdWVyeX0gaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gYXR0cmlidXRlcyAgU2VsZWN0IHN0YXRlbWVudHMgd2lsbCBiZSBhZGRlZCBmb3IgZWFjaCB7QGNvZGUKKwkgKiAJCUF0dHJpYnV0ZX0gLgorCSAqIEByZXR1cm4gQWxsIG1hdGNoZWQgZW50aXRpZXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiAgICAgIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBvciBhbmFseXppbmcgaXRzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB0eXBlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHByZWRlZmluZWQge0Bjb2RlIFNlYXJjaFF1ZXJ5fS4KKwkgKiBAc2VlICNsaXN0U2VhcmNoYWJsZVR5cGVzKCkKKwkgKiBAc2VlICNnZXRTZWFyY2hhYmxlUm9vdChDbGFzcykKKwkgKiBAc2VlICNsaXN0RW50aXR5VHlwZXMoQ2xhc3MpCisJICogQHNlZSAjZmV0Y2hDb21wbGV0ZShDbGFzcywgTGlzdCkKKwkgKiBAc2VlIFJlY29yZCNtZXJnZShSZWNvcmQpCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBmZXRjaChDbGFzczxUPiBlbnRpdHlDbGFzcywgTGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBmZXRjaChlbnRpdHlDbGFzcywgYXR0cmlidXRlcywgRmlsdGVyLmFuZCgpKTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgU2VhcmNoUXVlcnl9IHdpdGggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX1zIGFuZAorCSAqIHtAbGluayBGaWx0ZXJ9LiBCb3RoIG11c3QgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9CisJICogYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHl9IHR5cGUuIFRoaXMgbWV0aG9kIGFsbG93cyBmaW5lIGdyYWluZWQKKwkgKiB7QGxpbmsgUmVjb3JkfSBjb25maWd1cmF0aW9uLgorCSAqIAorCSAqIEl0IGlzIG9ubHkgZ3VhcmFudGVlZCB0aGF0IHRoaXMgbWV0aG9kIGxvYWRzIHRoZSBzZWxlY3RlZCBlbnRpdHkgb3IKKwkgKiBhdHRyaWJ1dGVzLCBubyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHJlbGF0ZWQgZW50aXRpZXMgaXMgbmVjZXNzYXJpbHkKKwkgKiBsb2FkZWQuCisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gUmVsYXRlZCB7QGNvZGUgUmVjb3JkfXMgbWF5IGJlIG1lcmdlZCBhY2NvcmRpbmcgdG8gdGhlCisJICogY2FyZGluYWxpdHkgb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFJlbGF0aW9ufS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUeXBlIG9mIHRoZSBlbnRpdGllcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoCisJICogICAgICAgICAgICAgICAgICAgIHJlc3VsdC4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzICBTZWxlY3Qgc3RhdGVtZW50cyB3aWxsIGJlIGFkZGVkIGZvciBlYWNoIHtAY29kZQorCSAqIAkJQXR0cmlidXRlfSAuCisJICogQHBhcmFtIGZpbHRlciAgICAgIFRoZSBjcml0ZXJpYSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIEFsbCBtYXRjaGVkIGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBTZWFyY2hRdWVyeX0gb3IgYW5hbHl6aW5nIGl0cworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBSZXN1bHR9cy4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdHlwZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVkZWZpbmVkIHtAY29kZSBTZWFyY2hRdWVyeX0uCisJICogQHNlZSAjbGlzdFNlYXJjaGFibGVUeXBlcygpCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoQ2xhc3MpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKENsYXNzKQorCSAqIEBzZWUgI2ZldGNoQ29tcGxldGUoQ2xhc3MsIExpc3QsIEZpbHRlcikKKwkgKiBAc2VlIFJlY29yZCNtZXJnZShSZWNvcmQpCisJICovCisJPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gZmV0Y2goQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzLCBGaWx0ZXIgZmlsdGVyKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgU2VhcmNoUXVlcnl9IHdpdGggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX1zIGFuZAorCSAqIHtAbGluayBGaWx0ZXJ9LiBCb3RoIG11c3QgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9CisJICogYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHl9IHR5cGUuIFRoaXMgbWV0aG9kIGFsbG93cyBmaW5lIGdyYWluZWQKKwkgKiB7QGxpbmsgUmVjb3JkfSBjb25maWd1cmF0aW9uLiBUaGlzIG1ldGhvZCBhbGxvd3MgdG8gc3BlY2lmeSBhIGZ1bGx0ZXh0IHNlYXJjaAorCSAqIHF1ZXJ5IHN0cmluZy4KKwkgKiAKKwkgKiBJdCBpcyBvbmx5IGd1YXJhbnRlZWQgdGhhdCB0aGlzIG1ldGhvZCBsb2FkcyB0aGUgc2VsZWN0ZWQgZW50aXR5IG9yCisJICogYXR0cmlidXRlcywgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCByZWxhdGVkIGVudGl0aWVzIGlzIG5lY2Vzc2FyaWx5CisJICogbG9hZGVkLgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IFJlbGF0ZWQge0Bjb2RlIFJlY29yZH1zIG1heSBiZSBtZXJnZWQgYWNjb3JkaW5nIHRvIHRoZQorCSAqIGNhcmRpbmFsaXR5IG9mIHRoZSBhc3NvY2lhdGVkIHtAbGluayBSZWxhdGlvbn0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzICBTZWxlY3Qgc3RhdGVtZW50cyB3aWxsIGJlIGFkZGVkIGZvciBlYWNoIHtAY29kZQorCSAqIAkJQXR0cmlidXRlfSAuCisJICogQHBhcmFtIGZpbHRlciAgICAgIFRoZSBjcml0ZXJpYSBzZXF1ZW5jZS4KKwkgKiBAcGFyYW0gcXVlcnkgICAgICAgVGhlIGZ1bGx0ZXh0IHNlYXJjaCBxdWVyeQorCSAqIEByZXR1cm4gQWxsIHtAbGluayBSZXN1bHR9cyBmb3VuZCBieSB0aGUge0BsaW5rIFNlYXJjaFF1ZXJ5fSB3aXRoIGdpdmVuCisJICogICAgICAgICB7QGxpbmsgQXR0cmlidXRlfXMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uICAgICAgVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgU2VhcmNoUXVlcnl9IG9yIGFuYWx5emluZyBpdHMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgUmVzdWx0fXMuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHR5cGUgaXMgbm90IGFzc29jaWF0ZWQgd2l0aAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcHJlZGVmaW5lZCB7QGNvZGUgU2VhcmNoUXVlcnl9LgorCSAqIEBzZWUgI2xpc3RTZWFyY2hhYmxlVHlwZXMoKQorCSAqIEBzZWUgI2dldFNlYXJjaGFibGVSb290KENsYXNzKQorCSAqIEBzZWUgI2xpc3RFbnRpdHlUeXBlcyhDbGFzcykKKwkgKiBAc2VlIFJlY29yZCNtZXJnZShSZWNvcmQpCisJICovCisJZGVmYXVsdCBMaXN0PFJlc3VsdD4gZmV0Y2hSZXN1bHRzKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzLCBMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcywgRmlsdGVyIGZpbHRlciwKKwkJCVN0cmluZyBxdWVyeSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlkZWZhdWx0IGJvb2xlYW4gaXNUZXh0U2VhcmNoQXZhaWxhYmxlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBmZXRjaChDbGFzczxUPiBlbnRpdHlDbGFzcywgU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiAoTGlzdDxUPikgZmV0Y2gocXVlcnkpLmdldE9yRGVmYXVsdChlbnRpdHlDbGFzcywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworCX0KKworCWRlZmF1bHQgTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PEVudGl0eT4+IGZldGNoKFN0cmluZyBxdWVyeSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9zZWFyY2gvU2VhcmNoYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3NlYXJjaC9TZWFyY2hhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0MWIwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9zZWFyY2gvU2VhcmNoYWJsZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworCisvKioKKyAqIEEgc2VhcmNoYWJsZSBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBoaWVyYXJjaGljYWwgb3JkZXIgb2YKKyAqIHtAbGluayBFbnRpdHlUeXBlfXMgYmVpbmcgdXNlZCBmb3Igc2VhcmNoaW5nLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBTZWFyY2hTZXJ2aWNlCisgKiBAc2VlIFNlYXJjaFF1ZXJ5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VhcmNoYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCByZWxhdGVkIHNlYXJjaGFibGVzLgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTGlzdH0gbWF5IGJlIGltbXV0YWJsZS4KKwkgKi8KKwlMaXN0PFNlYXJjaGFibGU+IGdldFJlbGF0ZWRTZWFyY2hhYmxlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eVR5cGV9IHJlcHJlc2VudGVkIGJ5IHRoaXMgc2VhcmNoYWJsZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBFbnRpdHlUeXBlfSByZXByZXNlbnRlZCBieSB0aGlzIHNlYXJjaGFibGUgaXMgcmV0dXJuZWQuCisJICovCisJRW50aXR5VHlwZSBnZXRFbnRpdHlUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHNlYXJjaGFibGUgZG9lc24ndCBoYXZlIGZ1cnRoZXIgcmVsYXRlZAorCSAqIHNlYXJjaGFibGVzLgorCSAqCisJICogQHJldHVybiBUcnVlIGlmIHRoaXMgaW5zdGFuY2UgZG9lcyBub3QgcmVsYXRlIGZ1cnRoZXIgc2VhcmNoYWJsZXMuCisJICovCisJZGVmYXVsdCBib29sZWFuIGlzTGVhZigpIHsKKwkJcmV0dXJuIGdldFJlbGF0ZWRTZWFyY2hhYmxlcygpLmlzRW1wdHkoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9BdHRyaWJ1dGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQXR0cmlidXRlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmZDNmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQXR0cmlidXRlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKKworcHVibGljIGNsYXNzIEF0dHJpYnV0ZUltcGwgaW1wbGVtZW50cyBBdHRyaWJ1dGUgeworCisJcHVibGljIGVudW0gVHlwZSB7CisJCUlELCBVTktOT1dOOworCX0KKworCVR5cGUgdHlwZTsKKworCXB1YmxpYyBBdHRyaWJ1dGVJbXBsKFR5cGUgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHR5cGUubmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdCgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFZhbHVlVHlwZSBnZXRWYWx1ZVR5cGUoKSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIElEOgorCQkJcmV0dXJuIFZhbHVlVHlwZS5TVFJJTkc7CisJCWRlZmF1bHQ6CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFbnVtZXJhdGlvbjw/PiBnZXRFbnVtT2JqKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQmFzZUVudGl0eU1hbmFnZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQmFzZUVudGl0eU1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1ZmM1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlRW50aXR5TWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUNvbGxlY3Rpb247CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55U3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmVxOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgQmFzZUVudGl0eU1hbmFnZXJUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgbG9hZFNob3VsZFJldHVybkVudGl0eSgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJQmFzZUVudGl0eU1hbmFnZXIgZW50aXR5TWFuYWdlciA9IG1vY2soQmFzZUVudGl0eU1hbmFnZXIuY2xhc3MpOworCQlUZXN0U3RlcCBtb2NrZWRUZXN0U3RlcCA9IG1vY2soVGVzdFN0ZXAuY2xhc3MpOworCisJCXdoZW4oZW50aXR5TWFuYWdlci5sb2FkKGFueSgpLCBhbnlTdHJpbmcoKSkpLnRoZW5DYWxsUmVhbE1ldGhvZCgpOworCQl3aGVuKGVudGl0eU1hbmFnZXIubG9hZChUZXN0U3RlcC5jbGFzcywgQXJyYXlzLmFzTGlzdCgiaWQxIikpKS50aGVuUmV0dXJuKEFycmF5cy5hc0xpc3QobW9ja2VkVGVzdFN0ZXApKTsKKworCQlhc3NlcnRUaGF0KGVudGl0eU1hbmFnZXIubG9hZChUZXN0U3RlcC5jbGFzcywgImlkMSIpKS5pc0VxdWFsVG8obW9ja2VkVGVzdFN0ZXApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbG9hZE5vdEV4aXN0aW5nSWRTaG91bGRUaHJvd0RhdGFBY2Nlc3NFeGNlcHRpb24oKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUJhc2VFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXIgPSBtb2NrKEJhc2VFbnRpdHlNYW5hZ2VyLmNsYXNzKTsKKworCQl3aGVuKGVudGl0eU1hbmFnZXIubG9hZChhbnkoKSwgYW55U3RyaW5nKCkpKS50aGVuQ2FsbFJlYWxNZXRob2QoKTsKKwkJd2hlbihlbnRpdHlNYW5hZ2VyLmxvYWQoZXEoVGVzdFN0ZXAuY2xhc3MpLCBhbnlDb2xsZWN0aW9uKCkpKS50aGVuUmV0dXJuKENvbGxlY3Rpb25zLjxUZXN0U3RlcD5lbXB0eUxpc3QoKSk7CisKKwkJYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGVudGl0eU1hbmFnZXIubG9hZChUZXN0U3RlcC5jbGFzcywgInh5eiIpKS5pc0luc3RhbmNlT2YoRGF0YUFjY2Vzc0V4Y2VwdGlvbi5jbGFzcykKKwkJCQkuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIkZhaWxlZCB0byBsb2FkIGVudGl0eSBieSBpbnN0YW5jZSBJRC4iKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxvYWROb3RVbmlxdWVJZFNob3VsZFRocm93RGF0YUFjY2Vzc0V4Y2VwdGlvbigpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJQmFzZUVudGl0eU1hbmFnZXIgZW50aXR5TWFuYWdlciA9IG1vY2soQmFzZUVudGl0eU1hbmFnZXIuY2xhc3MpOworCQlUZXN0U3RlcCBtb2NrZWRUZXN0U3RlcDEgPSBtb2NrKFRlc3RTdGVwLmNsYXNzKTsKKwkJVGVzdFN0ZXAgbW9ja2VkVGVzdFN0ZXAyID0gbW9jayhUZXN0U3RlcC5jbGFzcyk7CisKKwkJd2hlbihlbnRpdHlNYW5hZ2VyLmxvYWQoYW55KCksIGFueVN0cmluZygpKSkudGhlbkNhbGxSZWFsTWV0aG9kKCk7CisJCXdoZW4oZW50aXR5TWFuYWdlci5sb2FkKFRlc3RTdGVwLmNsYXNzLCBBcnJheXMuYXNMaXN0KCJpZDEiKSkpCisJCQkJLnRoZW5SZXR1cm4oQXJyYXlzLmFzTGlzdChtb2NrZWRUZXN0U3RlcDEsIG1vY2tlZFRlc3RTdGVwMikpOworCisJCWFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBlbnRpdHlNYW5hZ2VyLmxvYWQoVGVzdFN0ZXAuY2xhc3MsICJpZDEiKSkuaXNJbnN0YW5jZU9mKERhdGFBY2Nlc3NFeGNlcHRpb24uY2xhc3MpCisJCQkJLmhhc01lc3NhZ2VDb250YWluaW5nKCJGYWlsZWQgdG8gbG9hZCBlbnRpdHkgYnkgaW5zdGFuY2UgSUQuIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0NvcmVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQ29yZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNTU0NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0NvcmVJbXBsLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5DaGlsZHJlblN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5U3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb25TdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CisKKy8qKgorICogCisgKiBWZXJ5IGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3JlIGNsYXNzLiBUaGUgY29udGVudHMgaXMgaW5pdGlhbGl6ZWQgdmlhCisgKiBhIGdpdmVuIG1hcCAoaW5zdGVhZCBvZiB1c2luZyBhIGRhdGFiYXNlIG9yIHNvbWUgb3RoZXIgbWV0aG9kKQorICogCisgKiBAYXV0aG9yIEZsb3JpYW4gU2NobWl0dAorICovCitwdWJsaWMgY2xhc3MgQ29yZUltcGwgaW1wbGVtZW50cyBDb3JlIHsKKworCXByaXZhdGUgTWFwPFN0cmluZywgVmFsdWU+IHZhbHVlczsKKwlwcml2YXRlIEVudGl0eVN0b3JlIG11dGFibGVTdG9yZTsKKworCXB1YmxpYyBDb3JlSW1wbChNYXA8U3RyaW5nLCBWYWx1ZT4gdmFsdWVzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMudmFsdWVzID0gdmFsdWVzOworCQl0aGlzLm11dGFibGVTdG9yZSA9IG5ldyBFbnRpdHlTdG9yZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsKKwkJcmV0dXJuICJVbml0VGVzdFNvdXJjZSI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKKwkJcmV0dXJuICJVbml0VGVzdFR5cGUiOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisJCXJldHVybiAiNDcxMWwiOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpbnN0YW5jZUlEKSB7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgVmFsdWU+IGdldFZhbHVlcygpIHsKKwkJcmV0dXJuIHZhbHVlczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBoaWRlVmFsdWVzKENvbGxlY3Rpb248U3RyaW5nPiBuYW1lcykgeworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIFZhbHVlPiBnZXRBbGxWYWx1ZXMoKSB7CisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVudGl0eVN0b3JlIGdldE11dGFibGVTdG9yZSgpIHsKKwkJcmV0dXJuIG11dGFibGVTdG9yZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5U3RvcmUgZ2V0UGVybWFuZW50U3RvcmUoKSB7CisJCXJldHVybiBuZXcgRW50aXR5U3RvcmUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2hpbGRyZW5TdG9yZSBnZXRDaGlsZHJlblN0b3JlKCkgeworCQlyZXR1cm4gbmV3IENoaWxkcmVuU3RvcmUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb25TdG9yZSBnZXROdG9NU3RvcmUoKSB7CisJCXJldHVybiBuZXcgUmVsYXRpb25TdG9yZSgpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9FbnRpdHlGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0VudGl0eUZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGVhYmIzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9FbnRpdHlGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKKworLyoqCisgKiAKKyAqIFZlcnkgYmFzaWMgaW1wbGVtZW50YXRpb24gb2YgQmFzZUVudGl0eUZhY3RvcnkgZm9yIHRlc3RpbmcgcHVycG9zZXMuIFdlCisgKiBkZWxpdmVyIGEgY29yZSBjb250YWluaW5nIGRhdGEgb24gaW5pdGlhbGl6YXRpb24gdG8gc2ltdWxhdGUgb3RoZXIgZGF0YQorICogc291cmNlcy4KKyAqIAorICogQGF1dGhvciBGbG9yaWFuIFNjaG1pdHQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlGYWN0b3J5SW1wbCBleHRlbmRzIEJhc2VFbnRpdHlGYWN0b3J5IHsKKworCXByaXZhdGUgQ29yZSBjb3JlOworCisJcHVibGljIEVudGl0eUZhY3RvcnlJbXBsKENvcmUgY29yZSkgeworCQl0aGlzLmNvcmUgPSBjb3JlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcHRpb25hbDxVc2VyPiBnZXRMb2dnZWRJblVzZXIoKSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKG51bGwpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudGl0eT4gQ29yZSBjcmVhdGVDb3JlKENsYXNzPFQ+IGVudGl0eUNsYXNzKSB7CisJCXJldHVybiBjb3JlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudGl0eT4gQ29yZSBjcmVhdGVDb3JlKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlyZXR1cm4gY29yZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBFbnRpdHk+IENvcmUgY3JlYXRlQ29yZShTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gZW50aXR5Q2xhc3MpIHsKKwkJcmV0dXJuIGNvcmU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9FbnRpdHlUeXBlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0VudGl0eVR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdkY2UxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9FbnRpdHlUeXBlSW1wbC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5BdHRyaWJ1dGVJbXBsLlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb25UeXBlOworCitwdWJsaWMgY2xhc3MgRW50aXR5VHlwZUltcGwgaW1wbGVtZW50cyBFbnRpdHlUeXBlIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gIjAiOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEF0dHJpYnV0ZSBnZXRJREF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVJbXBsKFR5cGUuSUQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFJlbGF0aW9uPiBnZXRSZWxhdGlvbnMoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFJlbGF0aW9uPiBnZXRQYXJlbnRSZWxhdGlvbnMoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFJlbGF0aW9uPiBnZXRDaGlsZFJlbGF0aW9ucygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldEluZm9SZWxhdGlvbnMoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFJlbGF0aW9uPiBnZXRSZWxhdGlvbnMoUmVsYXRpb25UeXBlIHJlbGF0aW9uVHlwZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb24gZ2V0UmVsYXRpb24oRW50aXR5VHlwZSB0YXJnZXQpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFJlbGF0aW9uIGdldFJlbGF0aW9uKEVudGl0eVR5cGUgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9SZWxhdGlvbkltcGwuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9SZWxhdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZmFkM2NlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL1JlbGF0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvblR5cGU7CisKK3B1YmxpYyBjbGFzcyBSZWxhdGlvbkltcGwgaW1wbGVtZW50cyBSZWxhdGlvbiB7CisKKwlwdWJsaWMgZW51bSBBdHRyaWJ1dGVUeXBlIHsKKwkJSUQsIFVOS05PV047CisJfQorCisJQXR0cmlidXRlVHlwZSB0eXBlOworCisJcHVibGljIFJlbGF0aW9uSW1wbChBdHRyaWJ1dGVUeXBlIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0eXBlLm5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5VHlwZSBnZXRTb3VyY2UoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldFRhcmdldCgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFJlbGF0aW9uVHlwZSBnZXRSZWxhdGlvblR5cGUoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKCkgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBJRDoKKwkJCXJldHVybiBuZXcgQXR0cmlidXRlSW1wbChBdHRyaWJ1dGVJbXBsLlR5cGUuSUQpOworCQlkZWZhdWx0OgorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc091dGdvaW5nKFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNJbmNvbWluZyhSZWxhdGlvblR5cGUgcmVsYXRpb25UeXBlKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc050b00oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ29udGV4dENvbXBvbmVudFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Q29tcG9uZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGYxZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ29udGV4dENvbXBvbmVudFRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnNweTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNoaWxkcmVuU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlTdG9yZTsKKworcHVibGljIGNsYXNzIENvbnRleHRDb21wb25lbnRUZXN0IHsKKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZXh0Um9vdCgpIHsKKwkJQmFzZUVudGl0eUZhY3RvcnkgZmFjdG9yeSA9IHNweShCYXNlRW50aXR5RmFjdG9yeS5jbGFzcyk7CisJCUNvcmUgcm9vdENvcmUgPSBjcmVhdGVDb3JlKCJVTklUVU5ERVJURVNUIik7CisJCXdoZW4oZmFjdG9yeS5jcmVhdGVDb3JlKENvbnRleHRSb290LmNsYXNzLCBDb250ZXh0VHlwZS5VTklUVU5ERVJURVNUKSkudGhlblJldHVybihyb290Q29yZSk7CisJCUNvcmUgY29tcG9uZW50Q29yZSA9IGNyZWF0ZUNvcmUoIiIpOworCQl3aGVuKGZhY3RvcnkuY3JlYXRlQ29yZSgiRW5naW5lIiwgQ29udGV4dENvbXBvbmVudC5jbGFzcykpLnRoZW5SZXR1cm4oY29tcG9uZW50Q29yZSk7CisKKwkJQ29udGV4dFJvb3QgY29udGV4dFJvb3QgPSBmYWN0b3J5LmNyZWF0ZUNvbnRleHRSb290KCJDYXIiLCBDb250ZXh0VHlwZS5VTklUVU5ERVJURVNUKTsKKwkJQ29udGV4dENvbXBvbmVudCBjb250ZXh0Q29tcG9uZW50ID0gZmFjdG9yeS5jcmVhdGVDb250ZXh0Q29tcG9uZW50KCJFbmdpbmUiLCBjb250ZXh0Um9vdCk7CisKKwkJYXNzZXJ0VGhhdChjb250ZXh0Q29tcG9uZW50LmdldENvbnRleHRSb290KCkpLmlzRXF1YWxUbyhjb250ZXh0Um9vdCk7CisJfQorCisJcHJpdmF0ZSBDb3JlIGNyZWF0ZUNvcmUoU3RyaW5nIHR5cGUpIHsKKwkJQ29yZSBjb3JlID0gbW9jayhDb3JlLmNsYXNzKTsKKworCQlNYXA8U3RyaW5nLCBWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hNYXA8PigpOworCQl2YWx1ZXMucHV0KCJOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIk5hbWUiKSk7CisJCXZhbHVlcy5wdXQoIlZlcnNpb24iLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiVmVyc2lvbiIpKTsKKworCQl3aGVuKGNvcmUuZ2V0VmFsdWVzKCkpLnRoZW5SZXR1cm4odmFsdWVzKTsKKwkJd2hlbihjb3JlLmdldFR5cGVOYW1lKCkpLnRoZW5SZXR1cm4odHlwZSk7CisJCXdoZW4oY29yZS5nZXRQZXJtYW5lbnRTdG9yZSgpKS50aGVuUmV0dXJuKG5ldyBFbnRpdHlTdG9yZSgpKTsKKwkJd2hlbihjb3JlLmdldENoaWxkcmVuU3RvcmUoKSkudGhlblJldHVybihuZXcgQ2hpbGRyZW5TdG9yZSgpKTsKKworCQlyZXR1cm4gY29yZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ29udGV4dFNlbnNvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0U2Vuc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjdlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ29udGV4dFNlbnNvclRlc3QuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnNweTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNoaWxkcmVuU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlTdG9yZTsKKworcHVibGljIGNsYXNzIENvbnRleHRTZW5zb3JUZXN0IHsKKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZXh0Q29tcG9uZW50KCkgeworCQlCYXNlRW50aXR5RmFjdG9yeSBmYWN0b3J5ID0gc3B5KEJhc2VFbnRpdHlGYWN0b3J5LmNsYXNzKTsKKwkJQ29yZSByb290Q29yZSA9IGNyZWF0ZUNvcmUoIlRFU1RFUVVJUE1FTlQiKTsKKwkJd2hlbihmYWN0b3J5LmNyZWF0ZUNvcmUoQ29udGV4dFJvb3QuY2xhc3MsIENvbnRleHRUeXBlLlRFU1RFUVVJUE1FTlQpKS50aGVuUmV0dXJuKHJvb3RDb3JlKTsKKwkJQ29yZSBjb21wb25lbnRDb3JlID0gY3JlYXRlQ29yZSgiIik7CisJCXdoZW4oZmFjdG9yeS5jcmVhdGVDb3JlKCJTZW5zb3JEZXZpY2UiLCBDb250ZXh0Q29tcG9uZW50LmNsYXNzKSkudGhlblJldHVybihjb21wb25lbnRDb3JlKTsKKwkJQ29yZSBzZW5zb3JDb3JlID0gY3JlYXRlQ29yZSgiIik7CisJCXdoZW4oZmFjdG9yeS5jcmVhdGVDb3JlKCJTZW5zb3IiLCBDb250ZXh0U2Vuc29yLmNsYXNzKSkudGhlblJldHVybihzZW5zb3JDb3JlKTsKKworCQlDb250ZXh0Um9vdCBjb250ZXh0Um9vdCA9IGZhY3RvcnkuY3JlYXRlQ29udGV4dFJvb3QoIlNlbnNvckRldmljZXMiLCBDb250ZXh0VHlwZS5URVNURVFVSVBNRU5UKTsKKwkJQ29udGV4dENvbXBvbmVudCBjb250ZXh0Q29tcG9uZW50ID0gZmFjdG9yeS5jcmVhdGVDb250ZXh0Q29tcG9uZW50KCJTZW5zb3JEZXZpY2UiLCBjb250ZXh0Um9vdCk7CisJCUNvbnRleHRTZW5zb3IgY29udGV4dFNlbnNvciA9IGZhY3RvcnkuY3JlYXRlQ29udGV4dFNlbnNvcigiU2Vuc29yIiwgY29udGV4dENvbXBvbmVudCk7CisKKwkJYXNzZXJ0VGhhdChjb250ZXh0U2Vuc29yLmdldENvbnRleHRDb21wb25lbnQoKSkuaXNFcXVhbFRvKGNvbnRleHRDb21wb25lbnQpOworCX0KKworCXByaXZhdGUgQ29yZSBjcmVhdGVDb3JlKFN0cmluZyB0eXBlKSB7CisJCUNvcmUgY29yZSA9IG1vY2soQ29yZS5jbGFzcyk7CisKKwkJTWFwPFN0cmluZywgVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJdmFsdWVzLnB1dCgiTmFtZSIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJOYW1lIikpOworCQl2YWx1ZXMucHV0KCJWZXJzaW9uIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIlZlcnNpb24iKSk7CisKKwkJd2hlbihjb3JlLmdldFZhbHVlcygpKS50aGVuUmV0dXJuKHZhbHVlcyk7CisJCXdoZW4oY29yZS5nZXRUeXBlTmFtZSgpKS50aGVuUmV0dXJuKHR5cGUpOworCQl3aGVuKGNvcmUuZ2V0UGVybWFuZW50U3RvcmUoKSkudGhlblJldHVybihuZXcgRW50aXR5U3RvcmUoKSk7CisJCXdoZW4oY29yZS5nZXRDaGlsZHJlblN0b3JlKCkpLnRoZW5SZXR1cm4obmV3IENoaWxkcmVuU3RvcmUoKSk7CisKKwkJcmV0dXJuIGNvcmU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL01vZGVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL01vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNkMDI1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSwzNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvcmVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5FbnRpdHlGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5Vbml0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGEuV3JpdGVSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5Xcml0ZVJlcXVlc3RCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlZFZhbHVlcy5WYWx1ZUl0ZXJhdG9yOworCisvKioKKyAqIAorICogc29tZSB1bml0IHRlc3QgdG8gdGVzdCBmdW5jdGlvbmFsaXR5IG9mIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC4gQXQKKyAqIHRoaXMgcG9pbnQsIHBsZWFzZSBkb24ndCBleHBlY3QgYW55dGhpbmcgbmVhciBjb21wbGV0ZSB0ZXN0IGNvdmVyYWdlLgorICogCisgKiBAYXV0aG9yIEZsb3JpYW4gU2NobWl0dAorICoKKyAqLworcHVibGljIGNsYXNzIE1vZGVsVGVzdCB7CisKKwkvLyBjb21wYXJlIGRvdWJsZXMgdXAgdG8gdGhpcyBhY2N1cmFjeQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBFUFNJTE9OID0gMC4wMDAwNWQ7CisKKwkvKioKKwkgKiBiYXNpYyB0ZXN0IGZvciByZWFkaW5nIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci5UaGUgaW50aWFsaXphdGlvbiB2aWEgbWFwcyBpcworCSAqIG5lZWRlZCB0byBzaW11bGF0ZSB0aGUgZGF0YSBzdG9yZS4KKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBwYXJhbWV0ZXJWYWx1ZSgpIHsKKwkJTWFwPFN0cmluZywgVmFsdWU+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJbWFwLnB1dCgiRGF0YVR5cGUiLCBuZXcgVmFsdWUoVmFsdWVUeXBlLlNUUklORywgIkRhdGFUeXBlIiwgbnVsbCwgdHJ1ZSwgU2NhbGFyVHlwZS5GTE9BVCwgU2NhbGFyVHlwZS5jbGFzcywKKwkJCQlTY2FsYXJUeXBlLkZMT0FULCBFbnVtUmVnaXN0cnkuU0NBTEFSX1RZUEUpKTsKKwkJbWFwLnB1dCgiVmFsdWUiLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiVmFsdWUiLCBudWxsLCB0cnVlLCAiNS43IikpOworCQltYXAucHV0KCJOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIk5hbWUiLCBudWxsLCB0cnVlLCAicGFyYW1uYW1lIikpOworCQlDb3JlIGNvcmUgPSBuZXcgQ29yZUltcGwobWFwKTsKKwkJUGFyYW1ldGVyIHRwID0gbmV3IFBhcmFtZXRlcihjb3JlKTsKKwkJVmFsdWUgdnYgPSB0cC5nZXRWaXJ0dWFsVmFsdWUoKTsKKwkJRmxvYXQgZXh0cmFjdGVkID0gdnYuZXh0cmFjdCgpOworCQlhc3NlcnRFcXVhbHMoNS43ZiwgZXh0cmFjdGVkLCBFUFNJTE9OKTsKKwl9CisKKwkvKioKKwkgKiBiYXNpYyB0ZXN0IGZvciByZWFkaW5nIG1lYXN1cmVkIGZsb2F0IHZhbHVlcworCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1lYXN1cmVkVmFsdWVGbG9hdCgpIHsKKwkJRmxvYXRbXSB2YWxzID0geyAxLjBmLCAyLjBmLCAzLjdmLCAyLjFmIH07CisJCWJvb2xlYW5bXSBmbGFncyA9IHsgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUgfTsKKwkJTWVhc3VyZWRWYWx1ZXMgbXYgPSBuZXcgTWVhc3VyZWRWYWx1ZXMoU2NhbGFyVHlwZS5GTE9BVCwgIlZhbHVlMSIsICJsaWdodHllYXJzIiwKKwkJCQlTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lULCBuZXcgZG91YmxlWzBdLCBmYWxzZSwgQXhpc1R5cGUuWV9BWElTLCB2YWxzLCBmbGFncyk7CisJCVZhbHVlSXRlcmF0b3I8RmxvYXQ+IHZhbHVlSXRlcmF0b3IgPSBtdi5pdGVyYXRvcigpOworCQlpbnQgaSA9IDA7CisJCXdoaWxlICh2YWx1ZUl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJYm9vbGVhbiBpc0N1cnJlbnRWYWxpZCA9IHZhbHVlSXRlcmF0b3IuaXNWYWxpZCgpOworCQkJRmxvYXQgY3VycmVudFZhbHVlID0gdmFsdWVJdGVyYXRvci5uZXh0KCk7CisJCQlhc3NlcnRFcXVhbHModmFsc1tpXSwgY3VycmVudFZhbHVlLCBFUFNJTE9OKTsKKwkJCWFzc2VydEVxdWFscyhmbGFnc1tpXSwgaXNDdXJyZW50VmFsaWQpOworCQkJaSsrOworCQl9CisJCWFzc2VydEVxdWFscyhpLCB2YWxzLmxlbmd0aCk7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdCBmb3IgcmVhZGluZyBtZWFzdXJlZCBkb3VibGUgdmFsdWVzCisJICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWVhc3VyZWRWYWx1ZURvdWJsZSgpIHsKKwkJRG91YmxlW10gdmFscyA9IHsgMS4wZCwgMi4wZCwgMy43ZCwgMi4xZCB9OworCQlib29sZWFuW10gZmxhZ3MgPSB7IHRydWUsIHRydWUsIGZhbHNlLCB0cnVlIH07CisJCU1lYXN1cmVkVmFsdWVzIG12ID0gbmV3IE1lYXN1cmVkVmFsdWVzKFNjYWxhclR5cGUuRE9VQkxFLCAiVmFsdWUxIiwgImxpZ2h0eWVhcnMiLAorCQkJCVNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVQsIG5ldyBkb3VibGVbMF0sIGZhbHNlLCBBeGlzVHlwZS5ZX0FYSVMsIHZhbHMsIGZsYWdzKTsKKwkJVmFsdWVJdGVyYXRvcjxEb3VibGU+IHZhbHVlSXRlcmF0b3IgPSBtdi5pdGVyYXRvcigpOworCQlpbnQgaSA9IDA7CisJCXdoaWxlICh2YWx1ZUl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJYm9vbGVhbiBpc0N1cnJlbnRWYWxpZCA9IHZhbHVlSXRlcmF0b3IuaXNWYWxpZCgpOworCQkJRG91YmxlIGN1cnJlbnRWYWx1ZSA9IHZhbHVlSXRlcmF0b3IubmV4dCgpOworCQkJYXNzZXJ0RXF1YWxzKHZhbHNbaV0sIGN1cnJlbnRWYWx1ZSwgRVBTSUxPTik7CisJCQlhc3NlcnRFcXVhbHMoZmxhZ3NbaV0sIGlzQ3VycmVudFZhbGlkKTsKKwkJCWkrKzsKKwkJfQorCQlhc3NlcnRFcXVhbHMoaSwgdmFscy5sZW5ndGgpOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3QgZm9yIHJlYWRpbmcgbWVhc3VyZWQgc3RyaW5nIHZhbHVlcworCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1lYXN1cmVkVmFsdWVTdHJpbmcoKSB7CisJCVN0cmluZ1tdIHZhbHMgPSB7ICJzdHIxIiwgInN0cjIiLCAic3RyMyIsICJzdHI0IiB9OworCQlib29sZWFuW10gZmxhZ3MgPSB7IHRydWUsIHRydWUsIGZhbHNlLCB0cnVlIH07CisJCU1lYXN1cmVkVmFsdWVzIG12ID0gbmV3IE1lYXN1cmVkVmFsdWVzKFNjYWxhclR5cGUuU1RSSU5HLCAiVmFsdWUxIiwgImxpZ2h0eWVhcnMiLAorCQkJCVNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVQsIG5ldyBkb3VibGVbMF0sIGZhbHNlLCBBeGlzVHlwZS5ZX0FYSVMsIHZhbHMsIGZsYWdzKTsKKwkJVmFsdWVJdGVyYXRvcjxTdHJpbmc+IHZhbHVlSXRlcmF0b3IgPSBtdi5pdGVyYXRvcigpOworCQlpbnQgaSA9IDA7CisJCXdoaWxlICh2YWx1ZUl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJYm9vbGVhbiBpc0N1cnJlbnRWYWxpZCA9IHZhbHVlSXRlcmF0b3IuaXNWYWxpZCgpOworCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHZhbHVlSXRlcmF0b3IubmV4dCgpOworCQkJYXNzZXJ0RXF1YWxzKHZhbHNbaV0sIGN1cnJlbnRWYWx1ZSk7CisJCQlhc3NlcnRFcXVhbHMoZmxhZ3NbaV0sIGlzQ3VycmVudFZhbGlkKTsKKwkJCWkrKzsKKwkJfQorCQlhc3NlcnRFcXVhbHMoaSwgdmFscy5sZW5ndGgpOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3QgZm9yIHJlYWRpbmcgYXR0cmlidXRlcyBvZiB0aGUgY2hhbm5lbC5UaGUgaW50aWFsaXphdGlvbiB2aWEgbWFwcworCSAqIGlzIG5lZWRlZCB0byBzaW11bGF0ZSB0aGUgZGF0YSBzdG9yZS4KKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBnZXRDaGFubmVsQXR0cnMoKSB7CisJCU1hcDxTdHJpbmcsIFZhbHVlPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbHVlPigpOworCQlmbG9hdCBtaW5fc3JjID0gNS43ZjsKKwkJZmxvYXQgbWF4X3NyYyA9IDEwLjIzZjsKKwkJbWFwLnB1dCgiTWluaW11bSIsIFZhbHVlVHlwZS5ET1VCTEUuY3JlYXRlKCJNaW5pbXVtIiwgIm0vcyIsIHRydWUsIG5ldyBEb3VibGUobWluX3NyYykpKTsKKwkJbWFwLnB1dCgiTWF4aW11bSIsIFZhbHVlVHlwZS5ET1VCTEUuY3JlYXRlKCJNYXhpbXVtIiwgIm0vcyIsIHRydWUsIG5ldyBEb3VibGUobWF4X3NyYykpKTsKKwkJQ29yZSBjb3JlID0gbmV3IENvcmVJbXBsKG1hcCk7CisJCUNoYW5uZWwgY2ggPSBuZXcgQ2hhbm5lbChjb3JlKTsKKwkJRG91YmxlIG1pbiA9IGNoLmdldE1pbmltdW0oKTsKKwkJRG91YmxlIG1heCA9IGNoLmdldE1heGltdW0oKTsKKwkJYXNzZXJ0RXF1YWxzKG1pbiwgbWluX3NyYywgRVBTSUxPTik7CisJCWFzc2VydEVxdWFscyhtYXgsIG1heF9zcmMsIEVQU0lMT04pOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3QgdG8gcmVhZCB0aGUgZGVmYXVsdCBzY2FsYXIgdHlwZSBvZiBhIHF1YW50aXR5LiBUaGUgaW50aWFsaXphdGlvbgorCSAqIHZpYSBtYXBzIGlzIG5lZWRlZCB0byBzaW11bGF0ZSB0aGUgZGF0YSBzdG9yZS4KKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBnZXRRdWFudGl0eSgpIHsKKwkJTWFwPFN0cmluZywgVmFsdWU+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsdWU+KCk7CisJCW1hcC5wdXQoIkRlZkRhdGFUeXBlIiwgbmV3IFZhbHVlKFZhbHVlVHlwZS5FTlVNRVJBVElPTiwgIm5hbWUiLCAidW5pdCIsIHRydWUsIFNjYWxhclR5cGUuRkxPQVQsCisJCQkJU2NhbGFyVHlwZS5jbGFzcywgU2NhbGFyVHlwZS5GTE9BVCwgRW51bVJlZ2lzdHJ5LlNDQUxBUl9UWVBFKSk7CisJCUNvcmUgY29yZSA9IG5ldyBDb3JlSW1wbChtYXApOworCQlRdWFudGl0eSBxdWFudGl0eSA9IG5ldyBRdWFudGl0eShjb3JlKTsKKwkJU2NhbGFyVHlwZSBkZWZhdWx0U2NhbGFyVHlwZSA9IHF1YW50aXR5LmdldERlZmF1bHRTY2FsYXJUeXBlKCk7CisJCWFzc2VydFRydWUoZGVmYXVsdFNjYWxhclR5cGUuaXNGbG9hdCgpKTsKKwl9CisKKwkvKioKKwkgKiBiYXNpYyB0ZXN0IGZvciBidWlsZGluZyBhIHdyaXRlIHJlcXVlc3QKKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB3cml0ZVJlcXVlc3QoKSB7CisJCUF4aXNUeXBlIGF4aXNUeXBlID0gQXhpc1R5cGUuWF9BWElTOworCQlDb3JlIGNvcmUgPSBuZXcgQ29yZUltcGwobmV3IEhhc2hNYXA8PigpKTsKKwkJQ2hhbm5lbEdyb3VwIGNoYW5uZWxHcm91cCA9IG5ldyBDaGFubmVsR3JvdXAoY29yZSk7CisJCUNoYW5uZWwgY2hhbm5lbCA9IG5ldyBDaGFubmVsKGNvcmUpOworCQlXcml0ZVJlcXVlc3RCdWlsZGVyIHdyYiA9IFdyaXRlUmVxdWVzdC5jcmVhdGUoY2hhbm5lbEdyb3VwLCBjaGFubmVsLCBheGlzVHlwZSk7CisJCVVuaXRCdWlsZGVyIHViID0gd3JiLmltcGxpY2l0Q29uc3RhbnQoU2NhbGFyVHlwZS5ET1VCTEUsIDAuN2QpOworCQlXcml0ZVJlcXVlc3Qgd3IgPSB1Yi5idWlsZCgpOworCQlTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIHNlcXVlbmNlUmVwcmVzZW50YXRpb24gPSB3ci5nZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCk7CisJCWFzc2VydFRydWUoc2VxdWVuY2VSZXByZXNlbnRhdGlvbi5pc0NvbnN0YW50KCkpOworCQlhc3NlcnRFcXVhbHMoQXhpc1R5cGUuWF9BWElTLCB3ci5nZXRBeGlzVHlwZSgpKTsKKwl9CisKKwkvKioKKwkgKiBiYXNpYyB0ZXN0IGZvciBnZXR0aW5nIGEgbWVhc3VyZW1lbnQgY2hhbm5lbCBhbmQgYWxsIG5lY2Vzc2FyeSByZWxhdGVkCisJICogb2JqZWN0cyAobWVhc3VybWVudCwgYW5kIHNvIG9uKSB2aWEgZmFjdG9yeSBtZXRob2RzLiBUaGUgaW50aWFsaXphdGlvbiB2aWEKKwkgKiBtYXBzIGlzIG5lZWRlZCB0byBzaW11bGF0ZSB0aGUgZGF0YSBzdG9yZS4KKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBlbnRpdHlGYWN0b3J5KCkgeworCQlNYXA8U3RyaW5nLCBWYWx1ZT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWx1ZT4oKTsKKwkJbWFwLnB1dCgiTmFtZSIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJOYW1lIiwgbnVsbCwgdHJ1ZSwgInBkbmFtZWFiYyIpKTsKKwkJbWFwLnB1dCgiTGVuZ3RoIiwgVmFsdWVUeXBlLklOVEVHRVIuY3JlYXRlKCJMZW5ndGgiLCBudWxsLCB0cnVlLCAxMykpOworCQltYXAucHV0KCJNYXNzIiwgVmFsdWVUeXBlLklOVEVHRVIuY3JlYXRlKCJMZW5ndGgiLCBudWxsLCB0cnVlLCAwKSk7CisJCW1hcC5wdXQoIlRpbWUiLCBWYWx1ZVR5cGUuSU5URUdFUi5jcmVhdGUoIkxlbmd0aCIsIG51bGwsIHRydWUsIDApKTsKKwkJbWFwLnB1dCgiVGVtcGVyYXR1cmUiLCBWYWx1ZVR5cGUuSU5URUdFUi5jcmVhdGUoIkxlbmd0aCIsIG51bGwsIHRydWUsIDApKTsKKwkJbWFwLnB1dCgiQ3VycmVudCIsIFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiTGVuZ3RoIiwgbnVsbCwgdHJ1ZSwgMCkpOworCQltYXAucHV0KCJNb2xhckFtb3VudCIsIFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiTGVuZ3RoIiwgbnVsbCwgdHJ1ZSwgMCkpOworCQltYXAucHV0KCJMdW1pbm91c0ludGVuc2l0eSIsIFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiTGVuZ3RoIiwgbnVsbCwgdHJ1ZSwgMCkpOworCQkvLyBUT0RPIChGbG9yaWFuIFNjaG1pdHQpOiBjaGVjayBpZiBhbmdsZSBpbiBsb3dlciBjYXNlIGlzIGNvcnJlY3QKKwkJbWFwLnB1dCgiYW5nbGUiLCBWYWx1ZVR5cGUuSU5URUdFUi5jcmVhdGUoIkxlbmd0aCIsIG51bGwsIHRydWUsIDApKTsKKwkJQ29yZSBjb3JlID0gbmV3IENvcmVJbXBsKG1hcCk7CisJCUVudGl0eUZhY3RvcnlJbXBsIGVmID0gbmV3IEVudGl0eUZhY3RvcnlJbXBsKGNvcmUpOworCQlQaHlzaWNhbERpbWVuc2lvbiBwaHlzaWNhbERpbWVuc2lvbiA9IGVmLmNyZWF0ZVBoeXNpY2FsRGltZW5zaW9uKCJwaHlzZGltIik7CisKKwkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWx1ZT4oKTsKKwkJbWFwLnB1dCgiT2Zmc2V0IiwgVmFsdWVUeXBlLkRPVUJMRS5jcmVhdGUoIkxlbmd0aCIsIG51bGwsIHRydWUsIDBkKSk7CisJCW1hcC5wdXQoIkZhY3RvciIsIFZhbHVlVHlwZS5ET1VCTEUuY3JlYXRlKCJMZW5ndGgiLCBudWxsLCB0cnVlLCAwZCkpOworCQltYXAucHV0KCJOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIk5hbWUiLCBudWxsLCB0cnVlLCAidW5pdG5hbWUiKSk7CisJCWNvcmUgPSBuZXcgQ29yZUltcGwobWFwKTsKKwkJZWYgPSBuZXcgRW50aXR5RmFjdG9yeUltcGwoY29yZSk7CisJCVVuaXQgdW5pdCA9IGVmLmNyZWF0ZVVuaXQoInVuaXQiLCBwaHlzaWNhbERpbWVuc2lvbik7CisKKwkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWx1ZT4oKTsKKwkJbWFwLnB1dCgiTmFtZSIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJOYW1lIiwgbnVsbCwgdHJ1ZSwgInF1YW50bmFtZSIpKTsKKwkJbWFwLnB1dCgiVmVyc2lvbiIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJWZXJzaW9uIiwgbnVsbCwgdHJ1ZSwgIjQ3MTEiKSk7CisJCW1hcC5wdXQoIkRhdGVDcmVhdGVkIiwgVmFsdWVUeXBlLkRBVEUuY3JlYXRlKCJEYXRlQ3JlYXRlZCIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJbWFwLnB1dCgiRGVmYXVsdFJhbmsiLCBWYWx1ZVR5cGUuSU5URUdFUi5jcmVhdGUoIkRlZmF1bHRSYW5rIiwgbnVsbCwgdHJ1ZSwgNSkpOworCQltYXAucHV0KCJEZWZEaW1lbnNpb24iLCBWYWx1ZVR5cGUuSU5URUdFUl9TRVFVRU5DRS5jcmVhdGUoIkRlZkRpbWVuc2lvbiIsIG51bGwsIHRydWUsIG5ldyBpbnRbXSB7IDUgfSkpOworCQltYXAucHV0KCJEZWZUeXBlU2l6ZSIsIFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiRGVmVHlwZVNpemUiLCBudWxsLCB0cnVlLCA4KSk7CisJCW1hcC5wdXQoIkRlZk1RTmFtZSIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJEZWZNUU5hbWUiLCBudWxsLCB0cnVlLCAibXFuYW1lIikpOworCQltYXAucHV0KCJEZWZEYXRhVHlwZSIsIG5ldyBWYWx1ZShWYWx1ZVR5cGUuRU5VTUVSQVRJT04sICJEZWZEYXRhVHlwZSIsICIiLCB0cnVlLCBTY2FsYXJUeXBlLkRPVUJMRSwKKwkJCQlTY2FsYXJUeXBlLmNsYXNzLCBTY2FsYXJUeXBlLkRPVUJMRSwgRW51bVJlZ2lzdHJ5LlNDQUxBUl9UWVBFKSk7CisJCW1hcC5wdXQoIlZhbGlkRmxhZyIsIG5ldyBWYWx1ZShWYWx1ZVR5cGUuRU5VTUVSQVRJT04sICJWYWxpZEZsYWciLCAiIiwgZmFsc2UsIFZlcnNpb25TdGF0ZS5BUkNISVZFRCwKKwkJCQlWZXJzaW9uU3RhdGUuY2xhc3MsIG51bGwsIEVudW1SZWdpc3RyeS5WRVJTSU9OX1NUQVRFKSk7CisJCW1hcC5wdXQoIkRlc2NyaXB0aW9uIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIkRlc2NyaXB0aW9uIiwgbnVsbCwgdHJ1ZSwgbnVsbCkpOworCQljb3JlID0gbmV3IENvcmVJbXBsKG1hcCk7CisJCWVmID0gbmV3IEVudGl0eUZhY3RvcnlJbXBsKGNvcmUpOworCQlRdWFudGl0eSBxdWFudGl0eSA9IGVmLmNyZWF0ZVF1YW50aXR5KCJxdWFudGl0eSIsIHVuaXQpOworCQkvLyBOb3RlIHRoYXQgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCBpbiBjcmVhdGVRdWFudGl0eSBhbmQgdGh1cyBzaG91bGQKKwkJLy8gZGlmZmVyIGZyb20gYWJvdmUuCisJCWFzc2VydEVxdWFscyhTY2FsYXJUeXBlLkZMT0FULCBxdWFudGl0eS5nZXREZWZhdWx0U2NhbGFyVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKChJbnRlZ2VyKSAxLCBxdWFudGl0eS5nZXREZWZhdWx0UmFuaygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJxdWFudGl0eSIsIHF1YW50aXR5LmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyh1bml0LCBxdWFudGl0eS5nZXREZWZhdWx0VW5pdCgpKTsKKworCQltYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbHVlPigpOworCQltYXAucHV0KCJOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIk5hbWUiLCBudWxsLCB0cnVlLCBudWxsKSk7CisJCW1hcC5wdXQoIkRhdGVDcmVhdGVkIiwgVmFsdWVUeXBlLkRBVEUuY3JlYXRlKCJEYXRlQ3JlYXRlZCIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJY29yZSA9IG5ldyBDb3JlSW1wbChtYXApOworCQllZiA9IG5ldyBFbnRpdHlGYWN0b3J5SW1wbChjb3JlKTsKKwkJVGVzdCB0ZXN0ID0gZWYuY3JlYXRlVGVzdCgibXl0ZXN0Iik7CisKKwkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWx1ZT4oKTsKKwkJbWFwLnB1dCgiTmFtZSIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJOYW1lIiwgbnVsbCwgdHJ1ZSwgbnVsbCkpOworCQltYXAucHV0KCJEYXRlQ3JlYXRlZCIsIFZhbHVlVHlwZS5EQVRFLmNyZWF0ZSgiRGF0ZUNyZWF0ZWQiLCBudWxsLCB0cnVlLCBudWxsKSk7CisJCW1hcC5wdXQoIk9wdGlvbmFsIiwgVmFsdWVUeXBlLkJPT0xFQU4uY3JlYXRlKCJPcHRpb25hbCIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJbWFwLnB1dCgiU29ydGluZGV4IiwgVmFsdWVUeXBlLklOVEVHRVIuY3JlYXRlKCJTb3J0aW5kZXgiLCBudWxsLCB0cnVlLCBudWxsKSk7CisJCWNvcmUgPSBuZXcgQ29yZUltcGwobWFwKTsKKwkJZWYgPSBuZXcgRW50aXR5RmFjdG9yeUltcGwoY29yZSk7CisJCVRlc3RTdGVwIHRlc3RTdGVwID0gZWYuY3JlYXRlVGVzdFN0ZXAoInRlc3RzdGVwIiwgdGVzdCk7CisKKwkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWx1ZT4oKTsKKwkJbWFwLnB1dCgiTmFtZSIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJOYW1lIiwgbnVsbCwgdHJ1ZSwgbnVsbCkpOworCQltYXAucHV0KCJEYXRlQ3JlYXRlZCIsIFZhbHVlVHlwZS5EQVRFLmNyZWF0ZSgiRGF0ZUNyZWF0ZWQiLCBudWxsLCB0cnVlLCBudWxsKSk7CisJCWNvcmUgPSBuZXcgQ29yZUltcGwobWFwKTsKKwkJZWYgPSBuZXcgRW50aXR5RmFjdG9yeUltcGwoY29yZSk7CisJCU1lYXN1cmVtZW50IG1lYXN1cmVtZW50ID0gZWYuY3JlYXRlTWVhc3VyZW1lbnQoIm1lYXN1cmVtZW50IiwgdGVzdFN0ZXApOworCisJCW1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsdWU+KCk7CisJCW1hcC5wdXQoIk5hbWUiLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiTmFtZSIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJbWFwLnB1dCgiRGVzY3JpcHRpb24iLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiRGVzY3JpcHRpb24iLCBudWxsLCB0cnVlLCBudWxsKSk7CisJCW1hcC5wdXQoIkludGVycG9sYXRpb24iLCBuZXcgVmFsdWUoVmFsdWVUeXBlLkVOVU1FUkFUSU9OLCAiSW50ZXJwb2xhdGlvbiIsICIiLCB0cnVlLCBudWxsLCBJbnRlcnBvbGF0aW9uLmNsYXNzLAorCQkJCW51bGwsIEVudW1SZWdpc3RyeS5TQ0FMQVJfVFlQRSkpOworCQltYXAucHV0KCJEYXRhVHlwZSIsIG5ldyBWYWx1ZShWYWx1ZVR5cGUuRU5VTUVSQVRJT04sICJEYXRhVHlwZSIsICIiLCB0cnVlLCBudWxsLCBTY2FsYXJUeXBlLmNsYXNzLCBudWxsLAorCQkJCUVudW1SZWdpc3RyeS5TQ0FMQVJfVFlQRSkpOworCisJCW1hcC5wdXQoIlR5cGVTaXplIiwgVmFsdWVUeXBlLklOVEVHRVIuY3JlYXRlKCJUeXBlU2l6ZSIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJbWFwLnB1dCgiUmFuayIsIFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiUmFuayIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJY29yZSA9IG5ldyBDb3JlSW1wbChtYXApOworCQllZiA9IG5ldyBFbnRpdHlGYWN0b3J5SW1wbChjb3JlKTsKKwkJQ2hhbm5lbCBjaGFubmVsID0gZWYuY3JlYXRlQ2hhbm5lbCgiY2hhbm5lbCIsIG1lYXN1cmVtZW50LCBxdWFudGl0eSk7CisJCWFzc2VydEVxdWFscyhJbnRlcnBvbGF0aW9uLk5PTkUsIGNoYW5uZWwuZ2V0SW50ZXJwb2xhdGlvbigpKTsKKwl9CisKKwkvKioKKwkgKiBiYXNpYyB0ZXN0IG9mIHNvbWUgVmFsdVR5cGUgbWV0aG9kcy4KKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB2YWx1ZVR5cGUoKSB7CisJCUVudW1SZWdpc3RyeS5nZXRJbnN0YW5jZSgpOworCQlhc3NlcnRFcXVhbHMoVmFsdWVUeXBlLlNIT1JUX1NFUVVFTkNFLnRvU2luZ2xlVHlwZSgpLCBWYWx1ZVR5cGUuU0hPUlQpOworCQlhc3NlcnRFcXVhbHMoVmFsdWVUeXBlLkRBVEUudG9TZXF1ZW5jZVR5cGUoKSwgVmFsdWVUeXBlLkRBVEVfU0VRVUVOQ0UpOworCQlhc3NlcnRFcXVhbHMoVmFsdWVUeXBlLkVOVU1FUkFUSU9OX1NFUVVFTkNFLnRvU2luZ2xlVHlwZSgpLCBWYWx1ZVR5cGUuRU5VTUVSQVRJT04pOworCQlhc3NlcnRFcXVhbHMoVmFsdWVUeXBlLkVOVU1FUkFUSU9OLnRvU2luZ2xlVHlwZSgpLCBWYWx1ZVR5cGUuRU5VTUVSQVRJT04pOworCQlhc3NlcnRFcXVhbHMoVmFsdWVUeXBlLkVOVU1FUkFUSU9OLCBWYWx1ZVR5cGUuRU5VTUVSQVRJT04udmFsdWVPZihWYWx1ZVR5cGUuRU5VTUVSQVRJT04udG9TaW5nbGVUeXBlKCkubmFtZSgpKSk7CisJCWFzc2VydEVxdWFscyhGbG9hdC5jbGFzcywgVmFsdWVUeXBlLkZMT0FULmdldFZhbHVlQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBWYWx1ZVR5cGUuRE9VQkxFLmlzQW55RmxvYXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgVmFsdWVUeXBlLkRPVUJMRS5pc0RvdWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBWYWx1ZVR5cGUuRE9VQkxFLmlzRmxvYXQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBWYWx1ZVR5cGUuRkxPQVQuaXNBbnlGbG9hdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgVmFsdWVUeXBlLklOVEVHRVIuaXNBbnlGbG9hdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBWYWx1ZVR5cGUuSU5URUdFUi5pc0ludGVnZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgVmFsdWVUeXBlLkZMT0FULmlzSW50ZWdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIFZhbHVlVHlwZS5GTE9BVC5pc0Zsb2F0KCkpOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3RzIG9mIHNvbWUgU2NhbGFyVHlwZSBtZXRob2RzCisJICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgc2NhbGFyVHlwZSgpIHsKKwkJYXNzZXJ0RXF1YWxzKFZhbHVlVHlwZS5CWVRFX1NFUVVFTkNFLCBTY2FsYXJUeXBlLkJZVEUudG9WYWx1ZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBTY2FsYXJUeXBlLkxPTkcuaXNMb25nKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIFNjYWxhclR5cGUuRE9VQkxFX0NPTVBMRVguaXNMb25nKCkpOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3Qgb2Ygc29tZSBTZXF1ZW5jZVJlcHJlc3RlbnRhaW9uIG1ldGhvZHMKKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCkgeworCQlhc3NlcnROb3RFcXVhbHMoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVCwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5JTVBMSUNJVF9DT05TVEFOVCk7CisJCWFzc2VydFRydWUoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVC5pc0V4cGxpY2l0KCkpOworCQlhc3NlcnRUcnVlKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVRfRVhURVJOQUwuaXNFeHBsaWNpdCgpKTsKKwkJYXNzZXJ0VHJ1ZShTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lUX0VYVEVSTkFMLmlzRXh0ZXJuYWwoKSk7CisJCWFzc2VydEZhbHNlKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVRfRVhURVJOQUwuaXNJbXBsaWNpdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVQub3JkaW5hbCgpLCAoSW50ZWdlcikgMCk7CisJCWFzc2VydEVxdWFscygoSW50ZWdlcikgNSwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfUE9MWU5PTUlBTC5vcmRpbmFsKCkpOworCQlhc3NlcnRFcXVhbHMoKEludGVnZXIpIDcsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVRfRVhURVJOQUwub3JkaW5hbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKChJbnRlZ2VyKSA5LCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19QT0xZTk9NSUFMX0VYVEVSTkFMLm9yZGluYWwoKSk7CisJCWFzc2VydEVxdWFscygoSW50ZWdlcikgMTAsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX0xJTkVBUl9DQUxJQlJBVEVELm9yZGluYWwoKSk7CisJCWFzc2VydEVxdWFscygoSW50ZWdlcikgMTEsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX0xJTkVBUl9DQUxJQlJBVEVEX0VYVEVSTkFMLm9yZGluYWwoKSk7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdHMgb2YgVHlwZVNwZWNpZmljYXRpb24KKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0eXBlU3BlY2lmaWNhdGlvbigpIHsKKwkJYXNzZXJ0Tm90RXF1YWxzKFR5cGVTcGVjaWZpY2F0aW9uLkJJVF9JTlRFR0VSLCBUeXBlU3BlY2lmaWNhdGlvbi5CSVRfRkxPQVRfQkVPKTsKKwkJYXNzZXJ0RXF1YWxzKFR5cGVTcGVjaWZpY2F0aW9uLkJPT0xFQU4sIFR5cGVTcGVjaWZpY2F0aW9uLkJPT0xFQU4pOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3RzIG9mIEF4aXNUenBlIG1ldGhvZHMKKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBheGlzVHlwZSgpIHsKKwkJYXNzZXJ0VHJ1ZShBeGlzVHlwZS5YX0FYSVMuaXNYQXhpcygpKTsKKwkJYXNzZXJ0VHJ1ZShBeGlzVHlwZS5ZX0FYSVMuaXNZQXhpcygpKTsKKwkJYXNzZXJ0VHJ1ZShBeGlzVHlwZS5YWV9BWElTLmlzWFlBeGlzKCkpOworCQlhc3NlcnRGYWxzZShBeGlzVHlwZS5YX0FYSVMuaXNZQXhpcygpKTsKKwkJYXNzZXJ0RmFsc2UoQXhpc1R5cGUuWV9BWElTLmlzWFlBeGlzKCkpOworCQlhc3NlcnRGYWxzZShBeGlzVHlwZS5YWV9BWElTLmlzWEF4aXMoKSk7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdHMgb2YgVmVyc2lvblN0YXRlIGVudW1lcmF0aW9uCisJICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdmVyc2lvblN0YXRlKCkgeworCQlhc3NlcnRGYWxzZShWZXJzaW9uU3RhdGUuQVJDSElWRUQuaXNFZGl0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShWZXJzaW9uU3RhdGUuQVJDSElWRUQuaXNBcmNoaXZlZCgpKTsKKwkJYXNzZXJ0RmFsc2UoVmVyc2lvblN0YXRlLkFSQ0hJVkVELmlzVmFsaWQoKSk7CisJCWFzc2VydFRydWUoVmVyc2lvblN0YXRlLkVESVRBQkxFLmlzRWRpdGFibGUoKSk7CisJCWFzc2VydEZhbHNlKFZlcnNpb25TdGF0ZS5FRElUQUJMRS5pc0FyY2hpdmVkKCkpOworCQlhc3NlcnRGYWxzZShWZXJzaW9uU3RhdGUuRURJVEFCTEUuaXNWYWxpZCgpKTsKKwkJYXNzZXJ0RmFsc2UoVmVyc2lvblN0YXRlLlZBTElELmlzRWRpdGFibGUoKSk7CisJCWFzc2VydEZhbHNlKFZlcnNpb25TdGF0ZS5WQUxJRC5pc0FyY2hpdmVkKCkpOworCQlhc3NlcnRUcnVlKFZlcnNpb25TdGF0ZS5WQUxJRC5pc1ZhbGlkKCkpOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3RzIG9mIGludGVycG9sYXRpb24gZW51bWVyYXRpb24KKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBpbnRlcnBvbGF0aW9uKCkgeworCQlhc3NlcnRUcnVlKEludGVycG9sYXRpb24uTElORUFSLmlzTGluZWFyKCkpOworCQlhc3NlcnRGYWxzZShJbnRlcnBvbGF0aW9uLk5PTkUuaXNTcGVjaWZpYygpKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVycG9sYXRpb24uTk9ORS5vcmRpbmFsKCksIChJbnRlZ2VyKSAwKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVycG9sYXRpb24uTElORUFSLm9yZGluYWwoKSwgKEludGVnZXIpIDEpOworCQlhc3NlcnRFcXVhbHMoSW50ZXJwb2xhdGlvbi5TUEVDSUZJQy5vcmRpbmFsKCksIChJbnRlZ2VyKSAyKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBlbnVtUmVnaXN0cnkoKSB7CisJCUVudW1SZWdpc3RyeSBlciA9IEVudW1SZWdpc3RyeS5nZXRJbnN0YW5jZSgpOworCQlhc3NlcnRUcnVlKGVyLmdldCgiSW50ZXJwb2xhdGlvbiIpICE9IG51bGwpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1ZhbHVlVHlwZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WYWx1ZVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QwMDRlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WYWx1ZVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCitwdWJsaWMgY2xhc3MgVmFsdWVUeXBlVGVzdCB7CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJRW51bVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEV4dHJhY3RTdHJpbmdGcm9tVW5rbm93bigpIHsKKwkJVmFsdWUgdiA9IFZhbHVlVHlwZS5VTktOT1dOLmNyZWF0ZSgiTmFtZSIsICJhYmNkIik7CisKKwkJYXNzZXJ0VGhhdCgoU3RyaW5nKSB2LmV4dHJhY3QoKSkuaXNFcXVhbFRvKCJhYmNkIik7CisJCWFzc2VydFRoYXQodi5leHRyYWN0KFZhbHVlVHlwZS5VTktOT1dOKSkuaXNFcXVhbFRvKCJhYmNkIik7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEV4dHJhY3RTdHJpbmcoKSB7CisJCVZhbHVlIHYgPSBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiTmFtZSIsICJhYmNkIik7CisKKwkJYXNzZXJ0VGhhdCgoU3RyaW5nKSB2LmV4dHJhY3QoKSkuaXNFcXVhbFRvKCJhYmNkIik7CisJCWFzc2VydFRoYXQodi5leHRyYWN0KFZhbHVlVHlwZS5TVFJJTkcpKS5pc0VxdWFsVG8oImFiY2QiKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEludGVnZXIoKSB7CisJCVZhbHVlIHYgPSBWYWx1ZVR5cGUuSU5URUdFUi5jcmVhdGUoIklkIiwgMSk7CisKKwkJYXNzZXJ0VGhhdCgoaW50KSB2LmV4dHJhY3QoKSkuaXNFcXVhbFRvKDEpOworCQlhc3NlcnRUaGF0KHYuZXh0cmFjdChWYWx1ZVR5cGUuSU5URUdFUikpLmlzRXF1YWxUbygxKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEludGVnZXJTZXF1ZW5jZSgpIHsKKwkJaW50W10gaW50cyA9IG5ldyBpbnRbXSB7IDEsIDIsIDMgfTsKKworCQlWYWx1ZSB2ID0gVmFsdWVUeXBlLklOVEVHRVJfU0VRVUVOQ0UuY3JlYXRlKCJJZHMiLCBpbnRzKTsKKworCQlhc3NlcnRUaGF0KChpbnRbXSkgdi5leHRyYWN0KCkpLmlzRXF1YWxUbyhpbnRzKTsKKwkJYXNzZXJ0VGhhdCh2LmV4dHJhY3QoVmFsdWVUeXBlLklOVEVHRVJfU0VRVUVOQ0UpKS5pc0VxdWFsVG8oaW50cyk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEV4dHJhY3RFbnVtZXJhdGlvbigpIHsKKwkJVmFsdWUgdiA9IFZhbHVlVHlwZS5FTlVNRVJBVElPTi5jcmVhdGUoIlNjYWxhclR5cGVGaWVsZCIsICIiLCB0cnVlLCBTY2FsYXJUeXBlLklOVEVHRVIsCisJCQkJRW51bVJlZ2lzdHJ5LlNDQUxBUl9UWVBFKTsKKworCQlhc3NlcnRUaGF0KHYuZXh0cmFjdChWYWx1ZVR5cGUuRU5VTUVSQVRJT04pKS5pc0VxdWFsVG8oU2NhbGFyVHlwZS5JTlRFR0VSKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEVudW1lcmF0aW9uU2VxdWVuY2UoKSB7CisJCVNjYWxhclR5cGVbXSBzY2FsYVR5cGVzID0gbmV3IFNjYWxhclR5cGVbXSB7IFNjYWxhclR5cGUuRkxPQVQsIFNjYWxhclR5cGUuSU5URUdFUiB9OworCisJCVZhbHVlIHYgPSBWYWx1ZVR5cGUuRU5VTUVSQVRJT05fU0VRVUVOQ0UuY3JlYXRlKCJTY2FsYXJUeXBlU2VxRmllbGQiLCAiIiwgdHJ1ZSwgc2NhbGFUeXBlcywKKwkJCQlFbnVtUmVnaXN0cnkuU0NBTEFSX1RZUEUpOworCisJCWFzc2VydFRoYXQodi5leHRyYWN0KFZhbHVlVHlwZS5FTlVNRVJBVElPTl9TRVFVRU5DRSkpLmlzRXF1YWxUbyhzY2FsYVR5cGVzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvRmlsdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0ZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTg5NmJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0ZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkVudGl0eVR5cGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5SZWxhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlJlbGF0aW9uSW1wbC5BdHRyaWJ1dGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IHRoZSBGaWx0ZXIgY2xhc3MKKyAqIAorICogQGF1dGhvciBBbGV4YW5kZXIgTmVobWVyCisgKgorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyVGVzdCB7CisKKwlzdGF0aWMgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgIjEiLCAiMiIsICIzIiB9OworCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGluaXQoKSB7CisJCUVudW1SZWdpc3RyeS5nZXRJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIFRlc3RzIGlkcyhFbnRpdHlUeXBlIGVudGl0eVR5cGUsIENvbGxlY3Rpb248U3RyaW5nPiBpZHMpCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWRzRW50aXR5VHlwZSgpIHsKKwkJRmlsdGVyIGZpbHRlciA9IEZpbHRlci5hbmQoKTsKKwkJYXNzZXJ0RXF1YWxzKGZpbHRlci5zdHJlYW0oKS50b0FycmF5KCkubGVuZ3RoLCAwKTsKKworCQlmaWx0ZXIgPSBGaWx0ZXIuYW5kKCkuaWRzKG5ldyBFbnRpdHlUeXBlSW1wbCgpLCBBcnJheXMuYXNMaXN0KHZhbHVlcykpOworCisJCVN0cmluZ1tdIGZpbHRlckNvbmRpdGlvbiA9IGZpbHRlci5pdGVyYXRvcigpLm5leHQoKS5nZXRDb25kaXRpb24oKS5nZXRWYWx1ZSgpLmV4dHJhY3QoKTsKKworCQlJdGVyYXRvcjxTdHJpbmc+IHZhbHVlc0l0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdCh2YWx1ZXMpLml0ZXJhdG9yKCk7CisJCUl0ZXJhdG9yPFN0cmluZz4gZmlsdGVyQ29uZGl0aW9uSXRlcmF0b3IgPSBBcnJheXMuc3RyZWFtKGZpbHRlckNvbmRpdGlvbikuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAodmFsdWVzSXRlcmF0b3IuaGFzTmV4dCgpICYmIGZpbHRlckNvbmRpdGlvbkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJYXNzZXJ0RXF1YWxzKHZhbHVlc0l0ZXJhdG9yLm5leHQoKSwgZmlsdGVyQ29uZGl0aW9uSXRlcmF0b3IubmV4dCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRlc3RzIGlkcyhSZWxhdGlvbiByZWxhdGlvbiwgQ29sbGVjdGlvbjxTdHJpbmc+IGlkcykKKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJZHNSZWxhdGlvbigpIHsKKwkJRmlsdGVyIGZpbHRlciA9IEZpbHRlci5hbmQoKTsKKwkJYXNzZXJ0RXF1YWxzKGZpbHRlci5zdHJlYW0oKS50b0FycmF5KCkubGVuZ3RoLCAwKTsKKworCQlmaWx0ZXIgPSBGaWx0ZXIuYW5kKCkuaWRzKG5ldyBSZWxhdGlvbkltcGwoQXR0cmlidXRlVHlwZS5JRCksIEFycmF5cy5hc0xpc3QodmFsdWVzKSk7CisKKwkJU3RyaW5nW10gZmlsdGVyQ29uZGl0aW9uID0gZmlsdGVyLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbmRpdGlvbigpLmdldFZhbHVlKCkuZXh0cmFjdCgpOworCisJCUl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzSXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KHZhbHVlcykuaXRlcmF0b3IoKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBmaWx0ZXJDb25kaXRpb25JdGVyYXRvciA9IEFycmF5cy5zdHJlYW0oZmlsdGVyQ29uZGl0aW9uKS5pdGVyYXRvcigpOworCisJCXdoaWxlICh2YWx1ZXNJdGVyYXRvci5oYXNOZXh0KCkgJiYgZmlsdGVyQ29uZGl0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlhc3NlcnRFcXVhbHModmFsdWVzSXRlcmF0b3IubmV4dCgpLCBmaWx0ZXJDb25kaXRpb25JdGVyYXRvci5uZXh0KCkpOworCQl9CisJfQorCisJLyoqCisJICogVGVzdHMgaWQoRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBTdHJpbmcgaWQpCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWRFbnRpdHkoKSB7CisJCUZpbHRlciBmaWx0ZXIgPSBGaWx0ZXIuYW5kKCk7CisJCWFzc2VydEVxdWFscyhmaWx0ZXIuc3RyZWFtKCkudG9BcnJheSgpLmxlbmd0aCwgMCk7CisKKwkJZmlsdGVyID0gRmlsdGVyLmFuZCgpLmlkKG5ldyBFbnRpdHlUeXBlSW1wbCgpLCAiMSIpOworCisJCVN0cmluZyBmaWx0ZXJDb25kaXRpb24gPSBmaWx0ZXIuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q29uZGl0aW9uKCkuZ2V0VmFsdWUoKS5leHRyYWN0KCk7CisKKwkJYXNzZXJ0RXF1YWxzKGZpbHRlckNvbmRpdGlvbiwgIjEiKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyBpZChSZWxhdGlvbiByZWxhdGlvbiwgU3RyaW5nIGlkKQorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdElkUmVsYXRpb24oKSB7CisJCUZpbHRlciBmaWx0ZXIgPSBGaWx0ZXIuYW5kKCk7CisJCWFzc2VydEVxdWFscyhmaWx0ZXIuc3RyZWFtKCkudG9BcnJheSgpLmxlbmd0aCwgMCk7CisKKwkJZmlsdGVyID0gRmlsdGVyLmFuZCgpLmlkKG5ldyBSZWxhdGlvbkltcGwoQXR0cmlidXRlVHlwZS5JRCksICIxIik7CisKKwkJU3RyaW5nIGZpbHRlckNvbmRpdGlvbiA9IGZpbHRlci5pdGVyYXRvcigpLm5leHQoKS5nZXRDb25kaXRpb24oKS5nZXRWYWx1ZSgpLmV4dHJhY3QoKTsKKworCQlhc3NlcnRFcXVhbHMoZmlsdGVyQ29uZGl0aW9uLCAiMSIpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC8uZ2l0aWdub3JlIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2NzhhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTcgQEAKKyMgZWNsaXBzZQorLmNsYXNzcGF0aAorLnByb2plY3QKKy5zZXR0aW5ncy8KK2Jpbi8KKworIyBncmFkbGUKKy5ncmFkbGUKK2J1aWxkLworCisjIGludGVsbGlqCisuaWRlYS8KK291dC8KKyouaXByCisqLmltbAorKi5pd3MKKy9iaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4ZTA5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDI3NyBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wCisKKyAgICBUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorICAgIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04KKyAgICBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisxLiBERUZJTklUSU9OUworCisiQ29udHJpYnV0aW9uIiBtZWFuczoKKworICBhKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKKyAgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorICAgICBpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKyAgICAgaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKyAgd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20KKyAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICJvcmlnaW5hdGVzIiBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5CisgIHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4KKyAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB0aGF0CisgIGFyZSBub3QgTW9kaWZpZWQgV29ya3MuCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKK2FyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKK29yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCitBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK29yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisKKyJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyCitmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBQcm9ncmFtIGFuZCBmb3Igd2hpY2ggdGhlCitlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCityZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4KKworIk1vZGlmaWVkIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0gdGhhdAorcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCitjb250ZW50cyBvZiB0aGUgUHJvZ3JhbSwgaW5jbHVkaW5nLCBmb3IgcHVycG9zZXMgb2YgY2xhcml0eSBhbnkgbmV3IGZpbGUKK2luIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBjb250YWlucyBhbnkgY29udGVudHMgb2YgdGhlIFByb2dyYW0uIE1vZGlmaWVkCitXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsCitpbnRlcmZhY2VzLCB0eXBlcywgY2xhc3Nlcywgc3RydWN0dXJlcywgb3IgZmlsZXMgb2YgdGhlIFByb2dyYW0gc29sZWx5CitpbiBlYWNoIGNhc2UgaW4gb3JkZXIgdG8gbGluayB0bywgYmluZCBieSBuYW1lLCBvciBzdWJjbGFzcyB0aGUgUHJvZ3JhbQorb3IgTW9kaWZpZWQgV29ya3MgdGhlcmVvZi4KKworIkRpc3RyaWJ1dGUiIG1lYW5zIHRoZSBhY3RzIG9mIGEpIGRpc3RyaWJ1dGluZyBvciBiKSBtYWtpbmcgYXZhaWxhYmxlCitpbiBhbnkgbWFubmVyIHRoYXQgZW5hYmxlcyB0aGUgdHJhbnNmZXIgb2YgYSBjb3B5LgorCisiU291cmNlIENvZGUiIG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworbW9kaWZpY2F0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwKK2RvY3VtZW50YXRpb24gc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworIlNlY29uZGFyeSBMaWNlbnNlIiBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorVmVyc2lvbiAyLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aGF0IGxpY2Vuc2UsIGluY2x1ZGluZyBhbnkKK2V4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBpbml0aWFsCitDb250cmlidXRvci4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKKyAgYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKKyAgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKKyAgcHVibGljbHkgcGVyZm9ybSwgRGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKKyAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3Jrcy4KKworICBiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudAorICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsCisgIGlmIGFueSwgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbAorICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0CisgIHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uCisgIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKKyAgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKKyAgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCisgIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworICBjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKKyAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCisgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMKKyAgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKKyAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUKKyAgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5CisgIGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbAorICBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5CisgIHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBEaXN0cmlidXRlIHRoZQorICBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZQorICBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCisgIGQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzCisgIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50CisgIHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKyAgZSkgTm90d2l0aHN0YW5kaW5nIHRoZSB0ZXJtcyBvZiBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UsIG5vCisgIENvbnRyaWJ1dG9yIG1ha2VzIGFkZGl0aW9uYWwgZ3JhbnRzIHRvIGFueSBSZWNpcGllbnQgKG90aGVyIHRoYW4KKyAgdGhvc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50KSBhcyBhIHJlc3VsdCBvZiBzdWNoIFJlY2lwaWVudCdzCisgIHJlY2VpcHQgb2YgdGhlIFByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UKKyAgKGlmIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAzKS4KKworMy4gUkVRVUlSRU1FTlRTCisKKzMuMSBJZiBhIENvbnRyaWJ1dG9yIERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtIGluIGFueSBmb3JtLCB0aGVuOgorCisgIGEpIHRoZSBQcm9ncmFtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBhcyBTb3VyY2UgQ29kZSwgaW4KKyAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgIHRoZSBQcm9ncmFtIHdpdGggYSBzdGF0ZW1lbnQgdGhhdCB0aGUgU291cmNlIENvZGUgZm9yIHRoZSBQcm9ncmFtCisgIGlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGluZm9ybXMgUmVjaXBpZW50cyBob3cgdG8KKyAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZTsgYW5kCisKKyAgYikgdGhlIENvbnRyaWJ1dG9yIG1heSBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIHVuZGVyIGEgbGljZW5zZQorICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgIGkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCisgICAgIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kCisgICAgIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcworICAgICBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKKyAgICAgaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCisgICAgIGlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cycgcmlnaHRzCisgICAgIGluIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBzZWN0aW9uIDMuMjsgYW5kCisKKyAgICAgaXYpIHJlcXVpcmVzIGFueSBzdWJzZXF1ZW50IGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbnkKKyAgICAgcGFydHkgdG8gYmUgdW5kZXIgYSBsaWNlbnNlIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMKKyAgICAgb2YgdGhpcyBzZWN0aW9uIDMuCisKKzMuMiBXaGVuIHRoZSBQcm9ncmFtIGlzIERpc3RyaWJ1dGVkIGFzIFNvdXJjZSBDb2RlOgorCisgIGEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIG9yIGlmIHRoZQorICBQcm9ncmFtIChpKSBpcyBjb21iaW5lZCB3aXRoIG90aGVyIG1hdGVyaWFsIGluIGEgc2VwYXJhdGUgZmlsZSBvcgorICBmaWxlcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBhIFNlY29uZGFyeSBMaWNlbnNlLCBhbmQgKGlpKSB0aGUgaW5pdGlhbAorICBDb250cmlidXRvciBhdHRhY2hlZCB0byB0aGUgU291cmNlIENvZGUgdGhlIG5vdGljZSBkZXNjcmliZWQgaW4KKyAgRXhoaWJpdCBBIG9mIHRoaXMgQWdyZWVtZW50LCB0aGVuIHRoZSBQcm9ncmFtIG1heSBiZSBtYWRlIGF2YWlsYWJsZQorICB1bmRlciB0aGUgdGVybXMgb2Ygc3VjaCBTZWNvbmRhcnkgTGljZW5zZXMsIGFuZAorCisgIGIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mCisgIHRoZSBQcm9ncmFtLgorCiszLjMgQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCwKK3RyYWRlbWFyaywgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zCitvZiBsaWFiaWxpdHkgKCJub3RpY2VzIikgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbSBmcm9tIGFueSBjb3B5IG9mCit0aGUgUHJvZ3JhbSB3aGljaCB0aGV5IERpc3RyaWJ1dGUsIHByb3ZpZGVkIHRoYXQgQ29udHJpYnV0b3JzIG1heSBhZGQKK3RoZWlyIG93biBhcHByb3ByaWF0ZSBub3RpY2VzLgorCis0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgorCitDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcword2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCitsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLAordGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMKK3RoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5CitvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLAorZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMKK2FuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0KK2luIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdAorYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkCitpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCit3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLAorYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55CityZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CitwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKK2Fsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KK2RlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvCitwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5Cit0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQKK1BFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVywgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIgorQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUgorSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgorVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCithcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwKK3Jpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMKK29yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQKK1BFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVywgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMKK1NIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCitFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUCitQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCitDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUKK0VYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlcgorYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCitQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlCitvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MKK3JpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YKK3RpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlCithbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4KK0hvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKK2dyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCitidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZAorbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZAorcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24KK2lzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlCityZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZQorZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nCit2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCitEaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzCityZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsCitDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cworQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQKK3JlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKK2VzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQKK3VuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAordG8gYmUgZW5mb3JjZWFibGUgYnkgYW55IGVudGl0eSB0aGF0IGlzIG5vdCBhIENvbnRyaWJ1dG9yIG9yIFJlY2lwaWVudC4KK05vIHRoaXJkLXBhcnR5IGJlbmVmaWNpYXJ5IHJpZ2h0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGlzIEFncmVlbWVudC4KKworRXhoaWJpdCBBIC0gRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlCisKKyJUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcKK1NlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGgKK2luIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2LiAyLjAgYXJlIHNhdGlzZmllZDoge25hbWUgbGljZW5zZShzKSwKK3ZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uIgorCisgIFNpbXBseSBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgdGhpcyBFeGhpYml0IEEKKyAgaXMgbm90IHN1ZmZpY2llbnQgdG8gbGljZW5zZSB0aGUgU291cmNlIENvZGUgdW5kZXIgU2Vjb25kYXJ5IExpY2Vuc2VzLgorCisgIElmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyCisgIGZpbGUsIHRoZW4gWW91IG1heSBpbmNsdWRlIHRoZSBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhIExJQ0VOU0UKKyAgZmlsZSBpbiBhIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvCisgIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuCisKKyAgWW91IG1heSBhZGQgYWRkaXRpb25hbCBhY2N1cmF0ZSBub3RpY2VzIG9mIGNvcHlyaWdodCBvd25lcnNoaXAuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvTk9USUNFLnR4dCBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjgxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvTk9USUNFLnR4dApAQCAtMCwwICsxLDM4MiBAQAorIyBOb3RpY2VzIGZvciBFY2xpcHNlIE1ETXxCTAorCitUaGlzIGNvbnRlbnQgaXMgcHJvZHVjZWQgYW5kIG1haW50YWluZWQgYnkgdGhlIEVjbGlwc2UgTURNfEJMIHByb2plY3QsCitpdCBpcyBhIHByb2plY3Qgb2YgdGhlIG9wZW5NRE0oUikgRWNsaXBzZSBXb3JraW5nIEdyb3VwLgorCisqIFByb2plY3QgaG9tZTogaHR0cHM6Ly9wcm9qZWN0cy5lY2xpcHNlLm9yZy9wcm9qZWN0cy90ZWNobm9sb2d5Lm1kbWJsCisKKyMjIFRyYWRlbWFya3MKKworRWNsaXBzZSBNRE18QkwsIE1ETXxCTCBhbmQgRWNsaXBzZSBvcGVuTURNKFIpIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcworb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbi4KKworIyMgQ29weXJpZ2h0CisKK0FsbCBjb250ZW50IGlzIHRoZSBwcm9wZXJ0eSBvZiB0aGUgZm9sbG93aW5nIHJlc3BlY3RpdmUgYXV0aG9ycyBvciB0aGVpciBlbXBsb3llcnMuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYXV0aG9yc2hpcCBvZiBjb250ZW50LCBwbGVhc2UgY29uc3VsdCB0aGUgbGlzdGVkCitzb3VyY2UgY29kZSByZXBvc2l0b3J5IGxvZ3MuCisKK0NvcHlyaWdodCAoYykgMjAxNi0yMDE5IEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICitDb3B5cmlnaHQgKGMpIDIwMTYtMjAyMCBQZWFrIFNvbHV0aW9uIEdtYkgKK0NvcHlyaWdodCAoYykgMjAxNy0yMDE4IHNjaWVuY2UgKyBjb21wdXRpbmcgQUcgVHVlYmluZ2VuIChBVE9TIFNFKQorQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggQ2Fub28gRW5naW5lZXJpbmcgQUcKK0NvcHlyaWdodCAoYykgMjAxNyBGbG9yaWFuIFNjaG1pdHQKK0NvcHlyaWdodCAoYykgMjAxNy0yMDIwIEFuZ2VsaWthIFdpdHRlaworQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgRWxla3Ryb25pc2NoZSBGYWhyd2Vya3N5c3RlbWUgR01CSAorQ29weXJpZ2h0IChjKSAyMDE4LTIwMjAgS2FyYWt1biBBRworQ29weXJpZ2h0IChjKSAyMDE4LTIwMjAgQWxleGFuZGVyIE5laG1lcgorCisjIyBEZWNsYXJlZCBQcm9qZWN0IExpY2Vuc2VzCisKK1RoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQordGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorCisjIyBTb3VyY2UgQ29kZQorCitUaGUgcHJvamVjdCBtYWludGFpbnMgdGhlIGZvbGxvd2luZyBzb3VyY2UgY29kZSByZXBvc2l0b3JpZXM6CisKK29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5naXQJICAgIC0gVGhlIG9wZW5NRE0oUikgQVBJLgorb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0LmdpdAkgICAgLSBFeHRlbnNpb24gb2YgdGhlIG9wZW5NRE0oUikgQVBJIGNvbnRhaW5pbmcgZGVmYXVsdCBlbGVtZW50cy4KK29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5naXQJLSBPRFMgaW1wbGVtZW50YXRpb24gb2YgcGVyc2lzdGVuY2UgYWRhcHRlci4KK29yZy5lY2xpcHNlLm1kbS5udWNsZXVzLmdpdAkgICAgICAgIC0gQ29yZSBidWlsZGluZyBibG9ja3MgZm9yIHRoZSBvcGVuTURNIEJ1c2luZXNzIExvZ2ljIGFuZCBXZWIgRnJvbnRlbmQuCisKKyMjIFRoaXJkLXBhcnR5IENvbnRlbnQKKworVGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4KK0lmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZworaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0bwordGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuCisKK2FudGxyNC00LjUuMy5qYXIoMi41LjMpCisgICAgKiBMaWNlbnNlOiBOZXcgQlNEIGxpY2Vuc2UKKworYW9wYWxsaWFuY2UtcmVwYWNrYWdlZC0yLjUuMC1iMDUuamFyICgyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2NvbW1vbnMtY29kZWMtMS4yLmphciAoMS4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitjb21tb25zLWh0dHBjbGllbnQtMy4xLmphciAgKDMuMSkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworY29tbW9ucy1sYW5nMy0zLjguMS5qYXIgKDMuOC4xKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitjb21tb25zLXRleHQtMS42LmphciAoMS42KQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitnc29uLTIuNy5qYXIgKDIuNykKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworR29vZ2xlIEd1YXZhIFZlcnNpb246IDI1LjAtanJlICAoMjUuMCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworR3JhZGxlIFdyYXBwZXIgKDQuMTAuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworaGsyLWFwaS0yLjUuMC1iMDUuamFyICgyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMLTEuMQorCitoazItbG9jYXRvci0yLjUuMC1iMDUuamFyKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworaGsyLXV0aWxzLTIuNS4wLWIwNS5qYXIgKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworamFja3Nvbi1hbm5vdGF0aW9ucy0yLjkuMC5qYXIgICgyLjkuMCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1jb3JlLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1kYXRhYmluZC0yLjkuMi5qYXIgICgyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1qYXhycy1iYXNlLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1qYXhycy1qc29uLXByb3ZpZGVyLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1tb2R1bGUtamF4Yi1hbm5vdGF0aW9ucy0yLjkuMi5qYXIgICgyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamF2YXNzaXN0LTMuMjAuMC1HQS5qYXIgICgyLjIwLjAtR0EpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgMi4wCisKK2pjbC1vdmVyLXNsZjRqLTEuNy4yNS5qYXIoMS43LjI1KQorICAgICogTGljZW5zZTogTUlUIExpY2Vuc2UKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly93d3cuc2xmNGoub3JnL2xpY2Vuc2UuaHRtbAorICAgICogUHJvamVjdCBVUkw6ICBodHRwczovL3d3dy5zbGY0ai5vcmcKKyAgICAqIFNvdXJjZSBVUkw6ICAgaHR0cHM6Ly9naXRodWIuY29tL3Fvcy1jaC9zbGY0agorCitqZXJzZXktY2xpZW50LTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1jb21tb24tMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktY29udGFpbmVyLXNlcnZsZXQtMi4yMy4yLmphciAgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUtMi4yMy4zLmphcigyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1ndWF2YS0yLjIzLjIuamFyICAoMi4yMy4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqZXJzZXktbWVkaWEtamF4Yi0yLjIzLjIuamFyKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LW1lZGlhLXNzZS0yLjIzLjIuamFyICgyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1tZWRpYS1tdWx0aXBhcnQtMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktc2VydmVyLTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworbG9nNGotb3Zlci1zbGY0ai0xLjcuMjUuamFyICgxLjcuMjUpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK2xvZ2JhY2stY2xhc3NpYy0xLjIuMy5qYXIoMS4yLjMpCisgICAgKiBMaWNlbnNlOiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDEuMAorCitsb2diYWNrLWNvcmUtMS4yLjMuamFyKDEuMi4zKQorICAgICogTGljZW5zZTogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAxLjAKKworbWltZXB1bGwtMS45LjYuamFyICgxLjkuNCkKKyAgICAqIExpY2Vuc2U6IENEREwKKworb3BlbmF0ZngtMC43LjQuamFyICgwLjcuNCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworb3NnaS1yZXNvdXJjZS1sb2NhdG9yLTEuMC4xLmphcigxLjAuMSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworcHJvdG9idWYtamF2YS0zLjIuMC5qYXIgKDMuMi4wKQorICAgICogTGljZW5zZTogTmV3IEJTRCBsaWNlbnNlCisKK3Byb3RvYnVmLWphdmEtdXRpbC0zLjIuMC5qYXIgICgzLjIuMCkKKyAgICAqIExpY2Vuc2U6IE5ldyBCU0QgbGljZW5zZQorCitzd2FnZ2VyLWFubm90YXRpb25zLTIuMC44LmphciAoMi4wLjgpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK3N3YWdnZXItdWktMy4yMy4wLmphciAoMy4yMy4wKQorICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorCitzbGY0ai1hcGktMS43LjI1LmphciAgKDEuNy4yNSkKKyAgICAqIExpY2Vuc2U6IE1JVCBsaWNlbnNlCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vd3d3LnNsZjRqLm9yZy9saWNlbnNlLmh0bWwKKyAgICAqIFByb2plY3QgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vcW9zLWNoL3NsZjRqCisgICAgKiBTb3VyY2UgVVJMOiAgaHR0cHM6Ly9naXRodWIuY29tL3Fvcy1jaC9zbGY0ai9yZWxlYXNlcy90YWcvdl8xLjcuMjUKKworc3RheDItYXBpLTMuMS40LmphciAoMy4xLjQpCisgICAgKiBMaWNlbnNlOiBCU0QtMi1DbGF1c2UKKwordmFsaWRhdGlvbi1hcGktMS4xLjAuRmluYWwuamFyICgxLjEuMC5GaW5hbCkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK3ZhdnItMC45LjEtc291cmNlcy5qYXIgKDAuOS4xKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKwordmF2ci1tYXRjaC0wLjkuMS5qYXIgKDAuOS4xKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKword29vZHN0b3gtY29yZS1hc2wtNC40LjEuamFyICg0LjQuMSkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKKworRkZBTUZBTUZBTSBTaWxrIEljb24sIFZlcnNpb24gMS4zCisgICAgKiBMaWNlbnNlOiBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBMaWNlbnNlCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvCisgICAgKiBQcm9qZWN0OiBodHRwOi8vd3d3LmZhbWZhbWZhbS5jb20vbGFiL2ljb25zL3NpbGsvCisgICAgKiBTb3VyY2U6ICBodHRwOi8vd3d3LmZhbWZhbWZhbS5jb20vbGFiL2ljb25zL3NpbGsvCisKK0Bhbmd1bGFyL2FuaW1hdGlvbnM6Ny4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pby9hcGkvYW5pbWF0aW9ucworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvY2RrOjcuMS4xCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8vYXBpCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjEuMQorCisKK0Bhbmd1bGFyL2NvbW1vbkA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40cgorCitAYW5ndWxhci9jb21waWxlckA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9jb3JlQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2Zvcm1zQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2h0dHBANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvcm91dGVyQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK2Jvb3RzdHJhcEA0LjEuMworICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcAorCitjbGFzcy10cmFuc2Zvcm1lckAwLjEuNgorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlc3RhY2svY2xhc3MtdHJhbnNmb3JtZXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3BsZWVyb2NrL2NsYXNzLXRyYW5zZm9ybWVyCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcGxlZXJvY2svY2xhc3MtdHJhbnNmb3JtZXIKKworY29yZS1qc0AyLjYuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3Jhdy9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3JlbGVhc2VzL3RhZy92Mi42LjAKKworZmlsZS1zYXZlckAxLjMuMworICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcy9yYXcvbWFzdGVyL0xJQ0VOU0UubWQKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzCisKK2ZvbnQtYXdlc29tZUA0LjcuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3J0QXdlc29tZS9Gb250LUF3ZXNvbWUvYmxvYi9tYXN0ZXIvTElDRU5TRS50eHQKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tLworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL0ZvcnRBd2Vzb21lL0ZvbnQtQXdlc29tZQorCituZzItc3BsaXQtcGFuZUAxLjMuMQorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS93YW5uYWJlZ2Vlay9uZzItc3BsaXQtcGFuZS9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS93YW5uYWJlZ2Vlay9uZzItc3BsaXQtcGFuZQorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3dhbm5hYmVnZWVrL25nMi1zcGxpdC1wYW5lCisKK25neC1ib290c3RyYXBAMy4xLjIKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vdmFsb3Itc29mdHdhcmUvbmd4LWJvb3RzdHJhcC9ibG9iL3YzLjEuMi9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL3ZhbG9yLXNvZnR3YXJlLmNvbS9uZ3gtYm9vdHN0cmFwCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vdmFsb3Itc29mdHdhcmUvbmd4LWJvb3RzdHJhcC90cmVlL3YzLjEuMgorCitAbmd4LXRyYW5zbGF0ZS9jb3JlQDExLjAuMQorICAgICogTGljZW5zZTogTUlUIAorICAgICogTGljZW5jZSBQYXRoOiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2NvcmUvYmxvYi92MTEuMC4xL0xJQ0VOU0UgIAorICAgICogUHJvamVjdCBVUkw6ICAgIGh0dHA6Ly93d3cubmd4LXRyYW5zbGF0ZS5jb20vCisgICAgKiBTb3VyY2UgVVJMOiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvY29yZQorCitAbmd4LXRyYW5zbGF0ZS9odHRwLWxvYWRlckA0LjAuMAorICAgICogTGljZW5zZTogTUlUIAorICAgICogTGljZW5jZSBQYXRoOiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2h0dHAtbG9hZGVyL2Jsb2IvdjQuMC4wL0xJQ0VOU0UgIAorICAgICogUHJvamVjdCBVUkw6ICAgIGh0dHA6Ly93d3cubmd4LXRyYW5zbGF0ZS5jb20vCisgICAgKiBTb3VyY2UgVVJMOiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvaHR0cC1sb2FkZXIvdHJlZS92NC4wLjAKKworcHJpbWVpY29uczoxLjAuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1laWNvbnMvYmxvYi8xLjAuMC9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL3d3dy5wcmltZWZhY2VzLm9yZy9wcmltZW5nCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZWljb25zL3RyZWUvMS4wLjAKKworcHJpbWVuZ0A3LjAuMQorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1lbmcvYmxvYi83LjAuMS9MSUNFTlNFLm1kCisgICAgKiBQcm9qZWN0OiBodHRwczovL3d3dy5wcmltZWZhY2VzLm9yZy9wcmltZW5nCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZW5nL3RyZWUvNy4wLjEKKworcnhqc0A2LjMuMworICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorICAgICogUHJvamVjdDogaHR0cHM6Ly9yeGpzLWRldi5maXJlYmFzZWFwcC5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvdHJlZS82LjMuMworCityeGpzLWNvbXBhdDo2LjMuMworICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorICAgICogUHJvamVjdDogaHR0cHM6Ly9yeGpzLWRldi5maXJlYmFzZWFwcC5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvdHJlZS82LjMuMy9jb21wYXQKKwordHNsaWJAMS45LjAKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdHNsaWIKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdHNsaWIvdHJlZS8xLjkuMAorCit6b25lLmpzQDAuOC4yNgorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvcmF3L21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhcgorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9yZWxlYXNlcy90YWcvdjAuOC4yNgorCitPTUcgRXZlbnQgU2VydmljZSBTcGVjaWZpY2F0aW9uICgxLjIpCisKKyogTGljZW5zZTogTGljZW5zZVJlZiAtIE9iamVjdC1NYW5hZ2VtZW50LUdyb3VwLUxpY2Vuc2UKKyogUHJvamVjdDogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL0VWTlQvMS4yLworKiBTb3VyY2U6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9FVk5ULzEuMi9wZGYKKworT01HIE5vdGlmaWNhdGlvbiBTZXJ2aWNlIFNwZWNpZmljYXRpb24gKDEuMSkKKworKiBMaWNlbnNlOiBMaWNlbnNlUmVmIC0gT2JqZWN0LU1hbmFnZW1lbnQtR3JvdXAtTGljZW5zZQorKiBQcm9qZWN0OiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvTk9ULworKiBTb3VyY2U6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9OT1QvMS4xL1BERgorCitvZHM1MzAuaWRsCitEYXRlOiBIb2VoZW5raXJjaGVuLCAwNi8wMS8yMDE2CisiVGhlIEFTQU0gQm9hcmQgb2YgRGlyZWN0b3JzIHJlbGVhc2VzIHRoZSBJREwgZmlsZXMgZm9yIHVzZSB1bmRlciB0aGUgRVBMIHRvIHRoZSBFY2xpcHNlIElXRyBvcGVuTURNLgorVGhpcyBpcyB2YWxpZCBmb3IgYWxsIHZlcnNpb25zIG9mIEFTQU0gT0RTIDUuMy54LgorVGhpcyBwZXJtaXNzaW9uIGlzIHZhbGlkIHVuZGVyIHRoZSBjb25kaXRpb25zIG9mIEVjbGlwc2Ugd2lsbCBub3QgbW9kaWZ5IHRoZSBmaWxlLiIKKworQXZhbG9uRXZlbnQuaWRsLCBDb3JiYUZpbGVTZXJ2ZXIuaWRsCitEYXRlOiAwOC8xNS8yMDE2CisiSGVyZXdpdGgsIHdlIHJlbGVhc2UgdGhlIGdlbmVyYXRlZCBDbGllbnQtU291cmNlLUNvZGUgZ2VuZXJhdGVkIGZyb20gb3VyIENPUkJBIElETHMsIG5hbWVseQorKiBDT1JCQU5vdGlmaWNhdGlvbiBTZXJ2aWNlIChnZW5lcmF0ZWQgZnJvbSDigJ5BdmFsb25FdmVudC5pZGzigJ0pCisqIENPUkJBRmlsZVNlcnZlciAoZ2VuZXJhdGVkIGZyb20g4oCeQ29yYmFGaWxlU2VydmVyLmlkbOKAnCksCitVbmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKS4gVGhpcyBhZ3JlZW1lbnQgZG9lcyBub3QgaW5jbHVkZSB0aGUg4oCeQXZhbG9uRXZlbnQuaWRs4oCcIGFuZAor4oCeQ29yYmFGaWxlU2VydmVyLmlkbOKAnCBpdHNlbGYsIHdoaWNoIHJlbWFpbiBwcm90ZWN0ZWQgcHJvcGVydHkgb2YgSGlnaFFTb2Z0LiAiCisKKyMjIENyeXB0b2dyYXBoeQorCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5CittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzCitwZXJtaXR0ZWQuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvYnVpbGQuZ3JhZGxlIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDc0MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2Rlc2NyaXB0aW9uID0gJ01ETSBBUEkgLSBEZWZhdWx0IE1vZGVsJworZ3JvdXAgPSAnb3JnLmVjbGlwc2UubWRtJwordmVyc2lvbiA9ICc1LjEuME04JworCithcHBseSBwbHVnaW46ICdqYXZhJworYXBwbHkgcGx1Z2luOiAnbWF2ZW4nCithcHBseSBwbHVnaW46ICdlY2xpcHNlJworCityZXBvc2l0b3JpZXMgeworCW1hdmVuTG9jYWwoKQorCW1hdmVuQ2VudHJhbCgpCit9CisKK2RlcGVuZGVuY2llcyB7CisJY29tcGlsZSAib3JnLmVjbGlwc2UubWRtOm9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZToke3ZlcnNpb259IgorCisJLy8gdGVzdGluZworCXRlc3RDb21waWxlICdqdW5pdDpqdW5pdDo0LjEyJworCXRlc3RDb21waWxlICdvcmcubW9ja2l0bzptb2NraXRvLWNvcmU6Mi4xMy4wJworCXRlc3RDb21waWxlICdvcmcuYXNzZXJ0ajphc3NlcnRqLWNvcmU6My42LjInCit9CisKK2phciB7CisJbWV0YUluZiB7IGZyb20gJ05PVElDRS50eHQnIH0KKwltZXRhSW5mIHsgZnJvbSAnTElDRU5TRS50eHQnIH0KK30KKwordGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZGVwZW5kc09uOiBjbGFzc2VzKSB7CisJY2xhc3NpZmllciA9ICdzb3VyY2VzJworCWZyb20gc291cmNlU2V0cy5tYWluLmFsbFNvdXJjZQorfQorCithcnRpZmFjdHMgeworCWFyY2hpdmVzIHNvdXJjZXNKYXIKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWI1NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3NvdXJjZUNvbXBhdGliaWxpdHk9MS44Cit0YXJnZXRDb21wYXRpYmlsaXR5PTEuOApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzI2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyZTAwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FDQorZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzDQoremlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUNCit6aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cw0KK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTQuMTAuMi1iaW4uemlwDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZXcgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvZ3JhZGxldwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jY2NkZDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZXcKQEAgLTAsMCArMSwxNzIgQEAKKyMhL3Vzci9iaW4vZW52IHNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjICBHcmFkbGUgc3RhcnQgdXAgc2NyaXB0IGZvciBVTipYCisjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQXR0ZW1wdCB0byBzZXQgQVBQX0hPTUUKKyMgUmVzb2x2ZSBsaW5rczogJDAgbWF5IGJlIGEgbGluaworUFJHPSIkMCIKKyMgTmVlZCB0aGlzIGZvciByZWxhdGl2ZSBzeW1saW5rcy4KK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICAgIGxzPWBscyAtbGQgIiRQUkciYAorICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBQUkc9IiRsaW5rIgorICAgIGVsc2UKKyAgICAgICAgUFJHPWBkaXJuYW1lICIkUFJHImAiLyRsaW5rIgorICAgIGZpCitkb25lCitTQVZFRD0iYHB3ZGAiCitjZCAiYGRpcm5hbWUgXCIkUFJHXCJgLyIgPi9kZXYvbnVsbAorQVBQX0hPTUU9ImBwd2QgLVBgIgorY2QgIiRTQVZFRCIgPi9kZXYvbnVsbAorCitBUFBfTkFNRT0iR3JhZGxlIgorQVBQX0JBU0VfTkFNRT1gYmFzZW5hbWUgIiQwImAKKworIyBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KK0RFRkFVTFRfSlZNX09QVFM9IiIKKworIyBVc2UgdGhlIG1heGltdW0gYXZhaWxhYmxlLCBvciBzZXQgTUFYX0ZEICE9IC0xIHRvIHVzZSB0aGF0IHZhbHVlLgorTUFYX0ZEPSJtYXhpbXVtIgorCit3YXJuICgpIHsKKyAgICBlY2hvICIkKiIKK30KKworZGllICgpIHsKKyAgICBlY2hvCisgICAgZWNobyAiJCoiCisgICAgZWNobworICAgIGV4aXQgMQorfQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQgKG11c3QgYmUgJ3RydWUnIG9yICdmYWxzZScpLgorY3lnd2luPWZhbHNlCittc3lzPWZhbHNlCitkYXJ3aW49ZmFsc2UKK25vbnN0b3A9ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiogKQorICAgIGN5Z3dpbj10cnVlCisgICAgOzsKKyAgRGFyd2luKiApCisgICAgZGFyd2luPXRydWUKKyAgICA7OworICBNSU5HVyogKQorICAgIG1zeXM9dHJ1ZQorICAgIDs7CisgIE5PTlNUT1AqICkKKyAgICBub25zdG9wPXRydWUKKyAgICA7OworZXNhYworCitDTEFTU1BBVEg9JEFQUF9IT01FL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorCisjIERldGVybWluZSB0aGUgSmF2YSBjb21tYW5kIHRvIHVzZSB0byBzdGFydCB0aGUgSlZNLgoraWYgWyAtbiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KKyAgICBpZiBbIC14ICIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIiBdIDsgdGhlbgorICAgICAgICAjIElCTSdzIEpESyBvbiBBSVggdXNlcyBzdHJhbmdlIGxvY2F0aW9ucyBmb3IgdGhlIGV4ZWN1dGFibGVzCisgICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCisgICAgZWxzZQorICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgorICAgIGZpCisgICAgaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgICAgICAgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJEpBVkFfSE9NRQorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorICAgIGZpCitlbHNlCisgICAgSkFWQUNNRD0iamF2YSIKKyAgICB3aGljaCBqYXZhID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorZmkKKworIyBJbmNyZWFzZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3JzIGlmIHdlIGNhbi4KK2lmIFsgIiRjeWd3aW4iID0gImZhbHNlIiAtYSAiJGRhcndpbiIgPSAiZmFsc2UiIC1hICIkbm9uc3RvcCIgPSAiZmFsc2UiIF0gOyB0aGVuCisgICAgTUFYX0ZEX0xJTUlUPWB1bGltaXQgLUggLW5gCisgICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgorICAgICAgICBpZiBbICIkTUFYX0ZEIiA9ICJtYXhpbXVtIiAtbyAiJE1BWF9GRCIgPSAibWF4IiBdIDsgdGhlbgorICAgICAgICAgICAgTUFYX0ZEPSIkTUFYX0ZEX0xJTUlUIgorICAgICAgICBmaQorICAgICAgICB1bGltaXQgLW4gJE1BWF9GRAorICAgICAgICBpZiBbICQ/IC1uZSAwIF0gOyB0aGVuCisgICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEIgorICAgICAgICBmaQorICAgIGVsc2UKKyAgICAgICAgd2FybiAiQ291bGQgbm90IHF1ZXJ5IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEX0xJTUlUIgorICAgIGZpCitmaQorCisjIEZvciBEYXJ3aW4sIGFkZCBvcHRpb25zIHRvIHNwZWNpZnkgaG93IHRoZSBhcHBsaWNhdGlvbiBhcHBlYXJzIGluIHRoZSBkb2NrCitpZiAkZGFyd2luOyB0aGVuCisgICAgR1JBRExFX09QVFM9IiRHUkFETEVfT1BUUyBcIi1YZG9jazpuYW1lPSRBUFBfTkFNRVwiIFwiLVhkb2NrOmljb249JEFQUF9IT01FL21lZGlhL2dyYWRsZS5pY25zXCIiCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luIDsgdGhlbgorICAgIEFQUF9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQVBQX0hPTUUiYAorICAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJENMQVNTUEFUSCJgCisgICAgSkFWQUNNRD1gY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EImAKKworICAgICMgV2UgYnVpbGQgdGhlIHBhdHRlcm4gZm9yIGFyZ3VtZW50cyB0byBiZSBjb252ZXJ0ZWQgdmlhIGN5Z3BhdGgKKyAgICBST09URElSU1JBVz1gZmluZCAtTCAvIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgMj4vZGV2L251bGxgCisgICAgU0VQPSIiCisgICAgZm9yIGRpciBpbiAkUk9PVERJUlNSQVcgOyBkbworICAgICAgICBST09URElSUz0iJFJPT1RESVJTJFNFUCRkaXIiCisgICAgICAgIFNFUD0ifCIKKyAgICBkb25lCisgICAgT1VSQ1lHUEFUVEVSTj0iKF4oJFJPT1RESVJTKSkiCisgICAgIyBBZGQgYSB1c2VyLWRlZmluZWQgcGF0dGVybiB0byB0aGUgY3lncGF0aCBhcmd1bWVudHMKKyAgICBpZiBbICIkR1JBRExFX0NZR1BBVFRFUk4iICE9ICIiIF0gOyB0aGVuCisgICAgICAgIE9VUkNZR1BBVFRFUk49IiRPVVJDWUdQQVRURVJOfCgkR1JBRExFX0NZR1BBVFRFUk4pIgorICAgIGZpCisgICAgIyBOb3cgY29udmVydCB0aGUgYXJndW1lbnRzIC0ga2x1ZGdlIHRvIGxpbWl0IG91cnNlbHZlcyB0byAvYmluL3NoCisgICAgaT0wCisgICAgZm9yIGFyZyBpbiAiJEAiIDsgZG8KKyAgICAgICAgQ0hFQ0s9YGVjaG8gIiRhcmcifGVncmVwIC1jICIkT1VSQ1lHUEFUVEVSTiIgLWAKKyAgICAgICAgQ0hFQ0syPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiXi0iYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBEZXRlcm1pbmUgaWYgYW4gb3B0aW9uCisKKyAgICAgICAgaWYgWyAkQ0hFQ0sgLW5lIDAgXSAmJiBbICRDSEVDSzIgLWVxIDAgXSA7IHRoZW4gICAgICAgICAgICAgICAgICAgICMjIyBBZGRlZCBhIGNvbmRpdGlvbgorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPWBjeWdwYXRoIC0tcGF0aCAtLWlnbm9yZSAtLW1peGVkICIkYXJnImAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPSJcIiRhcmdcIiIKKyAgICAgICAgZmkKKyAgICAgICAgaT0kKChpKzEpKQorICAgIGRvbmUKKyAgICBjYXNlICRpIGluCisgICAgICAgICgwKSBzZXQgLS0gOzsKKyAgICAgICAgKDEpIHNldCAtLSAiJGFyZ3MwIiA7OworICAgICAgICAoMikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiIDs7CisgICAgICAgICgzKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgOzsKKyAgICAgICAgKDQpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiA7OworICAgICAgICAoNSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiIDs7CisgICAgICAgICg2KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgOzsKKyAgICAgICAgKDcpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiA7OworICAgICAgICAoOCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciIDs7CisgICAgICAgICg5KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgIiRhcmdzOCIgOzsKKyAgICBlc2FjCitmaQorCisjIEVzY2FwZSBhcHBsaWNhdGlvbiBhcmdzCitzYXZlICgpIHsKKyAgICBmb3IgaSBkbyBwcmludGYgJXNcXG4gIiRpIiB8IHNlZCAicy8nLydcXFxcJycvZzsxcy9eLycvO1wkcy9cJC8nIFxcXFwvIiA7IGRvbmUKKyAgICBlY2hvICIgIgorfQorQVBQX0FSR1M9JChzYXZlICIkQCIpCisKKyMgQ29sbGVjdCBhbGwgYXJndW1lbnRzIGZvciB0aGUgamF2YSBjb21tYW5kLCBmb2xsb3dpbmcgdGhlIHNoZWxsIHF1b3RpbmcgYW5kIHN1YnN0aXR1dGlvbiBydWxlcworZXZhbCBzZXQgLS0gJERFRkFVTFRfSlZNX09QVFMgJEpBVkFfT1BUUyAkR1JBRExFX09QVFMgIlwiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JEFQUF9CQVNFX05BTUVcIiIgLWNsYXNzcGF0aCAiXCIkQ0xBU1NQQVRIXCIiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAiJEFQUF9BUkdTIgorCisjIGJ5IGRlZmF1bHQgd2Ugc2hvdWxkIGJlIGluIHRoZSBjb3JyZWN0IHByb2plY3QgZGlyLCBidXQgd2hlbiBydW4gZnJvbSBGaW5kZXIgb24gTWFjLCB0aGUgY3dkIGlzIHdyb25nCitpZiBbICIkKHVuYW1lKSIgPSAiRGFyd2luIiBdICYmIFsgIiRIT01FIiA9ICIkUFdEIiBdOyB0aGVuCisgIGNkICIkKGRpcm5hbWUgIiQwIikiCitmaQorCitleGVjICIkSkFWQUNNRCIgIiRAIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZXcuYmF0IGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZXcuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NTY0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvZ3JhZGxldy5iYXQKQEAgLTAsMCArMSw4NCBAQAorQGlmICIlREVCVUclIiA9PSAiIiBAZWNobyBvZmYNCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorQHJlbQ0KK0ByZW0gIEdyYWRsZSBzdGFydHVwIHNjcmlwdCBmb3IgV2luZG93cw0KK0ByZW0NCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsDQoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgc2V0bG9jYWwNCisNCitzZXQgRElSTkFNRT0lfmRwMA0KK2lmICIlRElSTkFNRSUiID09ICIiIHNldCBESVJOQU1FPS4NCitzZXQgQVBQX0JBU0VfTkFNRT0lfm4wDQorc2V0IEFQUF9IT01FPSVESVJOQU1FJQ0KKw0KK0ByZW0gQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuDQorc2V0IERFRkFVTFRfSlZNX09QVFM9DQorDQorQHJlbSBGaW5kIGphdmEuZXhlDQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQ0KKw0KK3NldCBKQVZBX0VYRT1qYXZhLmV4ZQ0KKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxDQoraWYgIiVFUlJPUkxFVkVMJSIgPT0gIjAiIGdvdG8gaW5pdA0KKw0KK2VjaG8uDQorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4NCitlY2hvLg0KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlDQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLg0KKw0KK2dvdG8gZmFpbA0KKw0KKzpmaW5kSmF2YUZyb21KYXZhSG9tZQ0KK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUNCitzZXQgSkFWQV9FWEU9JUpBVkFfSE9NRSUvYmluL2phdmEuZXhlDQorDQoraWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdA0KKw0KK2VjaG8uDQorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUNCitlY2hvLg0KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlDQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLg0KKw0KK2dvdG8gZmFpbA0KKw0KKzppbml0DQorQHJlbSBHZXQgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgaGFuZGxpbmcgV2luZG93cyB2YXJpYW50cw0KKw0KK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGdvdG8gd2luOXhNRV9hcmdzDQorDQorOndpbjl4TUVfYXJncw0KK0ByZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuDQorc2V0IENNRF9MSU5FX0FSR1M9DQorc2V0IF9TS0lQPTINCisNCis6d2luOXhNRV9hcmdzX3NsdXJwDQoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUNCisNCitzZXQgQ01EX0xJTkVfQVJHUz0lKg0KKw0KKzpleGVjdXRlDQorQHJlbSBTZXR1cCB0aGUgY29tbWFuZCBsaW5lDQorDQorc2V0IENMQVNTUEFUSD0lQVBQX0hPTUUlXGdyYWRsZVx3cmFwcGVyXGdyYWRsZS13cmFwcGVyLmphcg0KKw0KK0ByZW0gRXhlY3V0ZSBHcmFkbGUNCisiJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUNCisNCis6ZW5kDQorQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsDQoraWYgIiVFUlJPUkxFVkVMJSI9PSIwIiBnb3RvIG1haW5FbmQNCisNCis6ZmFpbA0KK3JlbSBTZXQgdmFyaWFibGUgR1JBRExFX0VYSVRfQ09OU09MRSBpZiB5b3UgbmVlZCB0aGUgX3NjcmlwdF8gcmV0dXJuIGNvZGUgaW5zdGVhZCBvZg0KK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQ0KK2lmICBub3QgIiIgPT0gIiVHUkFETEVfRVhJVF9DT05TT0xFJSIgZXhpdCAxDQorZXhpdCAvYiAxDQorDQorOm1haW5FbmQNCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbA0KKw0KKzpvbWVnYQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zZXR0aW5ncy5ncmFkbGUgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc2V0dGluZ3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NDAyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEsMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcm9vdFByb2plY3QubmFtZSA9ICdvcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvQXBwbGljYXRpb25Db250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvQXBwbGljYXRpb25Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlZjkzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9BcHBsaWNhdGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkJhc2VBcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkVudGl0eUZhY3Rvcnk7CisKKy8qKgorICogRXh0ZW5kcyB0aGUge0BsaW5rIEJhc2VBcHBsaWNhdGlvbkNvbnRleHR9IGludGVyZmFjZSB0byByZXR1cm4KKyAqIHtAbGluayBFbnRpdHlGYWN0b3J5fSBhbmQge0BsaW5rIEVudGl0eU1hbmFnZXJ9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ29udGV4dCBleHRlbmRzIEJhc2VBcHBsaWNhdGlvbkNvbnRleHQ8RW50aXR5RmFjdG9yeSwgRW50aXR5TWFuYWdlcj4geworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L0FwcGxpY2F0aW9uQ29udGV4dEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzY1YTkxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L0FwcGxpY2F0aW9uQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkJhc2VBcHBsaWNhdGlvbkNvbnRleHRGYWN0b3J5OworCisvKioKKyAqIEV4dGVuZHMgdGhlIHtAbGluayBCYXNlQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeX0gaW50ZXJmYWNlIHRvIHJldHVybiBhbgorICoge0BsaW5rIEFwcGxpY2F0aW9uQ29udGV4dH0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeSBleHRlbmRzIEJhc2VBcHBsaWNhdGlvbkNvbnRleHRGYWN0b3J5PEFwcGxpY2F0aW9uQ29udGV4dD4geworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvRW50aXR5TWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L0VudGl0eU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTZiN2IwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L0VudGl0eU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQmFzZUVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlN0YXR1c0F0dGFjaGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVUZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVmVyc2lvbmFibGU7CisKKy8qKgorICogRXh0ZW5kcyB0aGUge0BsaW5rIEJhc2VFbnRpdHlNYW5hZ2VyfSBpbnRlcmZhY2Ugd2l0aCBhZGRpdGlvbmFsIGxvYWQgbWV0aG9kcworICogZGVkaWNhdGVkIHRvIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIG1vZGVscy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBFbnRpdHlNYW5hZ2VyIGV4dGVuZHMgQmFzZUVudGl0eU1hbmFnZXIgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTG9hZHMgdGhlIGVudGl0eSBpZGVudGlmaWVkIGJ5IGdpdmVuIGVudGl0eSBjbGFzcywge0BsaW5rIENvbnRleHRUeXBlfSBhbmQKKwkgKiBpdHMgaW5zdGFuY2UgSUQuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGRlc2lyZWQgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVHlwZSBvZiB0aGUgcmV0dXJuZWQgZW50aXR5LgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBUaGUge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKiBAcGFyYW0gaW5zdGFuY2VJRCAgVGhlIGluc3RhbmNlIElELgorCSAqIEByZXR1cm4gVGhlIGVudGl0eSB3aXRoIGdpdmVuIGluc3RhbmNlIElEIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlbnRpdHkuCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gVCBsb2FkKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSwgU3RyaW5nIGluc3RhbmNlSUQpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8VD4gZW50aXRpZXMgPSBsb2FkKGVudGl0eUNsYXNzLCBjb250ZXh0VHlwZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpbnN0YW5jZUlEKSk7CisJCWlmIChlbnRpdGllcy5zaXplKCkgIT0gMSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIGVudGl0eSBieSBpbnN0YW5jZSBJRC4iKTsKKwkJfQorCQlyZXR1cm4gZW50aXRpZXMuZ2V0KDApOworCisJfQorCisJPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZChDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUsIENvbGxlY3Rpb248U3RyaW5nPiBpbnN0YW5jZUlEcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogTG9hZHMgYWxsIGF2YWlsYWJsZSBlbnRpdGllcyBvZiBnaXZlbiB0eXBlLgorCSAqCisJICogPHByZT4KKwkgKiB7CisJICogCSYjNjQ7Y29kZQorCSAqIAlMaXN0PENhdGFsb2dDb21wb25lbnQ+IGNhdGFsb2dDb21wb25lbnRzID0gZW50aXR5TWFuYWdlci5sb2FkQWxsKENhdGFsb2dDb21wb25lbnQuY2xhc3MsIFVOSVRVTkRFUlRFU1QpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdGllcy4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGUgVGhlIHtAbGluayBDb250ZXh0VHlwZX0uCisJICogQHJldHVybiBFbnRpdGllcyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIGVudGl0aWVzLgorCSAqIEBzZWUgI2xvYWRBbGwoQ2xhc3MsIENvbnRleHRUeXBlLCBTdHJpbmcpCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkQWxsKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvYWRBbGwoZW50aXR5Q2xhc3MsIGNvbnRleHRUeXBlLCAiKiIpOworCX0KKworCS8qKgorCSAqIExvYWRzIGFsbCBhdmFpbGFibGUgZW50aXRpZXMgb2YgZ2l2ZW4gdHlwZSB3aG9zZSBuYW1lIGZ1bGZpbGxzIHRoZSBnaXZlbgorCSAqIHBhdHRlcm4uCisJICoKKwkgKiA8cHJlPgorCSAqIHsKKwkgKiAJJiM2NDtjb2RlCisJICogCS8vIHJldHJpZXZlIGFsbCB0ZW1wbGF0ZSByb290cyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoICdFeGFtcGxlJworCSAqIAlMaXN0PFRlbXBsYXRlUm9vdD4gdGVtcGxhdGVSb290cyA9IGVudGl0eU1hbmFnZXIubG9hZEFsbChUZW1wbGF0ZVJvb3QuY2xhc3MsIFVOSVRVTkRFUlRFU1QsICJFeGFtcGxlKiIpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdGllcy4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGUgVGhlIHtAbGluayBDb250ZXh0VHlwZX0uCisJICogQHBhcmFtIHBhdHRlcm4gICAgIElzIGFsd2F5cyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQKKwkgKiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyBhcyBmb2xsb3dzOiAiPyIgZm9yIG9uZSBtYXRjaGluZyBjaGFyYWN0ZXIgYW5kCisJICogICAgICAgICAgICAgICAgICAgICIqIiBmb3IgYSBzZXF1ZW5jZSBvZiBtYXRjaGluZyBjaGFyYWN0ZXJzLgorCSAqIEByZXR1cm4gTWF0Y2hlZCBlbnRpdGllcyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIGVudGl0aWVzLgorCSAqIEBzZWUgI2xvYWRBbGwoQ2xhc3MpCisJICovCisJPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZEFsbChDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUsIFN0cmluZyBwYXR0ZXJuKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgbGF0ZXN0IHZhbGlkIHtAbGluayBWZXJzaW9uYWJsZX0gZW50aXR5IG9mIGdpdmVuIHR5cGUgYW5kIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGRlc2lyZWQgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVHlwZSBvZiB0aGUgcmV0dXJuZWQgZW50aXR5LgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBUaGUgZXhhY3QgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGVudGl0eS4KKwkgKiBAcmV0dXJuIE9wdGlvbmFsIGlzIGVtcHR5IGlmIG5vIHN1Y2ggZW50aXR5IHdhcyBmb3VuZAorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlbnRpdHkuCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIFZlcnNpb25hYmxlPiBPcHRpb25hbDxUPiBsb2FkTGF0ZXN0VmFsaWQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIFN0cmluZyBuYW1lKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbG9hZEFsbChlbnRpdHlDbGFzcywgbmFtZSkuc3RyZWFtKCkuZmlsdGVyKHYgLT4gdi5uYW1lRXF1YWxzKG5hbWUpKS5maWx0ZXIoVmVyc2lvbmFibGU6OmlzVmFsaWQpCisJCQkJLm1heChWZXJzaW9uYWJsZS5DT01QQVJBVE9SKTsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgbGF0ZXN0IHZhbGlkIHtAbGluayBWZXJzaW9uYWJsZX0gZW50aXR5IG9mIGdpdmVuIHR5cGUsCisJICoge0BsaW5rIENvbnRleHRUeXBlfSBhbmQgbmFtZS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdHkuCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9LgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBUaGUgZXhhY3QgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGVudGl0eS4KKwkgKiBAcmV0dXJuIE9wdGlvbmFsIGlzIGVtcHR5IGlmIG5vIHN1Y2ggZW50aXR5IHdhcyBmb3VuZAorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlbnRpdHkuCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIFZlcnNpb25hYmxlPiBPcHRpb25hbDxUPiBsb2FkTGF0ZXN0VmFsaWQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlLAorCQkJU3RyaW5nIG5hbWUpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvYWRBbGwoZW50aXR5Q2xhc3MsIGNvbnRleHRUeXBlLCBuYW1lKS5zdHJlYW0oKS5maWx0ZXIodiAtPiB2Lm5hbWVFcXVhbHMobmFtZSkpCisJCQkJLmZpbHRlcihWZXJzaW9uYWJsZTo6aXNWYWxpZCkubWF4KFZlcnNpb25hYmxlLkNPTVBBUkFUT1IpOworCX0KKworCTxUIGV4dGVuZHMgU3RhdHVzQXR0YWNoYWJsZT4gTGlzdDxUPiBsb2FkQWxsKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdGF0dXMgc3RhdHVzLCBTdHJpbmcgcGF0dGVybik7CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgcmVmZXJlY2VkIHtAbGluayBUZW1wbGF0ZVRlc3R9IGZvciBhIHtAbGluayBUZXN0fS4KKwkgKiAKKwkgKiBAcGFyYW0gdGVzdCB7QGxpbmsgVGVzdH0gcmVmZXJlbmNpbmcgdGhlIGRlc2lyZWQgdGVtcGxhdGUKKwkgKiBAcmV0dXJuIHtAbGluayBPcHRpb25hbH0gd2l0aCB0aGUgbG9hZGVkIHtAbGluayBUZW1wbGF0ZVRlc3R9CisJICovCisJT3B0aW9uYWw8VGVtcGxhdGVUZXN0PiBsb2FkVGVtcGxhdGUoVGVzdCB0ZXN0KTsKKworCS8qKgorCSAqIExvYWRzIHRoZSByZWZlcmVuY2VkIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfSBmb3IgYSB7QGxpbmsgVGVzdFN0ZXB9CisJICogCisJICogQHBhcmFtIHRlc3RTdGVwIHtAbGluayBUZXN0U3RlcH0gcmVmZXJlbmNpbmcgdGhlIGRlc2lyZWQgdGVtcGxhdGUKKwkgKiBAcmV0dXJuIHtAbGluayBPcHRpb25hbH0gd2l0aCB0aGUgbG9hZGVkIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfQorCSAqLworCU9wdGlvbmFsPFRlbXBsYXRlVGVzdFN0ZXA+IGxvYWRUZW1wbGF0ZShUZXN0U3RlcCB0ZXN0U3RlcCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvQ2F0YWxvZ0F0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2U1ODE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDMyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNjYWxhclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNvcnRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBjYXRhbG9nIGF0dHJpYnV0ZSBlbnRpdHkgdHlwZS4gQSBjYXRhbG9nIGF0dHJpYnV0ZSBpcyBhCisgKiBnZW5lcmljIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbiB0byBzdG9yZSBjb250ZXh0IGRhdGEgKCJhcyBtZWFzdXJlZCIsICJhcworICogb3JkZXJlZCIpLiBJdCBhbHdheXMgYmVsb25ncyB0byBhIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSBvciBhCisgKiB7QGxpbmsgQ2F0YWxvZ1NlbnNvcn0uIEl0cyBuYW1lIGhhcyB0byBiZSB1bmlxdWUgd2l0aGluIHRoZSBwYXJlbnQgYW5kIG1heQorICogbm90IGJlIGNoYW5nZWQsIG9uY2Ugd3JpdHRlbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgQ2F0YWxvZ0NvbXBvbmVudAorICogQHNlZSBDYXRhbG9nU2Vuc29yCisgKi8KK3B1YmxpYyBjbGFzcyBDYXRhbG9nQXR0cmlidXRlIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSwgRGVzY3JpYmFibGUsIFNvcnRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ1ZhbHVlTGlzdFJlZmVyZW5jZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MSVNUX1JFRkVSRU5DRSA9ICJWYWx1ZUxpc3RSZWYiOworCisJLyoqCisJICogVGhlICdWYWx1ZUNvcHlhYmxlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NPUFlBQkxFID0gIlZhbHVlQ29weWFibGUiOworCisJLyoqCisJICogVGhlICdBY3Rpb25SZXF1ZXN0Q2xhc3NuYW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FDVElPTl9SRVFVRVNUX0NMQVNTTkFNRSA9ICJBY3Rpb25SZXF1ZXN0Q2xhc3NuYW1lIjsKKworCS8qKgorCSAqIFRoZSA8dT52aXJ0dWFsPC91PiAne0BsaXRlcmFsIEB9RW51bWVyYXRpb25OYW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVRUUl9FTlVNRVJBVElPTl9OQU1FID0gIkBFbnVtZXJhdGlvbk5hbWUiOworCisJLyoqCisJICogVGhlIDx1PnZpcnR1YWw8L3U+ICd7QGxpdGVyYWwgQH1TY2FsYXJUeXBlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVRUUl9TQ0FMQVJfVFlQRSA9ICJAU2NhbGFyVHlwZSI7CisKKwkvKioKKwkgKiBUaGUgPHU+dmlydHVhbDwvdT4gJ3tAbGl0ZXJhbCBAfVNlcXVlbmNlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVRUUl9TRVFVRU5DRSA9ICJAU2VxdWVuY2UiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgRW51bWVyYXRpb248Pz4gZW51bWVyYXRpb25PYmo7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZSBzY2FsYXJUeXBlVmFsdWU7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZSBzZXF1ZW5jZVZhbHVlOworCisJcHJpdmF0ZSBVbml0IHVuaXQ7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCUNhdGFsb2dBdHRyaWJ1dGUoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCisJCU1hcDxTdHJpbmcsIFZhbHVlPiB2YWx1ZXMgPSBjb3JlLmdldFZhbHVlcygpOworCQlFbnVtUmVnaXN0cnkgZXIgPSBFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKKwkJVmFsdWUgZW51bVZhbHVlID0gdmFsdWVzLnJlbW92ZShWQVRUUl9FTlVNRVJBVElPTl9OQU1FKTsKKwkJaWYgKGVudW1WYWx1ZSAhPSBudWxsKSB7CisJCQllbnVtZXJhdGlvbk9iaiA9IGVyLmdldChlbnVtVmFsdWUuZXh0cmFjdChWYWx1ZVR5cGUuU1RSSU5HKSk7CisJCX0KKwkJc2NhbGFyVHlwZVZhbHVlID0gdmFsdWVzLnJlbW92ZShWQVRUUl9TQ0FMQVJfVFlQRSk7CisJCXNlcXVlbmNlVmFsdWUgPSB2YWx1ZXMucmVtb3ZlKFZBVFRSX1NFUVVFTkNFKTsKKworCQl1bml0ID0gY29yZS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVW5pdC5jbGFzcyk7CisJCWNvcmUuZ2V0TXV0YWJsZVN0b3JlKCkucmVtb3ZlKFVuaXQuY2xhc3MpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGl0IGlzIGFsbG93ZWQgdG8gc3RvcmUgb3RoZXIgZGF0YSB0aGFuIHRob3NlIHByb3ZpZGVkIHZpYQorCSAqIHJlbGF0ZWQge0BsaW5rIFZhbHVlTGlzdH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIGZhbHNlfSBpZiBpdCBpcyBhbGxvd2VkIHRvIHN0b3JlIG90aGVyIHZhbHVlcyB0aGVuCisJICogICAgICAgICB0aG9zZSBwcm92aWRlZC4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc1ZhbHVlTGlzdFJlZmVyZW5jZSgpIHsKKwkJYm9vbGVhbiB2YWx1ZUxpc3RSZWZlcmVuY2UgPSBnZXRWYWx1ZShBVFRSX1ZBTFVFX0xJU1RfUkVGRVJFTkNFKS5leHRyYWN0KCk7CisJCXJldHVybiB2YWx1ZUxpc3RSZWZlcmVuY2UgJiYgZ2V0VmFsdWVMaXN0KCkuaXNQcmVzZW50KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyB2YWx1ZSByZWZlcmVuY2UgZmxhZyBmb3IgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZUxpc3RSZWZlcmVuY2UgVGhlIG5ldyB2YWx1ZSBsaXN0IHJlZmVyZW5jZSBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlTGlzdFJlZmVyZW5jZShCb29sZWFuIHZhbHVlTGlzdFJlZmVyZW5jZSkgeworCQlnZXRWYWx1ZShBVFRSX1ZBTFVFX0xJU1RfUkVGRVJFTkNFKS5zZXQodmFsdWVMaXN0UmVmZXJlbmNlKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBpdCBpcyBhbGxvd2VkIHRvIGNvcHkgdGhlIGNvbnRhaW5lZCB2YWx1ZSBpbiBjYXNlIG9mIGFuCisJICogYXNzb2NpYXRlZCBkZXNjcmlwdGl2ZSBjb21wb25lbnQgaXMgY29waWVkLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBpdCBhbGxvd2VkIHRvIGNvcHkgYSBjb250YWluZWQgdmFsdWUuCisJICovCisJcHVibGljIEJvb2xlYW4gaXNWYWx1ZUNvcHlhYmxlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9WQUxVRV9DT1BZQUJMRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgdmFsdWUgY29weWFibGUgZmxhZyBmb3IgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZUNvcHlhYmxlIFRoZSBuZXcgdmFsdWUgY29weWFibGUgZmxhZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZUNvcHlhYmxlKEJvb2xlYW4gdmFsdWVDb3B5YWJsZSkgeworCQlnZXRWYWx1ZShBVFRSX1ZBTFVFX0NPUFlBQkxFKS5zZXQodmFsdWVDb3B5YWJsZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYWN0aW9uIHJlcXVlc3QgY2xhc3MgbmFtZSBvZiB0aGlzIGNhdGFsb2cgYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiBUaGUgYWN0aW9uIHJlcXVlc3QgY2xhc3MgbmFtZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvblJlcXVlc3RDbGFzc25hbWUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0FDVElPTl9SRVFVRVNUX0NMQVNTTkFNRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgYWN0aW9uIHJlcXVlc3QgY2xhc3MgbmFtZSBmb3IgdGhpcyBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcGFyYW0gYWN0aW9uUmVxdWVzdENsYXNzbmFtZSBUaGUgbmV3IGFjdGlvbiByZXF1ZXN0IGNsYXNzIG5hbWUuCisJICovCisJcHVibGljIHZvaWQgc2V0QWN0aW9uUmVxdWVzdENsYXNzbmFtZShTdHJpbmcgYWN0aW9uUmVxdWVzdENsYXNzbmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX0FDVElPTl9SRVFVRVNUX0NMQVNTTkFNRSkuc2V0KGFjdGlvblJlcXVlc3RDbGFzc25hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlbGF0ZWQge0BsaW5rIFZhbHVlTGlzdH0uCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgbm8ge0Bjb2RlIFZhbHVlTGlzdH0gaXMgcmVsYXRlZC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VmFsdWVMaXN0PiBnZXRWYWx1ZUxpc3QoKSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVmFsdWVMaXN0LmNsYXNzKSk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB7QGxpbmsgVmFsdWVMaXN0fSByZWxhdGlvbiB3aXRoIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVMaXN0IFRoZSBuZXcge0Bjb2RlIFZhbHVlTGlzdH0gbWF5IGJlIG51bGwuCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZUxpc3QpIHsKKwkJaWYgKHZhbHVlTGlzdCA9PSBudWxsKSB7CisJCQlnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkucmVtb3ZlKFZhbHVlTGlzdC5jbGFzcyk7CisJCQlzZXRWYWx1ZUxpc3RSZWZlcmVuY2UoQm9vbGVhbi5GQUxTRSk7CisJCX0gZWxzZSB7CisJCQlnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHZhbHVlTGlzdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQge0BsaW5rIENhdGFsb2dDb21wb25lbnR9LgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0BsaW5rIENhdGFsb2dTZW5zb3J9IGlzIHBhcmVudCBvZgorCSAqICAgICAgICAgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDYXRhbG9nU2Vuc29yKCkKKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8Q2F0YWxvZ0NvbXBvbmVudD4gZ2V0Q2F0YWxvZ0NvbXBvbmVudCgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZSgpLmdldFBlcm1hbmVudFN0b3JlKCkuZ2V0KENhdGFsb2dDb21wb25lbnQuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQge0BsaW5rIENhdGFsb2dTZW5zb3J9LgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0BsaW5rIENhdGFsb2dDb21wb25lbnR9IGlzIHBhcmVudCBvZgorCSAqICAgICAgICAgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDYXRhbG9nQ29tcG9uZW50KCkKKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8Q2F0YWxvZ1NlbnNvcj4gZ2V0Q2F0YWxvZ1NlbnNvcigpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZSgpLmdldFBlcm1hbmVudFN0b3JlKCkuZ2V0KENhdGFsb2dTZW5zb3IuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIGFuZCB1bm1vZGlmaWFibGUge0BsaW5rIFZhbHVlVHlwZX0gb2YgdGhpcyBjYXRhbG9nCisJICogYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFZhbHVlVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFZhbHVlVHlwZTw/PiBnZXRWYWx1ZVR5cGUoKSB7CisJCVNjYWxhclR5cGUgc2NhbGFyVHlwZSA9IHNjYWxhclR5cGVWYWx1ZS5leHRyYWN0KCk7CisJCUJvb2xlYW4gc2VxdWVuY2UgPSBzZXF1ZW5jZVZhbHVlLmV4dHJhY3QoKTsKKwkJcmV0dXJuIHNlcXVlbmNlLmJvb2xlYW5WYWx1ZSgpID8gc2NhbGFyVHlwZS50b1ZhbHVlVHlwZSgpIDogc2NhbGFyVHlwZS50b1NpbmdsZVZhbHVlVHlwZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZpcnR1YWwgYW5kIHVubW9kaWZpYWJsZSBlbnVtZXJhdGlvbiBjbGFzcyBvZiB0aGlzIGNhdGFsb2cKKwkgKiBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBlbnVtZXJhdGlvbiBjbGFzcyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZSdzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFZhbHVlVHlwZX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBWYWx1ZVR5cGUjaXNFbnVtZXJhdGlvblR5cGUoKX0gaXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKwlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bWVyYXRpb25PYmplY3QoKSB7CisJCWlmICghZ2V0VmFsdWVUeXBlKCkuaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2F0YWxvZyBhdHRyaWJ1dGUgaXMgbm90IG9mIHR5cGUgZW51bWVyYXRpb24uIik7CisJCX0KKwkJcmV0dXJuIGVudW1lcmF0aW9uT2JqOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBVbml0fSBvZiB0aGlzIGNhdGFsb2cgYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIG5vIHVuaXQgaXMgZGVmaW5lZC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VW5pdD4gZ2V0VW5pdCgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUodW5pdCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyB7QGxpbmsgVW5pdH0gZm9yIHRoaXMgY2F0YWxvZyBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcGFyYW0gdW5pdCBUaGUgbmV3IHtAY29kZSBVbml0fSBtYXkgYmUgbnVsbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVbml0KFVuaXQgdW5pdCkgeworCQl0aGlzLnVuaXQgPSB1bml0OworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCisJCVNjYWxhclR5cGUgc2NhbGFyVHlwZSA9IHNjYWxhclR5cGVWYWx1ZS5leHRyYWN0KCk7CisJCXNiLmFwcGVuZCgiU2NhbGFyVHlwZSA9ICIpLmFwcGVuZChzY2FsYXJUeXBlKTsKKwkJaWYgKHNjYWxhclR5cGUuaXNFbnVtZXJhdGlvbigpKSB7CisJCQlzYi5hcHBlbmQoIiwgRW51bWVyYXRpb25PYmplY3QgPSAiKS5hcHBlbmQoZ2V0RW51bWVyYXRpb25PYmplY3QoKSk7CisJCX0KKworCQlzYi5hcHBlbmQoIiwgU2VxdWVuY2UgPSAiKS5hcHBlbmQoKGJvb2xlYW4pIHNlcXVlbmNlVmFsdWUuZXh0cmFjdCgpKTsKKworCQlPcHRpb25hbDxVbml0PiBjYXRhbG9nVW5pdCA9IGdldFVuaXQoKTsKKwkJaWYgKGNhdGFsb2dVbml0LmlzUHJlc2VudCgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVW5pdCA9ICIpLmFwcGVuZChjYXRhbG9nVW5pdC5nZXQoKSk7CisJCX0KKworCQlzYi5hcHBlbmQoIiwgIikuYXBwZW5kKGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChWYWx1ZTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFBhY2thZ2UgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFNldHMge0BsaW5rIFZhbHVlVHlwZX0gb2YgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHtAbGluayBWYWx1ZVR5cGV9LgorCSAqLworCXZvaWQgc2V0VmFsdWVUeXBlKFZhbHVlVHlwZTw/PiB2YWx1ZVR5cGUpIHsKKwkJRW51bWVyYXRpb248Pz4gc2NhbGFyVHlwZUVudW0gPSBFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoRW51bVJlZ2lzdHJ5LlNDQUxBUl9UWVBFKTsKKwkJc2NhbGFyVHlwZVZhbHVlLnNldChzY2FsYXJUeXBlRW51bS52YWx1ZU9mKHZhbHVlVHlwZS50b1NpbmdsZVR5cGUoKS5uYW1lKCkpKTsKKwkJc2VxdWVuY2VWYWx1ZS5zZXQodmFsdWVUeXBlLmlzU2VxdWVuY2UoKSk7CisJfQorCisJLyoqCisJICogU2V0cyBlbnVtZXJhdGlvbiBPYmplY3Qgb2YgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSBlbnVtZXJhdGlvbk9iaiBUaGUgZW51bWVyYXRpb24uCisJICovCisJdm9pZCBzZXRFbnVtZXJhdGlvbk9iaihFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbk9iaikgeworCQlzZXRWYWx1ZVR5cGUoVmFsdWVUeXBlLkVOVU1FUkFUSU9OKTsKKwkJdGhpcy5lbnVtZXJhdGlvbk9iaiA9IGVudW1lcmF0aW9uT2JqOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dDb21wb25lbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9DYXRhbG9nQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4MzVjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9DYXRhbG9nQ29tcG9uZW50LmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRhdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBjYXRhbG9nIGNvbXBvbmVudCBlbnRpdHkgdHlwZS4gQSBjYXRhbG9nIGNvbXBvbmVudCBhY3RzCisgKiBhcyBhIGNvbnRhaW5lciB0byBzdG9yZSBjb250ZXh0IGRhdGEgKCJhcyBtZWFzdXJlZCIsICJhcyBvcmRlcmVkIikuIEVhY2gKKyAqIGNhdGFsb2cgY29tcG9uZW50IGhhcyBhIGNvcnJlc3BvbmRpbmcgZW50aXR5IHR5cGUgd2hvc2UgbmFtZSBpcyBlcXVhbCB0byB0aGUKKyAqIG5hbWUgb2YgdGhlIGNhdGFsb2cgY29tcG9uZW50LiBUaGVyZWZvcmUgdGhlIG5hbWUgb2YgYSBjYXRhbG9nIGNvbXBvbmVudCBoYXMKKyAqIHRvIGJlIHVuaXF1ZSBhbmQgaXMgbm90IGFsbG93ZWQgdG8gYmUgbW9kaWZpZWQsIG9uY2Ugd3JpdHRlbi4gQSBjYXRhbG9nCisgKiBjb21wb25lbnQgY29uc2lzdHMgb2Yge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IHdoaWNoIGRlc2NyaWJlIHRoZSBhdHRyaWJ1dGVzCisgKiBvZiB0aGlzIGNvbnRhaW5lci4gSW4gY2FzZSBvZiB7QGxpbmsgQ29udGV4dFR5cGUjVEVTVEVRVUlQTUVOVH0gaXQgbWF5IGhhdmUKKyAqIHtAbGluayBDYXRhbG9nU2Vuc29yfXMgd2hpY2ggZGVzY3JpYmUgdGhlIGF2YWlsYWJsZSBtZWFzdXJlbWVudCBzZW5zb3JzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDYXRhbG9nQXR0cmlidXRlCisgKiBAc2VlIENhdGFsb2dTZW5zb3IKKyAqLworcHVibGljIGNsYXNzIENhdGFsb2dDb21wb25lbnQgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGF0YWJsZSwgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJQ2F0YWxvZ0NvbXBvbmVudChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisKKwkJU3RyaW5nIHR5cGVOYW1lID0gY29yZS5nZXRUeXBlTmFtZSgpLnRvVXBwZXJDYXNlKExvY2FsZS5ST09UKTsKKwkJZm9yIChDb250ZXh0VHlwZSBjb250ZXh0VHlwZUNhbmRpZGF0ZSA6IENvbnRleHRUeXBlLnZhbHVlcygpKSB7CisJCQlpZiAodHlwZU5hbWUuY29udGFpbnMoY29udGV4dFR5cGVDYW5kaWRhdGUubmFtZSgpKSkgeworCQkJCWNvbnRleHRUeXBlID0gY29udGV4dFR5cGVDYW5kaWRhdGU7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29yZSBpcyBpbmNvbXBhdGlibGUuIik7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRUeXBlfSBvZiB0aGlzIGNhdGFsb2cgY29tcG9uZW50LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENvbnRleHRUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoKSB7CisJCXJldHVybiBjb250ZXh0VHlwZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9IHdpdGgKKwkgKiAgICAgICAgIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPENhdGFsb2dBdHRyaWJ1dGU+IGdldENhdGFsb2dBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldENhdGFsb2dBdHRyaWJ1dGVzKCkuc3RyZWFtKCkuZmlsdGVyKGNhIC0+IGNhLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9cyByZWxhdGVkIHRvIHRoaXMgY2F0YWxvZworCSAqIGNvbXBvbmVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4gZ2V0Q2F0YWxvZ0F0dHJpYnV0ZXMoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmdldChDYXRhbG9nQXR0cmlidXRlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9IHRoYXQgaGFzIHRvIGJlIHJlbW92ZWQuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9IHdpdGggZ2l2ZW4gbmFtZQorCSAqICAgICAgICAgaGFzIGJlZW4gcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVDYXRhbG9nQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPENhdGFsb2dBdHRyaWJ1dGU+IGNhdGFsb2dBdHRyaWJ1dGUgPSBnZXRDYXRhbG9nQXR0cmlidXRlKG5hbWUpOworCQlpZiAoY2F0YWxvZ0F0dHJpYnV0ZS5pc1ByZXNlbnQoKSkgeworCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUoY2F0YWxvZ0F0dHJpYnV0ZS5nZXQoKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2F0YWxvZ1NlbnNvcn0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHtAY29kZSBDYXRhbG9nU2Vuc29yfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIENhdGFsb2dTZW5zb3J9IHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPENhdGFsb2dTZW5zb3I+IGdldENhdGFsb2dTZW5zb3IoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldENhdGFsb2dTZW5zb3JzKCkuc3RyZWFtKCkuZmlsdGVyKGNzIC0+IGNzLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIENhdGFsb2dTZW5zb3J9cyByZWxhdGVkIHRvIHRoaXMgY2F0YWxvZworCSAqIGNvbXBvbmVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8Q2F0YWxvZ1NlbnNvcj4gZ2V0Q2F0YWxvZ1NlbnNvcnMoKSB7CisJCWlmIChjb250ZXh0VHlwZS5pc1Rlc3RFcXVpcG1lbnQoKSkgeworCQkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KENhdGFsb2dTZW5zb3IuY2xhc3MpOworCQl9CisKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBDYXRhbG9nU2Vuc29yfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn0gdGhhdCBoYXMgdG8gYmUgcmVtb3ZlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn0gd2l0aCBnaXZlbiBuYW1lIGhhcworCSAqICAgICAgICAgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZUNhdGFsb2dTZW5zb3IoU3RyaW5nIG5hbWUpIHsKKwkJT3B0aW9uYWw8Q2F0YWxvZ1NlbnNvcj4gY2F0YWxvZ1NlbnNvciA9IGdldENhdGFsb2dTZW5zb3IobmFtZSk7CisJCWlmIChjYXRhbG9nU2Vuc29yLmlzUHJlc2VudCgpKSB7CisJCQlnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLnJlbW92ZShjYXRhbG9nU2Vuc29yLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoIkNvbnRleHRUeXBlID0gIikuYXBwZW5kKGdldENvbnRleHRUeXBlKCkpLmFwcGVuZCgiLCAiKTsKKwkJc2IuYXBwZW5kKGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChWYWx1ZTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisKKwkJTGlzdDxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlcyA9IGdldENhdGFsb2dBdHRyaWJ1dGVzKCk7CisJCWlmICghY2F0YWxvZ0F0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgQ2F0YWxvZ0F0dHJpYnV0ZXMgPSAiKS5hcHBlbmQoY2F0YWxvZ0F0dHJpYnV0ZXMpOworCQl9CisKKwkJTGlzdDxDYXRhbG9nU2Vuc29yPiBjYXRhbG9nU2Vuc29ycyA9IGdldENhdGFsb2dTZW5zb3JzKCk7CisJCWlmICghY2F0YWxvZ1NlbnNvcnMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgQ2F0YWxvZ1NlbnNvcnMgPSAiKS5hcHBlbmQoY2F0YWxvZ1NlbnNvcnMpOworCQl9CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvQ2F0YWxvZ1NlbnNvci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dTZW5zb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzg2NTRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dTZW5zb3IuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGF0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZXNjcmliYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGNhdGFsb2cgc2Vuc29yIGVudGl0eSB0eXBlLiBBIGNhdGFsb2cgc2Vuc29yIGFjdHMgYXMgYQorICogY29udGFpbmVyIHRvIHN0b3JlIHNlbnNvciBjb250ZXh0IGRhdGEgKCJhcyBtZWFzdXJlZCIsICJhcyBvcmRlcmVkIikuIEl0CisgKiBhbHdheXMgYmVsb25ncyB0byBhIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSBvZiB0eXBlCisgKiB7QGxpbmsgQ29udGV4dFR5cGUjVEVTVEVRVUlQTUVOVH0uIEVhY2ggY2F0YWxvZyBzZW5zb3IgaGFzIGEgY29ycmVzcG9uZGluZworICogZW50aXR5IHR5cGUgd2hvc2UgbmFtZSBpcyBlcXVhbCB0byB0aGUgbmFtZSBvZiB0aGUgY2F0YWxvZyBzZW5zb3IuIFRoZXJlZm9yZQorICogdGhlIG5hbWUgb2YgYSBjYXRhbG9nIHNlbnNvciBoYXMgdG8gYmUgdW5pcXVlIGFuZCBpcyBub3QgYWxsb3dlZCB0byBiZQorICogbW9kaWZpZWQsIG9uY2Ugd3JpdHRlbi4gQSBjYXRhbG9nIHNlbnNvciBjb25zaXN0cyBvZiB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0KKyAqIHdoaWNoIGRlc2NyaWJlIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgY29udGFpbmVyLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDYXRhbG9nQ29tcG9uZW50CisgKiBAc2VlIENhdGFsb2dDb21wb25lbnQKKyAqLworcHVibGljIGNsYXNzIENhdGFsb2dTZW5zb3IgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGF0YWJsZSwgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCUNhdGFsb2dTZW5zb3IoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhcmVudCB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDYXRhbG9nQ29tcG9uZW50IGdldENhdGFsb2dDb21wb25lbnQoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoQ2F0YWxvZ0NvbXBvbmVudC5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX0uCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBhIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSB3aXRoCisJICogICAgICAgICBnaXZlbiBuYW1lIGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxDYXRhbG9nQXR0cmlidXRlPiBnZXRDYXRhbG9nQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBnZXRDYXRhbG9nQXR0cmlidXRlcygpLnN0cmVhbSgpLmZpbHRlcihjYSAtPiBjYS5uYW1lRXF1YWxzKG5hbWUpKS5maW5kQW55KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHtAbGluayBDYXRhbG9nQXR0cmlidXRlfXMgcmVsYXRlZCB0byB0aGlzIGNhdGFsb2cKKwkgKiBzZW5zb3IuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PENhdGFsb2dBdHRyaWJ1dGU+IGdldENhdGFsb2dBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSB3aXRoIGdpdmVuIG5hbWUKKwkgKiAgICAgICAgIGhhcyBiZWVuIHJlbW92ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlQ2F0YWxvZ0F0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCQlPcHRpb25hbDxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlID0gZ2V0Q2F0YWxvZ0F0dHJpYnV0ZShuYW1lKTsKKwkJaWYgKGNhdGFsb2dBdHRyaWJ1dGUuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKGNhdGFsb2dBdHRyaWJ1dGUuZ2V0KCkpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZChnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5tYXAoVmFsdWU6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCisJCUxpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4gY2F0YWxvZ0F0dHJpYnV0ZXMgPSBnZXRDYXRhbG9nQXR0cmlidXRlcygpOworCQlpZiAoIWNhdGFsb2dBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgeworCQkJc2IuYXBwZW5kKCIsIENhdGFsb2dBdHRyaWJ1dGVzID0gIikuYXBwZW5kKGNhdGFsb2dBdHRyaWJ1dGVzKTsKKwkJfQorCisJCXJldHVybiBzYi5hcHBlbmQoJyknKS50b1N0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NsYXNzaWZpY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvQ2xhc3NpZmljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJkMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NsYXNzaWZpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlN0YXR1c0F0dGFjaGFibGU7CisKK3B1YmxpYyBjbGFzcyBDbGFzc2lmaWNhdGlvbiBleHRlbmRzIEJhc2VFbnRpdHkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlDbGFzc2lmaWNhdGlvbihDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLyoqCisJICogQXNzaWducyB0aGlzIHN0YXR1cyB0byBnaXZlbiB7QGxpbmsgU3RhdHVzQXR0YWNoYWJsZX1zLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgICAgICAgIFRoZSBzdGF0dXMgYXR0YWNoYWJsZSB0eXBlLgorCSAqIEBwYXJhbSBzdGF0dXNBdHRhY2hhYmxlcyBUaGlzIHN0YXR1cyB3aWxsIGJlIGFzc2lnbmVkIHRvIGFsbCBvZiB0aGVtLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+IHZvaWQgYXNzaWduKExpc3Q8VD4gc3RhdHVzQXR0YWNoYWJsZXMpIHsKKwkJc3RhdHVzQXR0YWNoYWJsZXMuZm9yRWFjaCh0aGlzOjphc3NpZ24pOworCX0KKworCS8qKgorCSAqIEFzc2lnbnMgdGhpcyBzdGF0dXMgdG8gZ2l2ZW4ge0BsaW5rIFN0YXR1c0F0dGFjaGFibGV9LgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgICAgICAgVGhlIHN0YXR1cyBhdHRhY2hhYmxlIHR5cGUuCisJICogQHBhcmFtIHN0YXR1c0F0dGFjaGFibGUgVGhpcyBzdGF0dXMgd2lsbCBiZSBhc3NpZ25lZCB0byBpdC4KKwkgKi8KKwlwdWJsaWMgPFQgZXh0ZW5kcyBTdGF0dXNBdHRhY2hhYmxlPiB2b2lkIGFzc2lnbihUIHN0YXR1c0F0dGFjaGFibGUpIHsKKwkJZ2V0Q29yZShzdGF0dXNBdHRhY2hhYmxlKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQodGhpcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0RvbWFpbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0RvbWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NWYzODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvRG9tYWluLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZXNjcmliYWJsZTsKKworcHVibGljIGNsYXNzIERvbWFpbiBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZXNjcmliYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCURvbWFpbihDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0VudGl0eUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9FbnRpdHlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiNDNjNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9FbnRpdHlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRTZW5zb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUXVhbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNjYWxhclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WZXJzaW9uU3RhdGU7CisKKy8qKgorICogQ3JlYXRlcyBuZXcgZW50aXRpZXMgb2YgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gbW9kZWwuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnRpdHlGYWN0b3J5IGV4dGVuZHMgQmFzZUVudGl0eUZhY3RvcnkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUm9sZX0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBSb2xlfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBSb2xlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKFN0cmluZyBuYW1lKSB7CisJCVJvbGUgcm9sZSA9IG5ldyBSb2xlKGNyZWF0ZUNvcmUoUm9sZS5jbGFzcykpOworCisJCS8vIHByb3BlcnRpZXMKKwkJcm9sZS5zZXROYW1lKG5hbWUpOworCisJCXJldHVybiByb2xlOworCX0KKworCS8qKgorCSAqIEFsd2F5cyB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gc2luY2UgaW4gYSBkZWZhdWx0IG1vZGVsIGVhY2gKKwkgKiB7QGxpbmsgVGVzdH0gaGFzIGEgcGFyZW50IHtAbGluayBQb29sfS4KKwkgKgorCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSXMgYWx3YXlzIHRocm93bi4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGVzdCBjcmVhdGVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGVzdCByZXF1aXJlcyBhIHBhcmVudCBQb29sLiIpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFByb2plY3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgUHJvamVjdH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUHJvamVjdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgbmFtZSkgeworCQlQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdChjcmVhdGVDb3JlKFByb2plY3QuY2xhc3MpKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXByb2plY3Quc2V0TmFtZShuYW1lKTsKKworCQlyZXR1cm4gcHJvamVjdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBQb29sfSBmb3IgZ2l2ZW4ge0BsaW5rIFByb2plY3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgUG9vbH0uCisJICogQHBhcmFtIHByb2plY3QgVGhlIHBhcmVudCB7QGNvZGUgUHJvamVjdH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUG9vbH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFBvb2wgY3JlYXRlUG9vbChTdHJpbmcgbmFtZSwgUHJvamVjdCBwcm9qZWN0KSB7CisJCVBvb2wgcG9vbCA9IG5ldyBQb29sKGNyZWF0ZUNvcmUoUG9vbC5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHBvb2wpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KHByb2plY3QpOworCQlnZXRDb3JlKHByb2plY3QpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQocG9vbCk7CisKKwkJLy8gcHJvcGVydGllcworCQlwb29sLnNldE5hbWUobmFtZSk7CisKKwkJcmV0dXJuIHBvb2w7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdH0gZm9yIGdpdmVuIHtAbGluayBQb29sfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBwb29sIFRoZSBwYXJlbnQge0Bjb2RlIFBvb2x9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZXN0IGNyZWF0ZVRlc3QoU3RyaW5nIG5hbWUsIFBvb2wgcG9vbCkgeworCQlyZXR1cm4gY3JlYXRlVGVzdChuYW1lLCBwb29sLCAoU3RhdHVzKSBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0fSBmb3IgZ2l2ZW4ge0BsaW5rIFBvb2x9IHVzaW5nIGdpdmVuCisJICoge0BsaW5rIFRlbXBsYXRlVGVzdH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBwb29sICAgICAgICAgVGhlIHBhcmVudCB7QGNvZGUgUG9vbH0uCisJICogQHBhcmFtIHRlbXBsYXRlVGVzdCBUaGUgdGVtcGxhdGUgdGhlIHJldHVybmVkIHtAY29kZSBUZXN0fSB3aWxsIGJlIGRlcml2ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVzdH0gaXMgcmV0dXJuZWQuCisJICovCisJLy8gVE9ETyBtYWtlIGEgZGVjaXNpb246IHN0YXR1cyBpbiBvciBvdXQhCisJcHVibGljIFRlc3QgY3JlYXRlVGVzdChTdHJpbmcgbmFtZSwgUG9vbCBwb29sLCBUZW1wbGF0ZVRlc3QgdGVtcGxhdGVUZXN0KSB7CisJCXJldHVybiBjcmVhdGVUZXN0KG5hbWUsIHBvb2wsIG51bGwsIG51bGwsIHRlbXBsYXRlVGVzdCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udGV4dFJvb3R9IGZvciBnaXZlbiB7QGxpbmsgVGVzdFN0ZXB9IHVzaW5nIGdpdmVuCisJICoge0BsaW5rIFRlbXBsYXRlUm9vdH0uCisJICoKKwkgKiBAcGFyYW0gdGVzdFN0ZXAgICAgIFRoZSBwYXJlbnQge0Bjb2RlIFRlc3RTdGVwfS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVSb290IFRoZSB0ZW1wbGF0ZSB0aGUgcmV0dXJuZWQge0Bjb2RlIENvbnRleHRSb290fSB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ29udGV4dFJvb3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDb250ZXh0Um9vdCBjcmVhdGVDb250ZXh0Um9vdChUZXN0U3RlcCB0ZXN0U3RlcCwgVGVtcGxhdGVSb290IHRlbXBsYXRlUm9vdCkgeworCQlDb250ZXh0Um9vdCBjb250ZXh0Um9vdCA9IGNyZWF0ZUNvbnRleHRSb290KHRlbXBsYXRlUm9vdCk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodGVzdFN0ZXApLmdldE11dGFibGVTdG9yZSgpLnNldChjb250ZXh0Um9vdCwgdGVtcGxhdGVSb290LmdldENvbnRleHRUeXBlKCkpOworCisJCXJldHVybiBjb250ZXh0Um9vdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb250ZXh0Um9vdH0gZm9yIGdpdmVuIHtAbGluayBNZWFzdXJlbWVudH0gdXNpbmcgZ2l2ZW4KKwkgKiB7QGxpbmsgVGVtcGxhdGVSb290fS4KKwkgKgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudCAgVGhlIHBhcmVudCB7QGNvZGUgTWVhc3VyZW1lbnR9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVJvb3QgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgQ29udGV4dFJvb3R9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQgZnJvbS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0Um9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENvbnRleHRSb290IGNyZWF0ZUNvbnRleHRSb290KE1lYXN1cmVtZW50IG1lYXN1cmVtZW50LCBUZW1wbGF0ZVJvb3QgdGVtcGxhdGVSb290KSB7CisJCXJldHVybiBjcmVhdGVDb250ZXh0Um9vdChBcnJheXMuYXNMaXN0KG1lYXN1cmVtZW50KSwgdGVtcGxhdGVSb290KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb250ZXh0Um9vdH0gZm9yIGdpdmVuIHtAbGluayBMaXN0fSBpZgorCSAqIHtAbGluayBNZWFzdXJlbWVudH1zIHVzaW5nIGdpdmVuIHtAbGluayBUZW1wbGF0ZVJvb3R9LiBJZiBMaXN0IGlzIG51bGwgb3IKKwkgKiBlbXB0eSBjb250ZXh0IHJvb3QgaXMgY3JlYXRlZCB3aXRoIG5vIHJlbGF0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudHMgVGhlIHBhcmVudCB7QGNvZGUgTWVhc3VyZW1lbnR9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVJvb3QgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgQ29udGV4dFJvb3R9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQgZnJvbS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0Um9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENvbnRleHRSb290IGNyZWF0ZUNvbnRleHRSb290KExpc3Q8TWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50cywgVGVtcGxhdGVSb290IHRlbXBsYXRlUm9vdCkgeworCQlDb250ZXh0Um9vdCBjb250ZXh0Um9vdCA9IGNyZWF0ZUNvbnRleHRSb290KHRlbXBsYXRlUm9vdCk7CisKKwkJLy8gcmVsYXRpb25zCisJCWlmIChtZWFzdXJlbWVudHMgIT0gbnVsbCAmJiAhbWVhc3VyZW1lbnRzLmlzRW1wdHkoKSkgeworCQkJbWVhc3VyZW1lbnRzLmZvckVhY2gobSAtPiBnZXRDb3JlKG0pLmdldE11dGFibGVTdG9yZSgpLnNldChjb250ZXh0Um9vdCwgdGVtcGxhdGVSb290LmdldENvbnRleHRUeXBlKCkpKTsKKwkJfQorCisJCXJldHVybiBjb250ZXh0Um9vdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb250ZXh0Um9vdH0gdXNpbmcgZ2l2ZW4ge0BsaW5rIFRlbXBsYXRlUm9vdH0uCisJICoKKwkgKiBAcGFyYW0gdGVtcGxhdGVSb290IFRoZSB0ZW1wbGF0ZSB0aGUgcmV0dXJuZWQge0Bjb2RlIENvbnRleHRSb290fSB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ29udGV4dFJvb3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDb250ZXh0Um9vdCBjcmVhdGVDb250ZXh0Um9vdChUZW1wbGF0ZVJvb3QgdGVtcGxhdGVSb290KSB7CisJCUNvbnRleHRSb290IGNvbnRleHRSb290ID0gY3JlYXRlQ29udGV4dFJvb3QodGVtcGxhdGVSb290LmdldE5hbWUoKSwgdGVtcGxhdGVSb290LmdldENvbnRleHRUeXBlKCkpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKGNvbnRleHRSb290KS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQodGVtcGxhdGVSb290KTsKKworCQkvLyBjcmVhdGUgZGVmYXVsdCBhY3RpdmUgYW5kIG1hbmRhdG9yeSBjb250ZXh0IGNvbXBvbmVudHMKKwkJdGVtcGxhdGVSb290LmdldFRlbXBsYXRlQ29tcG9uZW50cygpLnN0cmVhbSgpCisJCQkJLmZpbHRlcihUZW1wbGF0ZUNvbXBvbmVudC5JU19ERUZBVUxUX0FDVElWRS5vcihUZW1wbGF0ZUNvbXBvbmVudC5JU19NQU5EQVRPUlkpKQorCQkJCS5mb3JFYWNoKHRlbXBsYXRlQ29tcG9uZW50IC0+IHsKKwkJCQkJY3JlYXRlQ29udGV4dENvbXBvbmVudCh0ZW1wbGF0ZUNvbXBvbmVudC5nZXROYW1lKCksIGNvbnRleHRSb290KTsKKwkJCQl9KTsKKworCQlyZXR1cm4gY29udGV4dFJvb3Q7CisJfQorCisJLyoqCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2Ugb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IHdpdGggZ2l2ZW4gbmFtZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0LgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb250ZXh0Q29tcG9uZW50IGNyZWF0ZUNvbnRleHRDb21wb25lbnQoU3RyaW5nIG5hbWUsIENvbnRleHRSb290IGNvbnRleHRSb290KSB7CisJCWlmIChjb250ZXh0Um9vdC5nZXRDb250ZXh0Q29tcG9uZW50KG5hbWUpLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb250ZXh0IGNvbXBvbmVudCB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlUZW1wbGF0ZVJvb3QgdGVtcGxhdGVSb290ID0gVGVtcGxhdGVSb290Lm9mKGNvbnRleHRSb290KQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZW1wbGF0ZSByb290IGlzIG5vdCBhdmFpbGFibGUuIikpOworCisJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudCA9IHRlbXBsYXRlUm9vdC5nZXRUZW1wbGF0ZUNvbXBvbmVudChuYW1lKTsKKwkJaWYgKHRlbXBsYXRlQ29tcG9uZW50LmlzUHJlc2VudCgpKSB7CisJCQkvLyByZWN1cnNpdmVseSBjcmVhdGUgbWlzc2luZyBwYXJlbnQgY29udGV4dCBjb21wb25lbnRzCisJCQl0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5nZXRQYXJlbnRUZW1wbGF0ZUNvbXBvbmVudCgpCisJCQkJCS5maWx0ZXIodGMgLT4gIWNvbnRleHRSb290LmdldENvbnRleHRDb21wb25lbnQodGMuZ2V0TmFtZSgpKS5pc1ByZXNlbnQoKSkKKwkJCQkJLmlmUHJlc2VudCh0YyAtPiBjcmVhdGVDb250ZXh0Q29tcG9uZW50KHRjLmdldE5hbWUoKSwgY29udGV4dFJvb3QpKTsKKworCQkJLy8gY3JlYXRlIGNvbnRleHQgY29tcG9uZW50IGlmIG5vdCBhbHJlYWR5IGRvbmUKKwkJCWlmICghY29udGV4dFJvb3QuZ2V0Q29udGV4dENvbXBvbmVudChuYW1lKS5pc1ByZXNlbnQoKSkgeworCQkJCUNvbnRleHRDb21wb25lbnQgY29udGV4dENvbXBvbmVudCA9IHN1cGVyLmNyZWF0ZUNvbnRleHRDb21wb25lbnQoCisJCQkJCQl0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5nZXRDYXRhbG9nQ29tcG9uZW50KCkuZ2V0TmFtZSgpLCBjb250ZXh0Um9vdCk7CisKKwkJCQkvLyByZWxhdGlvbnMKKwkJCQlnZXRDb3JlKGNvbnRleHRDb21wb25lbnQpLmdldE11dGFibGVTdG9yZSgpLnNldCh0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKSk7CisKKwkJCQkvLyBwcm9wZXJ0aWVzCisJCQkJY29udGV4dENvbXBvbmVudC5zZXROYW1lKG5hbWUpOworCQkJCWNvbnRleHRDb21wb25lbnQKKwkJCQkJCS5zZXRNaW1lVHlwZShjb250ZXh0Q29tcG9uZW50LmdldE1pbWVUeXBlKCkuYWRkU3ViVHlwZSh0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5nZXROYW1lKCkpKTsKKwkJCQloaWRlVmFsdWVzKGdldENvcmUoY29udGV4dENvbXBvbmVudCksIHRlbXBsYXRlQ29tcG9uZW50LmdldCgpLmdldFRlbXBsYXRlQXR0cmlidXRlcygpKTsKKwkJCQl0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5nZXRUZW1wbGF0ZUF0dHJpYnV0ZXMoKS5mb3JFYWNoKHRhIC0+IHsKKwkJCQkJY29udGV4dENvbXBvbmVudC5nZXRWYWx1ZSh0YS5nZXROYW1lKCkpLnNldCh0YS5nZXREZWZhdWx0VmFsdWUoKS5leHRyYWN0KCkpOworCQkJCX0pOworCisJCQkJLy8gY3JlYXRlIGRlZmF1bHQgYWN0aXZlIGFuZCBtYW5kYXRvcnkgY2hpbGQgY29udGV4dCBjb21wb25lbnRzCisJCQkJdGVtcGxhdGVDb21wb25lbnQuZ2V0KCkuZ2V0VGVtcGxhdGVDb21wb25lbnRzKCkuc3RyZWFtKCkuZmlsdGVyKFRlbXBsYXRlQ29tcG9uZW50LklTX0lNUExJQ0lUX0NSRUFURSkKKwkJCQkJCS5mb3JFYWNoKGNoaWxkVGVtcGxhdGVDb21wb25lbnQgLT4geworCQkJCQkJCWNyZWF0ZUNvbnRleHRDb21wb25lbnQoY2hpbGRUZW1wbGF0ZUNvbXBvbmVudC5nZXROYW1lKCksIGNvbnRleHRSb290KTsKKwkJCQkJCX0pOworCisJCQkJLy8gY3JlYXRlIGRlZmF1bHQgYWN0aXZlIGFuZCBtYW5kYXRvcnkgY29udGV4dCBzZW5zb3JzCisJCQkJdGVtcGxhdGVDb21wb25lbnQuZ2V0KCkuZ2V0VGVtcGxhdGVTZW5zb3JzKCkuc3RyZWFtKCkuZmlsdGVyKFRlbXBsYXRlU2Vuc29yLklTX0lNUExJQ0lUX0NSRUFURSkKKwkJCQkJCS5mb3JFYWNoKHRlbXBsYXRlU2Vuc29yIC0+IHsKKwkJCQkJCQljcmVhdGVDb250ZXh0U2Vuc29yKHRlbXBsYXRlU2Vuc29yLmdldE5hbWUoKSwgY29udGV4dENvbXBvbmVudCk7CisJCQkJCQl9KTsKKworCQkJCXJldHVybiBjb250ZXh0Q29tcG9uZW50OworCQkJfQorCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVtcGxhdGUgY29tcG9uZW50IHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBkb2VzIG5vdCBleGlzdC4iKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbnRleHRTZW5zb3IgY3JlYXRlQ29udGV4dFNlbnNvcihTdHJpbmcgbmFtZSwgQ29udGV4dENvbXBvbmVudCBjb250ZXh0Q29tcG9uZW50KSB7CisJCWlmIChjb250ZXh0Q29tcG9uZW50LmdldENvbnRleHRTZW5zb3IobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRleHQgc2Vuc29yIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfQorCisJCVRlbXBsYXRlQ29tcG9uZW50IHRlbXBsYXRlQ29tcG9uZW50ID0gVGVtcGxhdGVDb21wb25lbnQub2YoY29udGV4dENvbXBvbmVudCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVtcGxhdGUgY29tcG9uZW50IGlzIG5vdCBhdmFpbGFibGUuIikpOworCisJCU9wdGlvbmFsPFRlbXBsYXRlU2Vuc29yPiB0ZW1wbGF0ZVNlbnNvciA9IHRlbXBsYXRlQ29tcG9uZW50LmdldFRlbXBsYXRlU2Vuc29yKG5hbWUpOworCQlpZiAodGVtcGxhdGVTZW5zb3IuaXNQcmVzZW50KCkpIHsKKwkJCUNvbnRleHRTZW5zb3IgY29udGV4dFNlbnNvciA9IHN1cGVyLmNyZWF0ZUNvbnRleHRTZW5zb3IodGVtcGxhdGVTZW5zb3IuZ2V0KCkuZ2V0Q2F0YWxvZ1NlbnNvcigpLmdldE5hbWUoKSwKKwkJCQkJY29udGV4dENvbXBvbmVudCk7CisKKwkJCS8vIHJlbGF0aW9ucworCQkJZ2V0Q29yZShjb250ZXh0U2Vuc29yKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQodGVtcGxhdGVTZW5zb3IuZ2V0KCkpOworCisJCQkvLyBwcm9wZXJ0aWVzCisJCQljb250ZXh0U2Vuc29yLnNldE5hbWUobmFtZSk7CisJCQloaWRlVmFsdWVzKGdldENvcmUoY29udGV4dFNlbnNvciksIHRlbXBsYXRlU2Vuc29yLmdldCgpLmdldFRlbXBsYXRlQXR0cmlidXRlcygpKTsKKwkJCXRlbXBsYXRlU2Vuc29yLmdldCgpLmdldFRlbXBsYXRlQXR0cmlidXRlcygpLmZvckVhY2godGEgLT4geworCQkJCWNvbnRleHRTZW5zb3IuZ2V0VmFsdWUodGEuZ2V0TmFtZSgpKS5zZXQodGEuZ2V0RGVmYXVsdFZhbHVlKCkuZXh0cmFjdCgpKTsKKwkJCX0pOworCisJCQlyZXR1cm4gY29udGV4dFNlbnNvcjsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlbXBsYXRlIHNlbnNvciB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgZG9lcyBub3QgZXhpc3QuIik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0gd2l0aCBnaXZlbiB7QGxpbmsgQ29udGV4dFR5cGV9IGFuZAorCSAqIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gY29udGV4dFR5cGUgVGhlIHtAY29kZSBDb250ZXh0VHlwZX0uCisJICogQHBhcmFtIG5hbWUgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBuYW1lIGlzIG5vdCBhbGxvd2VkLgorCSAqLworCXB1YmxpYyBDYXRhbG9nQ29tcG9uZW50IGNyZWF0ZUNhdGFsb2dDb21wb25lbnQoQ29udGV4dFR5cGUgY29udGV4dFR5cGUsIFN0cmluZyBuYW1lKSB7CisJCXZhbGlkYXRlQ2F0YWxvZ05hbWUobmFtZSwgZmFsc2UpOworCisJCUNhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCA9IG5ldyBDYXRhbG9nQ29tcG9uZW50KGNyZWF0ZUNvcmUoQ2F0YWxvZ0NvbXBvbmVudC5jbGFzcywgY29udGV4dFR5cGUpKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCWNhdGFsb2dDb21wb25lbnQuc2V0TmFtZShuYW1lKTsKKwkJY2F0YWxvZ0NvbXBvbmVudC5zZXREYXRlQ3JlYXRlZChMb2NhbERhdGVUaW1lLm5vdygpKTsKKwkJY2F0YWxvZ0NvbXBvbmVudC5nZXRWYWx1ZSgiVmFsaWRGbGFnIikuc2V0KFZlcnNpb25TdGF0ZS5WQUxJRCk7CisKKwkJcmV0dXJuIGNhdGFsb2dDb21wb25lbnQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gZm9yIGdpdmVuIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKiBUaGUge0BsaW5rIFZhbHVlVHlwZX0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI1NUUklOR308L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI1NUUklOR19TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RBVEV9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNEQVRFX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjQk9PTEVBTn08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JPT0xFQU5fU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjQllURV9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI1NIT1JUfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjU0hPUlRfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNJTlRFR0VSfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjSU5URUdFUl9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0xPTkd9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNMT05HX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGTE9BVF9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRV9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JZVEVfU1RSRUFNfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjQllURV9TVFJFQU1fU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGTE9BVF9DT01QTEVYfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRkxPQVRfQ09NUExFWF9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRV9DT01QTEVYfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGSUxFX0xJTkt9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGSUxFX0xJTktfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfS4KKwkgKiBAcGFyYW0gdmFsdWVUeXBlICAgICAgICBUaGUge0Bjb2RlIFZhbHVlVHlwZX0uCisJICogQHBhcmFtIGNhdGFsb2dDb21wb25lbnQgVGhlIHBhcmVudCB7QGNvZGUgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2Ugb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYWxsb3dlZCBvciBnaXZlbiB7QGNvZGUgVmFsdWVUeXBlfSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQuCisJICovCisJcHVibGljIENhdGFsb2dBdHRyaWJ1dGUgY3JlYXRlQ2F0YWxvZ0F0dHJpYnV0ZShTdHJpbmcgbmFtZSwgVmFsdWVUeXBlPD8+IHZhbHVlVHlwZSwKKwkJCUNhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCkgeworCQl2YWxpZGF0ZUNhdGFsb2dOYW1lKG5hbWUsIHRydWUpOworCisJCWlmIChjYXRhbG9nQ29tcG9uZW50LmdldENhdGFsb2dBdHRyaWJ1dGUobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhdGFsb2cgYXR0cmlidXRlIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfSBlbHNlIGlmICh2YWx1ZVR5cGUuaXNFbnVtZXJhdGlvblR5cGUoKSB8fCB2YWx1ZVR5cGUuaXNCeXRlU3RyZWFtVHlwZSgpIHx8IHZhbHVlVHlwZS5pc1Vua25vd24oKQorCQkJCXx8IHZhbHVlVHlwZS5pc0Jsb2IoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgdHlwZSAnIiArIHZhbHVlVHlwZSArICInIGlzIG5vdCBhbGxvd2VkLiIpOworCQl9CisKKwkJQ2F0YWxvZ0F0dHJpYnV0ZSBjYXRhbG9nQXR0cmlidXRlID0gbmV3IENhdGFsb2dBdHRyaWJ1dGUoCisJCQkJY3JlYXRlQ29yZShDYXRhbG9nQXR0cmlidXRlLmNsYXNzLCBjYXRhbG9nQ29tcG9uZW50LmdldENvbnRleHRUeXBlKCkpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShjYXRhbG9nQXR0cmlidXRlKS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChjYXRhbG9nQ29tcG9uZW50KTsKKwkJZ2V0Q29yZShjYXRhbG9nQ29tcG9uZW50KS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKGNhdGFsb2dBdHRyaWJ1dGUpOworCisJCS8vIHByb3BlcnRpZXMKKwkJY2F0YWxvZ0F0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOworCQljYXRhbG9nQXR0cmlidXRlLnNldFZhbHVlVHlwZSh2YWx1ZVR5cGUpOworCQljYXRhbG9nQXR0cmlidXRlLnNldFNvcnRJbmRleChuZXh0SW5kZXgoY2F0YWxvZ0NvbXBvbmVudC5nZXRDYXRhbG9nQXR0cmlidXRlcygpKSk7CisKKwkJcmV0dXJuIGNhdGFsb2dBdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gZm9yIGdpdmVuIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgVW5pdH0uCisJICogRm9yIHtAbGluayBWYWx1ZVR5cGV9IHNlZSB7QGxpbmsgI2NyZWF0ZUNhdGFsb2dBdHRyaWJ1dGUoU3RyaW5nLCBWYWx1ZVR5cGUsIENhdGFsb2dDb21wb25lbnQpfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9LgorCSAqIEBwYXJhbSB2YWx1ZVR5cGUgICAgICAgIFRoZSB7QGNvZGUgVmFsdWVUeXBlfS4KKwkgKiBAcGFyYW0KKwkgKiBAcGFyYW0gY2F0YWxvZ0NvbXBvbmVudCBUaGUgcGFyZW50IHtAY29kZSBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGluIHVzZSBvcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhbGxvd2VkIG9yIGdpdmVuIHtAY29kZSBWYWx1ZVR5cGV9IGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZ0F0dHJpYnV0ZSBjcmVhdGVDYXRhbG9nQXR0cmlidXRlKFN0cmluZyBuYW1lLCBWYWx1ZVR5cGU8Pz4gdmFsdWVUeXBlLCBVbml0IHVuaXQsCisJCQlDYXRhbG9nQ29tcG9uZW50IGNhdGFsb2dDb21wb25lbnQpIHsKKwkJQ2F0YWxvZ0F0dHJpYnV0ZSBjYXRBdHRyID0gY3JlYXRlQ2F0YWxvZ0F0dHJpYnV0ZShuYW1lLCB2YWx1ZVR5cGUsIGNhdGFsb2dDb21wb25lbnQpOworCQljYXRBdHRyLnNldFVuaXQodW5pdCk7CisJCXJldHVybiBjYXRBdHRyOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IGZvciBnaXZlbiB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX0uCisJICogQHBhcmFtIGVudW1lcmF0aW9uT2JqZWN0IFRoZSBlbnVtZXJhdGlvbi4KKwkgKiBAcGFyYW0gY2F0YWxvZ0NvbXBvbmVudCAgVGhlIHBhcmVudCB7QGNvZGUgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2Ugb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYWxsb3dlZCBvciBnaXZlbiBlbnVtZXJhdGlvbiBjbGFzcyBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQuCisJICovCisJcHVibGljIENhdGFsb2dBdHRyaWJ1dGUgY3JlYXRlQ2F0YWxvZ0F0dHJpYnV0ZShTdHJpbmcgbmFtZSwgRW51bWVyYXRpb248Pz4gZW51bWVyYXRpb25PYmosCisJCQlDYXRhbG9nQ29tcG9uZW50IGNhdGFsb2dDb21wb25lbnQpIHsKKwkJdmFsaWRhdGVDYXRhbG9nTmFtZShuYW1lLCB0cnVlKTsKKwkJdmFsaWRhdGVFbnVtKGVudW1lcmF0aW9uT2JqKTsKKwkJaWYgKGNhdGFsb2dDb21wb25lbnQuZ2V0Q2F0YWxvZ0F0dHJpYnV0ZShuYW1lKS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2F0YWxvZyBhdHRyaWJ1dGUgd2l0aCBuYW1lICciICsgbmFtZSArICInIGFscmVhZHkgZXhpc3RzLiIpOworCQl9CisKKwkJQ2F0YWxvZ0F0dHJpYnV0ZSBjYXRhbG9nQXR0cmlidXRlID0gbmV3IENhdGFsb2dBdHRyaWJ1dGUoCisJCQkJY3JlYXRlQ29yZShDYXRhbG9nQXR0cmlidXRlLmNsYXNzLCBjYXRhbG9nQ29tcG9uZW50LmdldENvbnRleHRUeXBlKCkpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShjYXRhbG9nQXR0cmlidXRlKS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChjYXRhbG9nQ29tcG9uZW50KTsKKwkJZ2V0Q29yZShjYXRhbG9nQ29tcG9uZW50KS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKGNhdGFsb2dBdHRyaWJ1dGUpOworCisJCS8vIHByb3BlcnRpZXMKKwkJY2F0YWxvZ0F0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOworCQljYXRhbG9nQXR0cmlidXRlLnNldEVudW1lcmF0aW9uT2JqKGVudW1lcmF0aW9uT2JqKTsKKwkJY2F0YWxvZ0F0dHJpYnV0ZS5zZXRTb3J0SW5kZXgobmV4dEluZGV4KGNhdGFsb2dDb21wb25lbnQuZ2V0Q2F0YWxvZ0F0dHJpYnV0ZXMoKSkpOworCisJCXJldHVybiBjYXRhbG9nQXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IGZvciBnaXZlbiB7QGxpbmsgQ2F0YWxvZ1NlbnNvcn0uIFRoZQorCSAqIHtAbGluayBWYWx1ZVR5cGV9IG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWtlIGluCisJICoge0BsaW5rICNjcmVhdGVDYXRhbG9nQXR0cmlidXRlKFN0cmluZywgVmFsdWVUeXBlLCBDYXRhbG9nQ29tcG9uZW50KX06CisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfS4KKwkgKiBAcGFyYW0gdmFsdWVUeXBlICAgICBUaGUge0Bjb2RlIFZhbHVlVHlwZX0uCisJICogQHBhcmFtIGNhdGFsb2dTZW5zb3IgVGhlIHBhcmVudCB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2Ugb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYWxsb3dlZCBvciBnaXZlbiB7QGNvZGUgVmFsdWVUeXBlfSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQuCisJICovCisJcHVibGljIENhdGFsb2dBdHRyaWJ1dGUgY3JlYXRlQ2F0YWxvZ1NlbnNvckF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgVmFsdWVUeXBlPD8+IHZhbHVlVHlwZSwKKwkJCUNhdGFsb2dTZW5zb3IgY2F0YWxvZ1NlbnNvcikgeworCQl2YWxpZGF0ZUNhdGFsb2dOYW1lKG5hbWUsIHRydWUpOworCisJCWlmIChjYXRhbG9nU2Vuc29yLmdldENhdGFsb2dBdHRyaWJ1dGUobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhdGFsb2dTZW5zb3IgYXR0cmlidXRlIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfSBlbHNlIGlmICh2YWx1ZVR5cGUuaXNFbnVtZXJhdGlvblR5cGUoKSB8fCB2YWx1ZVR5cGUuaXNCeXRlU3RyZWFtVHlwZSgpIHx8IHZhbHVlVHlwZS5pc1Vua25vd24oKQorCQkJCXx8IHZhbHVlVHlwZS5pc0Jsb2IoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgdHlwZSAnIiArIHZhbHVlVHlwZSArICInIGlzIG5vdCBhbGxvd2VkLiIpOworCQl9CisKKwkJQ2F0YWxvZ0F0dHJpYnV0ZSBjYXRhbG9nQXR0cmlidXRlID0gbmV3IENhdGFsb2dBdHRyaWJ1dGUoY3JlYXRlQ29yZShDYXRhbG9nQXR0cmlidXRlLmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUoY2F0YWxvZ0F0dHJpYnV0ZSkuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQoY2F0YWxvZ1NlbnNvcik7CisJCWdldENvcmUoY2F0YWxvZ1NlbnNvcikuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZChjYXRhbG9nQXR0cmlidXRlKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCWNhdGFsb2dBdHRyaWJ1dGUuc2V0TmFtZShuYW1lKTsKKwkJY2F0YWxvZ0F0dHJpYnV0ZS5zZXRWYWx1ZVR5cGUodmFsdWVUeXBlKTsKKwkJY2F0YWxvZ0F0dHJpYnV0ZS5zZXRTb3J0SW5kZXgobmV4dEluZGV4KGNhdGFsb2dTZW5zb3IuZ2V0Q2F0YWxvZ0F0dHJpYnV0ZXMoKSkpOworCisJCXJldHVybiBjYXRhbG9nQXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENhdGFsb2dTZW5zb3J9IGZvciBnaXZlbiB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn0uCisJICogQHBhcmFtIGVudW1lcmF0aW9uT2JqZWN0IFRoZSBlbnVtZXJhdGlvbi4KKwkgKiBAcGFyYW0gY2F0YWxvZ0NvbXBvbmVudCAgVGhlIHBhcmVudCB7QGNvZGUgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2Ugb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYWxsb3dlZAorCSAqLworCXB1YmxpYyBDYXRhbG9nU2Vuc29yIGNyZWF0ZUNhdGFsb2dTZW5zb3IoU3RyaW5nIG5hbWUsIENhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCkgeworCQl2YWxpZGF0ZUNhdGFsb2dOYW1lKG5hbWUsIGZhbHNlKTsKKworCQlpZiAoIWNhdGFsb2dDb21wb25lbnQuZ2V0Q29udGV4dFR5cGUoKS5pc1Rlc3RFcXVpcG1lbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2F0YWxvZyBjb21wb25lbnQgaXMgbm90IG9mIHR5cGUgJ1RFU1RFUVVJUE1FTlQnIik7CisJCX0gZWxzZSBpZiAoY2F0YWxvZ0NvbXBvbmVudC5nZXRDYXRhbG9nU2Vuc29yKG5hbWUpLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYXRhbG9nIHNlbnNvciB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlDYXRhbG9nU2Vuc29yIGNhdGFsb2dTZW5zb3IgPSBuZXcgQ2F0YWxvZ1NlbnNvcihjcmVhdGVDb3JlKENhdGFsb2dTZW5zb3IuY2xhc3MpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0UGVybWFuZW50U3RvcmUoY2F0YWxvZ1NlbnNvcikuc2V0KGNhdGFsb2dDb21wb25lbnQpOworCQlnZXRDaGlsZHJlblN0b3JlKGNhdGFsb2dDb21wb25lbnQpLmFkZChjYXRhbG9nU2Vuc29yKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCWNhdGFsb2dTZW5zb3Iuc2V0TmFtZShuYW1lKTsKKwkJY2F0YWxvZ1NlbnNvci5zZXREYXRlQ3JlYXRlZChMb2NhbERhdGVUaW1lLm5vdygpKTsKKworCQlyZXR1cm4gY2F0YWxvZ1NlbnNvcjsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZW1wbGF0ZVJvb3R9IHdpdGggZ2l2ZW4ge0BsaW5rIENvbnRleHRUeXBlfSBhbmQgbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBUaGUge0Bjb2RlIENvbnRleHRUeXBlfS4KKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVSb290fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZVJvb3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZW1wbGF0ZVJvb3QgY3JlYXRlVGVtcGxhdGVSb290KENvbnRleHRUeXBlIGNvbnRleHRUeXBlLCBTdHJpbmcgbmFtZSkgeworCQlUZW1wbGF0ZVJvb3QgdGVtcGxhdGVSb290ID0gbmV3IFRlbXBsYXRlUm9vdChjcmVhdGVDb3JlKFRlbXBsYXRlUm9vdC5jbGFzcywgY29udGV4dFR5cGUpKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXRlbXBsYXRlUm9vdC5zZXROYW1lKG5hbWUpOworCQl0ZW1wbGF0ZVJvb3Quc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZS5ub3coKSk7CisJCXRlbXBsYXRlUm9vdC5zZXRWZXJzaW9uU3RhdGUoVmVyc2lvblN0YXRlLkVESVRBQkxFKTsKKwkJdGVtcGxhdGVSb290LnNldFZlcnNpb24oSW50ZWdlci52YWx1ZU9mKDEpKTsKKworCQlyZXR1cm4gdGVtcGxhdGVSb290OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlbXBsYXRlQ29tcG9uZW50fSBmb3IgZ2l2ZW4ge0BsaW5rIFRlbXBsYXRlUm9vdH0gdXNpbmcKKwkgKiBnaXZlbiB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0uCisJICogQHBhcmFtIHRlbXBsYXRlUm9vdCAgICAgVGhlIHBhcmVudCB7QGNvZGUgVGVtcGxhdGVSb290fS4KKwkgKiBAcGFyYW0gY2F0YWxvZ0NvbXBvbmVudCBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVDb21wb25lbnR9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB7QGNvZGUgQ29udGV4dFR5cGV9IG9mIHtAY29kZQorCSAqIAkJVGVtcGxhdGVSb290fSAgICAgICAgICAgIGFuZCB7QGNvZGUgQ2F0YWxvZ0NvbXBvbmVudH0gZG8gbm90IG1hdGNoIG9yCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGluIHVzZS4KKwkgKi8KKwlwdWJsaWMgVGVtcGxhdGVDb21wb25lbnQgY3JlYXRlVGVtcGxhdGVDb21wb25lbnQoU3RyaW5nIG5hbWUsIFRlbXBsYXRlUm9vdCB0ZW1wbGF0ZVJvb3QsCisJCQlDYXRhbG9nQ29tcG9uZW50IGNhdGFsb2dDb21wb25lbnQpIHsKKwkJaWYgKCF0ZW1wbGF0ZVJvb3QuZ2V0Q29udGV4dFR5cGUoKS5lcXVhbHMoY2F0YWxvZ0NvbXBvbmVudC5nZXRDb250ZXh0VHlwZSgpKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udGV4dCB0eXBlIG9mIHRlbXBsYXRlIHJvb3QgYW5kIGNhdGFsb2cgY29tcG9uZW50IGRvIG5vdCBtYXRjaC4iKTsKKwkJfSBlbHNlIGlmICh0ZW1wbGF0ZVJvb3QuZ2V0VGVtcGxhdGVDb21wb25lbnQobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlbXBsYXRlIGNvbXBvbmVudCB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlUZW1wbGF0ZUNvbXBvbmVudCB0ZW1wbGF0ZUNvbXBvbmVudCA9IG5ldyBUZW1wbGF0ZUNvbXBvbmVudCgKKwkJCQljcmVhdGVDb3JlKFRlbXBsYXRlQ29tcG9uZW50LmNsYXNzLCB0ZW1wbGF0ZVJvb3QuZ2V0Q29udGV4dFR5cGUoKSkpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHRlbXBsYXRlQ29tcG9uZW50KS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldCh0ZW1wbGF0ZVJvb3QpOworCQlnZXRDb3JlKHRlbXBsYXRlQ29tcG9uZW50KS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQoY2F0YWxvZ0NvbXBvbmVudCk7CisJCWdldENvcmUodGVtcGxhdGVSb290KS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKHRlbXBsYXRlQ29tcG9uZW50KTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXRlbXBsYXRlQ29tcG9uZW50LnNldE5hbWUobmFtZSk7CisJCXRlbXBsYXRlQ29tcG9uZW50LnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7CisJCXRlbXBsYXRlQ29tcG9uZW50LnNldERlZmF1bHRBY3RpdmUoQm9vbGVhbi5UUlVFKTsKKwkJdGVtcGxhdGVDb21wb25lbnQuc2V0U2VyaWVzQ29uc3RhbnQoQm9vbGVhbi5UUlVFKTsKKwkJdGVtcGxhdGVDb21wb25lbnQuc2V0U29ydEluZGV4KG5leHRJbmRleCh0ZW1wbGF0ZVJvb3QuZ2V0VGVtcGxhdGVDb21wb25lbnRzKCkpKTsKKworCQkvLyBjcmVhdGUgdGVtcGxhdGUgYXR0cmlidXRlcworCQljYXRhbG9nQ29tcG9uZW50LmdldENhdGFsb2dBdHRyaWJ1dGVzKCkuZm9yRWFjaChjYSAtPiBjcmVhdGVUZW1wbGF0ZUF0dHJpYnV0ZShjYS5nZXROYW1lKCksIHRlbXBsYXRlQ29tcG9uZW50KSk7CisKKwkJcmV0dXJuIHRlbXBsYXRlQ29tcG9uZW50OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlbXBsYXRlQ29tcG9uZW50fSBmb3IgZ2l2ZW4ge0BsaW5rIFRlbXBsYXRlQ29tcG9uZW50fQorCSAqIHVzaW5nIGdpdmVuIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKiBAcGFyYW0gcGFydGVudENvbXBvbmVudFRlbXBsYXRlIFRoZSBwYXJlbnQge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKiBAcGFyYW0gY2F0YWxvZ0NvbXBvbmVudCAgICAgICAgIFRoZSBhc3NvY2lhdGVkIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHtAY29kZSBDb250ZXh0VHlwZX0gb2Yge0Bjb2RlCisJICogCQlUZW1wbGF0ZUNvbXBvbmVudH0gICAgICAgYW5kIHtAY29kZSBDYXRhbG9nQ29tcG9uZW50fSBkbyBub3QgbWF0Y2ggb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLgorCSAqLworCXB1YmxpYyBUZW1wbGF0ZUNvbXBvbmVudCBjcmVhdGVUZW1wbGF0ZUNvbXBvbmVudChTdHJpbmcgbmFtZSwgVGVtcGxhdGVDb21wb25lbnQgcGFydGVudENvbXBvbmVudFRlbXBsYXRlLAorCQkJQ2F0YWxvZ0NvbXBvbmVudCBjYXRhbG9nQ29tcG9uZW50KSB7CisJCVRlbXBsYXRlUm9vdCB0ZW1wbGF0ZVJvb3QgPSBwYXJ0ZW50Q29tcG9uZW50VGVtcGxhdGUuZ2V0VGVtcGxhdGVSb290KCk7CisJCWlmICghdGVtcGxhdGVSb290LmdldENvbnRleHRUeXBlKCkuZXF1YWxzKGNhdGFsb2dDb21wb25lbnQuZ2V0Q29udGV4dFR5cGUoKSkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRleHQgdHlwZSBvZiB0ZW1wbGF0ZSByb290IGFuZCBjYXRhbG9nIGNvbXBvbmVudCBkbyBub3QgbWF0Y2guIik7CisJCX0gZWxzZSBpZiAodGVtcGxhdGVSb290LmdldFRlbXBsYXRlQ29tcG9uZW50KG5hbWUpLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZW1wbGF0ZSBjb21wb25lbnQgd2l0aCBuYW1lICciICsgbmFtZSArICInIGFscmVhZHkgZXhpc3RzLiIpOworCQl9CisKKwkJVGVtcGxhdGVDb21wb25lbnQgdGVtcGxhdGVDb21wb25lbnQgPSBuZXcgVGVtcGxhdGVDb21wb25lbnQoCisJCQkJY3JlYXRlQ29yZShUZW1wbGF0ZUNvbXBvbmVudC5jbGFzcywgdGVtcGxhdGVSb290LmdldENvbnRleHRUeXBlKCkpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZSh0ZW1wbGF0ZUNvbXBvbmVudCkuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQocGFydGVudENvbXBvbmVudFRlbXBsYXRlKTsKKwkJZ2V0Q29yZSh0ZW1wbGF0ZUNvbXBvbmVudCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KGNhdGFsb2dDb21wb25lbnQpOworCQlnZXRDb3JlKHBhcnRlbnRDb21wb25lbnRUZW1wbGF0ZSkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZCh0ZW1wbGF0ZUNvbXBvbmVudCk7CisKKwkJLy8gcHJvcGVydGllcworCQl0ZW1wbGF0ZUNvbXBvbmVudC5zZXROYW1lKG5hbWUpOworCQl0ZW1wbGF0ZUNvbXBvbmVudC5zZXRPcHRpb25hbChCb29sZWFuLlRSVUUpOworCQl0ZW1wbGF0ZUNvbXBvbmVudC5zZXREZWZhdWx0QWN0aXZlKEJvb2xlYW4uVFJVRSk7CisJCXRlbXBsYXRlQ29tcG9uZW50LnNldFNlcmllc0NvbnN0YW50KEJvb2xlYW4uVFJVRSk7CisJCXRlbXBsYXRlQ29tcG9uZW50LnNldFNvcnRJbmRleChuZXh0SW5kZXgocGFydGVudENvbXBvbmVudFRlbXBsYXRlLmdldFRlbXBsYXRlQ29tcG9uZW50cygpKSk7CisKKwkJLy8gY3JlYXRlIHRlbXBsYXRlIGF0dHJpYnV0ZXMKKwkJY2F0YWxvZ0NvbXBvbmVudC5nZXRDYXRhbG9nQXR0cmlidXRlcygpLmZvckVhY2goY2EgLT4gY3JlYXRlVGVtcGxhdGVBdHRyaWJ1dGUoY2EuZ2V0TmFtZSgpLCB0ZW1wbGF0ZUNvbXBvbmVudCkpOworCisJCXJldHVybiB0ZW1wbGF0ZUNvbXBvbmVudDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZW1wbGF0ZUF0dHJpYnV0ZX0gZm9yIGdpdmVuIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZUNvbXBvbmVudCBUaGUgcGFyZW50IHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLgorCSAqLworCXB1YmxpYyBUZW1wbGF0ZUF0dHJpYnV0ZSBjcmVhdGVUZW1wbGF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgVGVtcGxhdGVDb21wb25lbnQgdGVtcGxhdGVDb21wb25lbnQpIHsKKwkJaWYgKHRlbXBsYXRlQ29tcG9uZW50LmdldFRlbXBsYXRlQXR0cmlidXRlKG5hbWUpLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZW1wbGF0ZSBhdHRyaWJ1dGUgd2l0aCBuYW1lICciICsgbmFtZSArICInIGFscmVhZHkgZXhpc3RzLiIpOworCQl9CisKKwkJQ2F0YWxvZ0NvbXBvbmVudCBjYXRhbG9nQ29tcG9uZW50ID0gdGVtcGxhdGVDb21wb25lbnQuZ2V0Q2F0YWxvZ0NvbXBvbmVudCgpOworCQlPcHRpb25hbDxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlID0gY2F0YWxvZ0NvbXBvbmVudC5nZXRDYXRhbG9nQXR0cmlidXRlKG5hbWUpOworCQlpZiAoY2F0YWxvZ0F0dHJpYnV0ZS5pc1ByZXNlbnQoKSkgeworCQkJVGVtcGxhdGVBdHRyaWJ1dGUgdGVtcGxhdGVBdHRyaWJ1dGUgPSBuZXcgVGVtcGxhdGVBdHRyaWJ1dGUoCisJCQkJCWNyZWF0ZUNvcmUoVGVtcGxhdGVBdHRyaWJ1dGUuY2xhc3MsIGNhdGFsb2dDb21wb25lbnQuZ2V0Q29udGV4dFR5cGUoKSkpOworCisJCQkvLyByZWxhdGlvbnMKKwkJCWdldENvcmUodGVtcGxhdGVBdHRyaWJ1dGUpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KHRlbXBsYXRlQ29tcG9uZW50KTsKKwkJCWdldENvcmUodGVtcGxhdGVBdHRyaWJ1dGUpLmdldE11dGFibGVTdG9yZSgpLnNldChjYXRhbG9nQXR0cmlidXRlLmdldCgpKTsKKwkJCWdldENvcmUodGVtcGxhdGVDb21wb25lbnQpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQodGVtcGxhdGVBdHRyaWJ1dGUpOworCisJCQkvLyBwcm9wZXJ0aWVzCisJCQl0ZW1wbGF0ZUF0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOworCQkJdGVtcGxhdGVBdHRyaWJ1dGUuc2V0VmFsdWVSZWFkT25seShCb29sZWFuLkZBTFNFKTsKKwkJCXRlbXBsYXRlQXR0cmlidXRlLnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7CisKKwkJCXJldHVybiB0ZW1wbGF0ZUF0dHJpYnV0ZTsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhdGFsb2cgYXR0cmlidXRlIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBkb2VzIG5vdCBleGlzdHMuIik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVtcGxhdGVTZW5zb3J9IGZvciBnaXZlbiB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9CisJICogYmFzZWQgb24gdGhlIGdpdmVuIHtAbGluayBDYXRhbG9nU2Vuc29yfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZUF0dHJpYnV0ZX0uCisJICogQHBhcmFtIHRlbXBsYXRlQ29tcG9uZW50IFRoZSBwYXJlbnQge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKiBAcGFyYW0gY2F0YWxvZ1NlbnNvciAgICAgcmVmZXJlbmNlIENhdGFsb2dTZW5zb3IKKwkgKiBAcGFyYW0gcXVhbnRpdHkgICAgICAgICAgUXVhbnRpdHkgdG8gY3JlYXRlIHtAbGluayBUZW1wbGF0ZVNlbnNvcn0gZm9yCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVTZW5zb3J9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLgorCSAqLworCXB1YmxpYyBUZW1wbGF0ZVNlbnNvciBjcmVhdGVUZW1wbGF0ZVNlbnNvcihTdHJpbmcgbmFtZSwgVGVtcGxhdGVDb21wb25lbnQgdGVtcGxhdGVDb21wb25lbnQsCisJCQlDYXRhbG9nU2Vuc29yIGNhdGFsb2dTZW5zb3IsIFF1YW50aXR5IHF1YW50aXR5KSB7CisJCWlmICh0ZW1wbGF0ZUNvbXBvbmVudC5nZXRUZW1wbGF0ZVNlbnNvcihuYW1lKS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVtcGxhdGUgc2Vuc29yIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfQorCisJCWlmIChjYXRhbG9nU2Vuc29yICE9IG51bGwpIHsKKwkJCVRlbXBsYXRlU2Vuc29yIHRlbXBsYXRlU2Vuc29yID0gbmV3IFRlbXBsYXRlU2Vuc29yKGNyZWF0ZUNvcmUoVGVtcGxhdGVTZW5zb3IuY2xhc3MpKTsKKwkJCS8vIGNyZWF0ZSBhbGwgaW1wbGljaXQgVGVtcGxhdGVBdHRyaWJ1dGVzCisJCQlmb3IgKENhdGFsb2dBdHRyaWJ1dGUgY2F0QXR0ciA6IGNhdGFsb2dTZW5zb3IuZ2V0Q2F0YWxvZ0F0dHJpYnV0ZXMoKSkgeworCQkJCVRlbXBsYXRlQXR0cmlidXRlIHRwbEF0dHIgPSBuZXcgVGVtcGxhdGVBdHRyaWJ1dGUoY3JlYXRlQ29yZShUZW1wbGF0ZUF0dHJpYnV0ZS5jbGFzcykpOworCQkJCXRwbEF0dHIuc2V0TmFtZShjYXRBdHRyLmdldE5hbWUoKSk7CisJCQkJdHBsQXR0ci5zZXRWYWx1ZVJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOworCQkJCXRwbEF0dHIuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKKwkJCQlnZXRQZXJtYW5lbnRTdG9yZSh0cGxBdHRyKS5zZXQodGVtcGxhdGVTZW5zb3IpOworCQkJCWdldE11dGFibGVTdG9yZSh0cGxBdHRyKS5zZXQoY2F0QXR0cik7CisJCQkJZ2V0Q29yZSh0ZW1wbGF0ZVNlbnNvcikuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZCh0cGxBdHRyKTsKKwkJCX0KKworCQkJLy8gcmVsYXRpb25zCisJCQlnZXRQZXJtYW5lbnRTdG9yZSh0ZW1wbGF0ZVNlbnNvcikuc2V0KHRlbXBsYXRlQ29tcG9uZW50KTsKKwkJCWdldE11dGFibGVTdG9yZSh0ZW1wbGF0ZVNlbnNvcikuc2V0KGNhdGFsb2dTZW5zb3IpOworCQkJZ2V0TXV0YWJsZVN0b3JlKHRlbXBsYXRlU2Vuc29yKS5zZXQocXVhbnRpdHkpOworCQkJZ2V0Q2hpbGRyZW5TdG9yZSh0ZW1wbGF0ZUNvbXBvbmVudCkuYWRkKHRlbXBsYXRlU2Vuc29yKTsKKworCQkJLy8gcHJvcGVydGllcworCQkJdGVtcGxhdGVTZW5zb3Iuc2V0TmFtZShuYW1lKTsKKwkJCXRlbXBsYXRlU2Vuc29yLnNldERlZmF1bHRBY3RpdmUodHJ1ZSk7CisJCQl0ZW1wbGF0ZVNlbnNvci5zZXRPcHRpb25hbChCb29sZWFuLlRSVUUpOworCisJCQlyZXR1cm4gdGVtcGxhdGVTZW5zb3I7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYXRhbG9nIGF0dHJpYnV0ZSB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgZG9lcyBub3QgZXhpc3RzLiIpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9LgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVUZXN0U3RlcH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVUZXN0U3RlcH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlVGVzdFN0ZXAgY3JlYXRlVGVtcGxhdGVUZXN0U3RlcChTdHJpbmcgbmFtZSkgeworCQlUZW1wbGF0ZVRlc3RTdGVwIHRlbXBsYXRlVGVzdFN0ZXAgPSBuZXcgVGVtcGxhdGVUZXN0U3RlcChjcmVhdGVDb3JlKFRlbXBsYXRlVGVzdFN0ZXAuY2xhc3MpKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXRlbXBsYXRlVGVzdFN0ZXAuc2V0TmFtZShuYW1lKTsKKwkJdGVtcGxhdGVUZXN0U3RlcC5zZXREYXRlQ3JlYXRlZChMb2NhbERhdGVUaW1lLm5vdygpKTsKKwkJdGVtcGxhdGVUZXN0U3RlcC5zZXRWZXJzaW9uU3RhdGUoVmVyc2lvblN0YXRlLkVESVRBQkxFKTsKKwkJdGVtcGxhdGVUZXN0U3RlcC5zZXRWZXJzaW9uKEludGVnZXIudmFsdWVPZigxKSk7CisKKwkJcmV0dXJuIHRlbXBsYXRlVGVzdFN0ZXA7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVtcGxhdGVUZXN0fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlbXBsYXRlVGVzdH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVUZXN0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVtcGxhdGVUZXN0IGNyZWF0ZVRlbXBsYXRlVGVzdChTdHJpbmcgbmFtZSkgeworCQlUZW1wbGF0ZVRlc3QgdGVtcGxhdGVUZXN0ID0gbmV3IFRlbXBsYXRlVGVzdChjcmVhdGVDb3JlKFRlbXBsYXRlVGVzdC5jbGFzcykpOworCisJCS8vIHByb3BlcnRpZXMKKwkJdGVtcGxhdGVUZXN0LnNldE5hbWUobmFtZSk7CisJCXRlbXBsYXRlVGVzdC5zZXREYXRlQ3JlYXRlZChMb2NhbERhdGVUaW1lLm5vdygpKTsKKwkJdGVtcGxhdGVUZXN0LnNldFZlcnNpb24oSW50ZWdlci52YWx1ZU9mKDEpKTsKKwkJdGVtcGxhdGVUZXN0LnNldFZlcnNpb25TdGF0ZShWZXJzaW9uU3RhdGUuRURJVEFCTEUpOworCisJCXJldHVybiB0ZW1wbGF0ZVRlc3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfSBmb3IgZ2l2ZW4ge0BsaW5rIFRlbXBsYXRlVGVzdH0KKwkgKiB1c2luZyBnaXZlbiB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2V9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVRlc3QgICAgIFRoZSBwYXJlbnQge0BsaW5rIFRlbXBsYXRlVGVzdH0uCisJICogQHBhcmFtIHRlbXBsYXRlVGVzdFN0ZXAgVGhlIHJlbGF0ZWQge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZSBjcmVhdGVUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UoU3RyaW5nIG5hbWUsIFRlbXBsYXRlVGVzdCB0ZW1wbGF0ZVRlc3QsCisJCQlUZW1wbGF0ZVRlc3RTdGVwIHRlbXBsYXRlVGVzdFN0ZXApIHsKKwkJaWYgKHRlbXBsYXRlVGVzdC5nZXRUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlbXBsYXRlIHRlc3Qgc3RlcCB1c2FnZSB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UgdGVtcGxhdGVUZXN0U3RlcFVzYWdlID0gbmV3IFRlbXBsYXRlVGVzdFN0ZXBVc2FnZSgKKwkJCQljcmVhdGVDb3JlKFRlbXBsYXRlVGVzdFN0ZXBVc2FnZS5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHRlbXBsYXRlVGVzdFN0ZXBVc2FnZSkuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQodGVtcGxhdGVUZXN0KTsKKwkJZ2V0Q29yZSh0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2UpLmdldE11dGFibGVTdG9yZSgpLnNldCh0ZW1wbGF0ZVRlc3RTdGVwKTsKKwkJZ2V0Q29yZSh0ZW1wbGF0ZVRlc3QpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQodGVtcGxhdGVUZXN0U3RlcFVzYWdlKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXRlbXBsYXRlVGVzdFN0ZXBVc2FnZS5zZXROYW1lKG5hbWUpOworCQl0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2Uuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKKwkJdGVtcGxhdGVUZXN0U3RlcFVzYWdlLnNldERlZmF1bHRBY3RpdmUoQm9vbGVhbi5UUlVFKTsKKwkJdGVtcGxhdGVUZXN0U3RlcFVzYWdlLnNldFNvcnRJbmRleChuZXh0SW5kZXgodGVtcGxhdGVUZXN0LmdldFRlbXBsYXRlVGVzdFN0ZXBVc2FnZXMoKSkpOworCisJCXJldHVybiB0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2U7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVmFsdWVMaXN0fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFZhbHVlTGlzdH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVmFsdWVMaXN0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVmFsdWVMaXN0IGNyZWF0ZVZhbHVlTGlzdChTdHJpbmcgbmFtZSkgeworCQlWYWx1ZUxpc3QgdmFsdWVMaXN0ID0gbmV3IFZhbHVlTGlzdChjcmVhdGVDb3JlKFZhbHVlTGlzdC5jbGFzcykpOworCisJCS8vIHByb3BlcnRpZXMKKwkJdmFsdWVMaXN0LnNldE5hbWUobmFtZSk7CisJCXZhbHVlTGlzdC5zZXREYXRlQ3JlYXRlZChMb2NhbERhdGVUaW1lLm5vdygpKTsKKworCQlyZXR1cm4gdmFsdWVMaXN0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFZhbHVlTGlzdFZhbHVlfSBmb3IgZ2l2ZW4ge0BsaW5rIFZhbHVlTGlzdH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFZhbHVlTGlzdFZhbHVlfS4KKwkgKiBAcGFyYW0gdmFsdWVMaXN0IFRoZSBwYXJlbnQge0Bjb2RlIFZhbHVlTGlzdH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVmFsdWVMaXN0VmFsdWV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBWYWx1ZUxpc3RWYWx1ZSBjcmVhdGVWYWx1ZUxpc3RWYWx1ZShTdHJpbmcgbmFtZSwgVmFsdWVMaXN0IHZhbHVlTGlzdCkgeworCQlpZiAodmFsdWVMaXN0LmdldFZhbHVlTGlzdFZhbHVlKG5hbWUpLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBsaXN0IHZhbHVlIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfQorCisJCVZhbHVlTGlzdFZhbHVlIHZhbHVlTGlzdFZhbHVlID0gbmV3IFZhbHVlTGlzdFZhbHVlKGNyZWF0ZUNvcmUoVmFsdWVMaXN0VmFsdWUuY2xhc3MpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZSh2YWx1ZUxpc3RWYWx1ZSkuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQodmFsdWVMaXN0KTsKKwkJZ2V0Q29yZSh2YWx1ZUxpc3QpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQodmFsdWVMaXN0VmFsdWUpOworCisJCS8vIHByb3BlcnRpZXMKKwkJdmFsdWVMaXN0VmFsdWUuc2V0TmFtZShuYW1lKTsKKwkJdmFsdWVMaXN0VmFsdWUuc2V0U29ydEluZGV4KG5leHRJbmRleCh2YWx1ZUxpc3QuZ2V0VmFsdWVMaXN0VmFsdWVzKCkpKTsKKworCQkvLyB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBieSB0aGUgcHVibGljIEFQSSBhbmQgaXMgbm90IGFsbG93ZWQgdG8gYmUKKwkJLy8gbW9kaWZpZWQhCisJCXZhbHVlTGlzdFZhbHVlLmdldFZhbHVlKFZhbHVlTGlzdFZhbHVlLkFUVFJfU0NBTEFSX1RZUEUpLnNldChTY2FsYXJUeXBlLlNUUklORyk7CisKKwkJcmV0dXJuIHZhbHVlTGlzdFZhbHVlOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENsYXNzaWZpY2F0aW9ufSBmb3IgZ2l2ZW4ge0BsaW5rIERvbWFpbn0sCisJICoge0BsaW5rIFByb2plY3REb21haW59IGFuZCB7QGxpbmsgU3RhdHVzfS4KKwkgKiAKKwkgKiBAcGFyYW0gZG9tYWluICAgICAgICBUaGUge0BsaW5rIERvbWFpbn0gZm9yIHRoZSB7QGxpbmsgQ2xhc3NpZmljYXRpb259CisJICogQHBhcmFtIHByb2plY3REb21haW4gVGhlIHtAbGluayBQcm9qZWN0RG9tYWlufSBmb3IgdGhlIHtAbGluayBDbGFzc2lmaWNhdGlvbn0KKwkgKiBAcGFyYW0gc3RhdHVzICAgICAgICBUaGUge0BsaW5rIFN0YXR1c30gZm9yIHRoZSB7QGxpbmsgQ2xhc3NpZmljYXRpb259CisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGxpbmsgQ2xhc3NpZmljYXRpb259IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDbGFzc2lmaWNhdGlvbiBjcmVhdGVDbGFzc2lmaWNhdGlvbihEb21haW4gZG9tYWluLCBQcm9qZWN0RG9tYWluIHByb2plY3REb21haW4sIFN0YXR1cyBzdGF0dXMpIHsKKwkJU3RyaW5nIG5hbWUgPSBTdHJpbmcuZm9ybWF0KCJQcm9qRG9tYWluSWRfJXMuRG9tYWluSWRfJXMuU3RhdHVzSWRfJXMiLCBwcm9qZWN0RG9tYWluLmdldElEKCksIGRvbWFpbi5nZXRJRCgpLAorCQkJCXN0YXR1cy5nZXRJRCgpKTsKKwkJcmV0dXJuIGNyZWF0ZUNsYXNzaWZpY2F0aW9uKG5hbWUsIHN0YXR1cywgcHJvamVjdERvbWFpbiwgZG9tYWluKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDbGFzc2lmaWNhdGlvbn0gZm9yIGdpdmVuIHtAbGluayBEb21haW59LAorCSAqIHtAbGluayBQcm9qZWN0RG9tYWlufSBhbmQge0BsaW5rIFN0YXR1c30uCisJICogCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgVGhlIG5hbWUgZm9yIHRoZSB7QGxpbmsgQ2xhc3NpZmljYXRpb259CisJICogQHBhcmFtIHN0YXR1cyAgICAgICAgVGhlIHtAbGluayBTdGF0dXN9IGZvciB0aGUge0BsaW5rIENsYXNzaWZpY2F0aW9ufQorCSAqIEBwYXJhbSBwcm9qZWN0RG9tYWluIFRoZSB7QGxpbmsgUHJvamVjdERvbWFpbn0gZm9yIHRoZSB7QGxpbmsgQ2xhc3NpZmljYXRpb259CisJICogQHBhcmFtIGRvbWFpbiAgICAgICAgVGhlIHtAbGluayBEb21haW59IGZvciB0aGUge0BsaW5rIENsYXNzaWZpY2F0aW9ufQorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0BsaW5rIENsYXNzaWZpY2F0aW9ufSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ2xhc3NpZmljYXRpb24gY3JlYXRlQ2xhc3NpZmljYXRpb24oU3RyaW5nIG5hbWUsIFN0YXR1cyBzdGF0dXMsIFByb2plY3REb21haW4gcHJvamVjdERvbWFpbiwgRG9tYWluIGRvbWFpbikgeworCQlDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbiA9IG5ldyBDbGFzc2lmaWNhdGlvbihjcmVhdGVDb3JlKENsYXNzaWZpY2F0aW9uLmNsYXNzKSk7CisKKwkJZ2V0TXV0YWJsZVN0b3JlKGNsYXNzaWZpY2F0aW9uKS5zZXQoc3RhdHVzKTsKKwkJZ2V0TXV0YWJsZVN0b3JlKGNsYXNzaWZpY2F0aW9uKS5zZXQocHJvamVjdERvbWFpbik7CisJCWdldE11dGFibGVTdG9yZShjbGFzc2lmaWNhdGlvbikuc2V0KGRvbWFpbik7CisKKwkJLy8gcHJvcGVydGllcworCQljbGFzc2lmaWNhdGlvbi5zZXROYW1lKG5hbWUpOworCisJCXJldHVybiBjbGFzc2lmaWNhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBQcm9qZWN0RG9tYWlufSB3aXRoIGdpdmVuIG5hbWUuCisJICogCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0BsaW5rIFByb2plY3REb21haW59CisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGxpbmsgUHJvamVjdERvbWFpbn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFByb2plY3REb21haW4gY3JlYXRlUHJvamVjdERvbWFpbihTdHJpbmcgbmFtZSkgeworCQlQcm9qZWN0RG9tYWluIHByb2plY3REb21haW4gPSBuZXcgUHJvamVjdERvbWFpbihjcmVhdGVDb3JlKFByb2plY3REb21haW4uY2xhc3MpKTsKKwkJLy8gcHJvcGVydGllcworCQlwcm9qZWN0RG9tYWluLnNldE5hbWUobmFtZSk7CisJCXJldHVybiBwcm9qZWN0RG9tYWluOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERvbWFpbn0gd2l0aCBnaXZlbiBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHtAbGluayBEb21haW59CisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGxpbmsgRG9tYWlufSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgRG9tYWluIGNyZWF0ZURvbWFpbihTdHJpbmcgbmFtZSkgeworCQlEb21haW4gZG9tYWluID0gbmV3IERvbWFpbihjcmVhdGVDb3JlKERvbWFpbi5jbGFzcykpOworCisJCS8vIHByb3BlcnRpZXMKKwkJZG9tYWluLnNldE5hbWUobmFtZSk7CisJCXJldHVybiBkb21haW47CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByb3RlY3RlZCBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdH0gZm9yIGdpdmVuIHtAbGluayBQb29sfSB1c2luZyBnaXZlbgorCSAqIHtAbGluayBUZW1wbGF0ZVRlc3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBwb29sICAgICAgICAgICBUaGUgcGFyZW50IHtAY29kZSBQb29sfS4KKwkgKiBAcGFyYW0gc3RhdHVzVGVzdCAgICAgVGhlIHJlbGF0ZWQge0BsaW5rIFN0YXR1c30gb2YgdGhlIGNyZWF0ZWQge0Bjb2RlCisJICogCQlUZXN0fSAgICAgICAgIC4KKwkgKiBAcGFyYW0gc3RhdHVzVGVzdFN0ZXAgVGhlIHJlbGF0ZWQge0BsaW5rIFN0YXR1c30gb2YgdGhlIGNyZWF0ZWQge0Bjb2RlCisJICogCQlUZXN0U3RlcH0gICAgIC4KKwkgKiBAcGFyYW0gdGVtcGxhdGVUZXN0ICAgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgVGVzdH0gd2lsbCBiZSBkZXJpdmVkCisJICogICAgICAgICAgICAgICAgICAgICAgIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVzdH0gaXMgcmV0dXJuZWQuCisJICovCisJLy8gVE9ETyBtYWtlIGEgZGVjaXNpb246IHN0YXR1cyBpbiBvciBvdXQhCisJcHJvdGVjdGVkIFRlc3QgY3JlYXRlVGVzdChTdHJpbmcgbmFtZSwgUG9vbCBwb29sLCBTdGF0dXMgc3RhdHVzVGVzdCwgU3RhdHVzIHN0YXR1c1Rlc3RTdGVwLAorCQkJVGVtcGxhdGVUZXN0IHRlbXBsYXRlVGVzdCkgeworCQlUZXN0IHRlc3QgPSBjcmVhdGVUZXN0KG5hbWUsIHBvb2wsIHN0YXR1c1Rlc3QpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHRlc3QpLmdldE11dGFibGVTdG9yZSgpLnNldCh0ZW1wbGF0ZVRlc3QpOworCisJCS8vIGNyZWF0ZSBkZWZhdWx0IGFjdGl2ZSBhbmQgbWFuZGF0b3J5IHRlc3Qgc3RlcHMgYWNjb3JkaW5nIHRvIHRoZQorCQkvLyB0ZW1wbGF0ZQorCQl0ZW1wbGF0ZVRlc3QuZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlcygpLnN0cmVhbSgpLmZpbHRlcihUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UuSVNfSU1QTElDSVRfQ1JFQVRFKQorCQkJCS5tYXAoVGVtcGxhdGVUZXN0U3RlcFVzYWdlOjpnZXRUZW1wbGF0ZVRlc3RTdGVwKS5mb3JFYWNoKHRlbXBsYXRlVGVzdFN0ZXAgLT4geworCQkJCQljcmVhdGVUZXN0U3RlcCh0ZXN0LCBzdGF0dXNUZXN0U3RlcCwgdGVtcGxhdGVUZXN0U3RlcCk7CisJCQkJfSk7CisKKwkJcmV0dXJuIHRlc3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdH0gZm9yIGdpdmVuIHtAbGluayBQb29sfSB1c2luZyBnaXZlbiBuYW1lLAorCSAqIHtAbGluayBUZW1wbGF0ZVRlc3R9IGFuZCB7QGxpbmsgQ2xhc3NpZmljYXRpb259LgorCSAqIAorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZXN0fS4KKwkgKiBAcGFyYW0gcG9vbCAgICAgICAgICAgVGhlIHBhcmVudCB7QGNvZGUgUG9vbH0uCisJICogQHBhcmFtIHRlbXBsYXRlVGVzdCAgIFRoZSB0ZW1wbGF0ZSB0aGUgcmV0dXJuZWQge0Bjb2RlIFRlc3R9IHdpbGwgYmUgZGVyaXZlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICBmcm9tLgorCSAqIEBwYXJhbSBjbGFzc2lmaWNhdGlvbiBUaGUge0BsaW5rIENsYXNzaWZpY2F0aW9ufSBmb3IgdGhlIGNyZWF0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFRlc3R9LgorCSAqIEBwYXJhbSB3aXRoVGVzdFN0ZXBzICBJZiB0cnVlLCB7QGxpbmsgVGVzdFN0ZXB9cyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIGNvbmZpZ3VyZWQge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVzdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlc3QgY3JlYXRlVGVzdChTdHJpbmcgbmFtZSwgUG9vbCBwb29sLCBUZW1wbGF0ZVRlc3QgdGVtcGxhdGVUZXN0LCBDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbiwKKwkJCWJvb2xlYW4gd2l0aFRlc3RTdGVwcykgeworCQkvLyBUT0RPCisJCVRlc3QgdGVzdCA9IGNyZWF0ZVRlc3QobmFtZSwgcG9vbCk7CisKKwkJLy8gcmVsYXRpb25zCisJCWlmICh0ZW1wbGF0ZVRlc3QgIT0gbnVsbCkgeworCQkJZ2V0Q29yZSh0ZXN0KS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQodGVtcGxhdGVUZXN0KTsKKwkJfQorCQlnZXRDb3JlKHRlc3QpLmdldE11dGFibGVTdG9yZSgpLnNldChjbGFzc2lmaWNhdGlvbik7CisKKwkJaWYgKHdpdGhUZXN0U3RlcHMgJiYgdGVtcGxhdGVUZXN0ICE9IG51bGwpIHsKKwkJCS8vIGNyZWF0ZSBkZWZhdWx0IGFjdGl2ZSBhbmQgbWFuZGF0b3J5IHRlc3Qgc3RlcHMgYWNjb3JkaW5nIHRvIHRoZQorCQkJLy8gdGVtcGxhdGUKKwkJCXRlbXBsYXRlVGVzdC5nZXRUZW1wbGF0ZVRlc3RTdGVwVXNhZ2VzKCkuc3RyZWFtKCkuZmlsdGVyKFRlbXBsYXRlVGVzdFN0ZXBVc2FnZS5JU19JTVBMSUNJVF9DUkVBVEUpCisJCQkJCS5tYXAoVGVtcGxhdGVUZXN0U3RlcFVzYWdlOjpnZXRUZW1wbGF0ZVRlc3RTdGVwKS5mb3JFYWNoKHRlbXBsYXRlVGVzdFN0ZXAgLT4geworCQkJCQkJY3JlYXRlVGVzdFN0ZXAodGVzdCwgdGVtcGxhdGVUZXN0U3RlcCwgY2xhc3NpZmljYXRpb24pOworCQkJCQl9KTsKKwkJfQorCisJCXJldHVybiB0ZXN0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlc3RTdGVwfSBmb3IgZ2l2ZW4ge0BsaW5rIFRlc3R9IHVzaW5nIGdpdmVuCisJICoge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9IGFuZCB7QGxpbmsgQ2xhc3NpZmljYXRpb259LgorCSAqIAorCSAqIEBwYXJhbSB0ZXN0ICAgICAgICAgICAgIFRoZSBwYXJlbnQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVRlc3RTdGVwIFRoZSB0ZW1wbGF0ZSB0aGUgcmV0dXJuZWQge0Bjb2RlIFRlc3RTdGVwfSB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZCBmcm9tLgorCSAqIEBwYXJhbSBjbGFzc2lmaWNhdGlvbiAgIFRoZSB7QGxpbmsgQ2xhc3NpZmljYXRpb259IGZvciB0aGUgY3JlYXRlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBUZXN0U3RlcH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVzdFN0ZXB9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZXN0U3RlcCBjcmVhdGVUZXN0U3RlcChUZXN0IHRlc3QsIFRlbXBsYXRlVGVzdFN0ZXAgdGVtcGxhdGVUZXN0U3RlcCwgQ2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24pIHsKKwkJVGVzdFN0ZXAgdGVzdFN0ZXAgPSBjcmVhdGVUZXN0U3RlcCh0ZXN0LCB0ZW1wbGF0ZVRlc3RTdGVwKTsKKwkJZ2V0Q29yZSh0ZXN0U3RlcCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KGNsYXNzaWZpY2F0aW9uKTsKKwkJcmV0dXJuIHRlc3RTdGVwOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlc3RTdGVwfSBmb3IgZ2l2ZW4ge0BsaW5rIFRlc3R9IHVzaW5nIGdpdmVuCisJICoge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9IGFuZCB7QGxpbmsgQ2xhc3NpZmljYXRpb259LgorCSAqIAorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZXN0U3RlcH0uCisJICogQHBhcmFtIHRlc3QgICAgICAgICAgIFRoZSBwYXJlbnQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBjbGFzc2lmaWNhdGlvbiBUaGUge0BsaW5rIENsYXNzaWZpY2F0aW9ufSBmb3IgdGhlIGNyZWF0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFRlc3RTdGVwfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZXN0U3RlcH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlc3RTdGVwIGNyZWF0ZVRlc3RTdGVwKFN0cmluZyBuYW1lLCBUZXN0IHRlc3QsIENsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uKSB7CisJCVRlc3RTdGVwIHRlc3RTdGVwID0gY3JlYXRlVGVzdFN0ZXAobmFtZSwgdGVzdCk7CisJCWdldENvcmUodGVzdFN0ZXApLmdldE11dGFibGVTdG9yZSgpLnNldChjbGFzc2lmaWNhdGlvbik7CisJCXJldHVybiB0ZXN0U3RlcDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0U3RlcH0gZm9yIGdpdmVuIHtAbGluayBUZXN0fSB1c2luZyBnaXZlbiBuYW1lLAorCSAqIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfSBhbmQge0BsaW5rIENsYXNzaWZpY2F0aW9ufS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZXN0U3RlcH0uCisJICogQHBhcmFtIHRlc3QgICAgICAgICAgICAgVGhlIHBhcmVudCB7QGNvZGUgVGVzdH0uCisJICogQHBhcmFtIHRlbXBsYXRlVGVzdFN0ZXAgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgVGVzdFN0ZXB9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20uCisJICogQHBhcmFtIGNsYXNzaWZpY2F0aW9uICAgVGhlIHtAbGluayBDbGFzc2lmaWNhdGlvbn0gZm9yIHRoZSBjcmVhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFRlc3RTdGVwfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZXN0U3RlcH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlc3RTdGVwIGNyZWF0ZVRlc3RTdGVwKFN0cmluZyBuYW1lLCBUZXN0IHRlc3QsIFRlbXBsYXRlVGVzdFN0ZXAgdGVtcGxhdGVUZXN0U3RlcCwKKwkJCUNsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uKSB7CisJCVRlc3RTdGVwIHRlc3RTdGVwID0gY3JlYXRlVGVzdFN0ZXAodGVzdCwgdGVtcGxhdGVUZXN0U3RlcCk7CisJCWdldENvcmUodGVzdFN0ZXApLmdldE11dGFibGVTdG9yZSgpLnNldChjbGFzc2lmaWNhdGlvbik7CisJCXRlc3RTdGVwLnNldE5hbWUobmFtZSk7CisJCXJldHVybiB0ZXN0U3RlcDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0fSBmb3IgZ2l2ZW4ge0BsaW5rIFBvb2x9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZXN0fS4KKwkgKiBAcGFyYW0gcG9vbCAgIFRoZSBwYXJlbnQge0Bjb2RlIFBvb2x9LgorCSAqIEBwYXJhbSBzdGF0dXMgVGhlIHJlbGF0ZWQge0BsaW5rIFN0YXR1c30uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVzdH0gaXMgcmV0dXJuZWQuCisJICovCisJLy8gVE9ETyBtYWtlIGEgZGVjaXNpb246IHN0YXR1cyBpbiBvciBvdXQhCisJcHJvdGVjdGVkIFRlc3QgY3JlYXRlVGVzdChTdHJpbmcgbmFtZSwgUG9vbCBwb29sLCBTdGF0dXMgc3RhdHVzKSB7CisJCVRlc3QgdGVzdCA9IHN1cGVyLmNyZWF0ZVRlc3QobmFtZSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodGVzdCkuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQocG9vbCk7CisJCWdldENvcmUocG9vbCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZCh0ZXN0KTsKKworCQlyZXR1cm4gdGVzdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0U3RlcH0gZm9yIGdpdmVuIHtAbGluayBUZXN0fSB1c2luZyBnaXZlbgorCSAqIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfS4KKwkgKgorCSAqIEBwYXJhbSB0ZXN0ICAgICAgICAgICAgIFRoZSBwYXJlbnQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVRlc3RTdGVwIFRoZSB0ZW1wbGF0ZSB0aGUgcmV0dXJuZWQge0Bjb2RlIFRlc3RTdGVwfSB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZCBmcm9tLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVzdFN0ZXAgY3JlYXRlVGVzdFN0ZXAoVGVzdCB0ZXN0LCBUZW1wbGF0ZVRlc3RTdGVwIHRlbXBsYXRlVGVzdFN0ZXApIHsKKwkJcmV0dXJuIGNyZWF0ZVRlc3RTdGVwKHRlc3QsIG51bGwsIHRlbXBsYXRlVGVzdFN0ZXApOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlc3RTdGVwfSBmb3IgZ2l2ZW4ge0BsaW5rIFRlc3R9IHVzaW5nIGdpdmVuCisJICoge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9LgorCSAqCisJICogQHBhcmFtIHRlc3QgICAgICAgICAgICAgVGhlIHBhcmVudCB7QGNvZGUgVGVzdH0uCisJICogQHBhcmFtIHN0YXR1cyAgICAgICAgICAgVGhlIHJlbGF0ZWQge0BsaW5rIFN0YXR1c30uCisJICogQHBhcmFtIHRlbXBsYXRlVGVzdFN0ZXAgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgVGVzdFN0ZXB9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVzdFN0ZXB9IGlzIHJldHVybmVkLgorCSAqLworCS8vIFRPRE8gbWFrZSBhIGRlY2lzaW9uOiBzdGF0dXMgaW4gb3Igb3V0IQorCXByb3RlY3RlZCBUZXN0U3RlcCBjcmVhdGVUZXN0U3RlcChUZXN0IHRlc3QsIFN0YXR1cyBzdGF0dXMsIFRlbXBsYXRlVGVzdFN0ZXAgdGVtcGxhdGVUZXN0U3RlcCkgeworCQlUZW1wbGF0ZVRlc3QgdGVtcGxhdGVUZXN0ID0gVGVtcGxhdGVUZXN0Lm9mKHRlc3QpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlbXBsYXRlIHRlc3QgaXMgbm90IGF2YWlsYWJsZS4iKSk7CisJCWlmICghdGVtcGxhdGVUZXN0LmNvbnRhaW5zKHRlbXBsYXRlVGVzdFN0ZXApKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZW1wbGF0ZSB0ZXN0IHN0ZXAgaXMgbm90IHBhcnQgb2YgdGhlIHRlc3QgdGVtcGxhdGUuIik7CisJCX0KKworCQlUZXN0U3RlcCB0ZXN0U3RlcCA9IGNyZWF0ZVRlc3RTdGVwKHRlbXBsYXRlVGVzdFN0ZXAuZ2V0TmFtZSgpLCB0ZXN0LCBzdGF0dXMpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHRlc3RTdGVwKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQodGVtcGxhdGVUZXN0U3RlcCk7CisKKwkJLy8gY3JlYXRlIGluaXRpYWwgY29udGV4dCByb290cworCQl0ZW1wbGF0ZVRlc3RTdGVwLmdldFRlbXBsYXRlUm9vdHMoKS5mb3JFYWNoKHRlbXBsYXRlUm9vdCAtPiBjcmVhdGVDb250ZXh0Um9vdCh0ZXN0U3RlcCwgdGVtcGxhdGVSb290KSk7CisKKwkJcmV0dXJuIHRlc3RTdGVwOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlc3RTdGVwfSBmb3IgZ2l2ZW4ge0BsaW5rIFRlc3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZXN0fS4KKwkgKiBAcGFyYW0gdGVzdCAgIFRoZSBwYXJlbnQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBzdGF0dXMgVGhlIHJlbGF0ZWQge0BsaW5rIFN0YXR1c30uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVzdFN0ZXB9IGlzIHJldHVybmVkLgorCSAqLworCS8vIFRPRE8gbWFrZSBhIGRlY2lzaW9uOiBzdGF0dXMgaW4gb3Igb3V0IQorCXByb3RlY3RlZCBUZXN0U3RlcCBjcmVhdGVUZXN0U3RlcChTdHJpbmcgbmFtZSwgVGVzdCB0ZXN0LCBTdGF0dXMgc3RhdHVzKSB7CisJCVRlc3RTdGVwIHRlc3RTdGVwID0gc3VwZXIuY3JlYXRlVGVzdFN0ZXAobmFtZSwgdGVzdCk7CisKKwkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQlzdGF0dXMuYXNzaWduKHRlc3RTdGVwKTsKKwkJfQorCisJCXJldHVybiB0ZXN0U3RlcDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIDxUIGV4dGVuZHMgQmFzZUVudGl0eT4gVCBjcmVhdGVCYXNlRW50aXR5KENsYXNzPFQ+IGNsYXp6LCBDb3JlIGNvcmUpIHsKKwkJdHJ5IHsKKwkJCUNvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yID0gY2xhenouZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihDb3JlLmNsYXNzKTsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGNvcmUpOworCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleGMpIHsKKwkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQmFzZUVudGl0eShjbGF6eiwgY29yZSk7CisJCQl9CisJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gfCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YykgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpLCBleGMpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gZW51bWVyYXRpb24gaXMgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24gbW9kZWwgb3Igbm90LgorCSAqCisJICogQHBhcmFtIGVudW1lcmF0aW9uT2JqIFRoZSBjaGVja2VkIGVudW1lcmF0aW9uIGNsYXNzLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiBlbnVtZXJhdGlvbiBjbGFzcyBpcyBub3QKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVFbnVtKEVudW1lcmF0aW9uPD8+IGVudW1lcmF0aW9uT2JqKTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBnaXZlbiBjYXRhbG9nIG5hbWUgaXMgYWxsb3dlZCBvciBub3QuCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgIFRoZSBjaGVja2VkIG5hbWUuCisJICogQHBhcmFtIGlzQXR0cmlidXRlTmFtZSBGbGFnIGluZGljYXRlcyB3aGV0aGVyIGdpdmVuIG5hbWUgaXMgZm9yIGEgY2F0YWxvZworCSAqICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiBuYW1lIGlzIG5vdCBhbGxvd2VkLgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVDYXRhbG9nTmFtZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0F0dHJpYnV0ZU5hbWUpIHsKKwkJaWYgKCFpc1ZhbGlkQ2F0YWxvZ05hbWUobmFtZSkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJBIGNhdGFsb2cgbmFtZSBpcyBub3QgYWxsb3dlZCB0byBiZSBlbXB0eSBhbmQgIiArICJtdXN0IG5vdCBleGNlZWQgMzAgY2hhcmFjdGVycy4iKTsKKwkJfSBlbHNlIGlmIChuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKS5zdGFydHNXaXRoKCJhbyIpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGNhdGFsb2cgbmFtZSBpcyBub3QgYWxsb3dlZCB0byAiICsgInN0YXJ0IHdpdGggJ2FvJyAoY2FzZSBpZ25vcmVkKS4iKTsKKwkJfSBlbHNlIGlmICghbmFtZS5tYXRjaGVzKCJeW1xcd10rJCIpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiQSBjYWxhdG9nIG5hbWUgbWF5IG9ubHkgY29uc3Rpc3RzIG9mIHRoZSAiICsgImZvbGxvd2luZyBjaGFyYWN0ZXJzOiBhLXosIEEtWiwgMC05IG9yIF8uIik7CisJCX0gZWxzZSBpZiAoaXNBdHRyaWJ1dGVOYW1lICYmIEFycmF5cy5hc0xpc3QoImlkIiwgIm5hbWUiLCAibWltZXR5cGUiKS5jb250YWlucyhuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKSkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJBIGNhdGFsb2cgYXR0cmlidXRlIG5hbWUgaXMgbm90IGFsbG93ZWQgdG8gYmUgIiArICInaWQnLCAnbmFtZScgb3IgJ21pbWV0eXBlJyAoY2FzZSBpZ25vcmVkKS4iKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIGNhdGFsb2cgbmFtZSBpcyB2YWxpZAorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIGNoZWNrZWQgbmFtZS4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIG5hbWUgaXMgYSB2YWxpZCBjYXRhbG9nIG5hbWUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDYXRhbG9nTmFtZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbmFtZSAhPSBudWxsICYmICFuYW1lLmlzRW1wdHkoKSAmJiBuYW1lLmxlbmd0aCgpIDw9IDMwOworCX0KKworCS8qKgorCSAqIEhpZGVzIHtAbGluayBWYWx1ZX0gY29udGFpbmVycyBtaXNzaW5nIGluIHRoZSB0ZW1wbGF0ZXMuCisJICoKKwkgKiBAcGFyYW0gY29udGV4dENvcmUgICAgICAgIFRoZSB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0ge0BsaW5rIENvcmV9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZUF0dHJpYnV0ZXMgVGhlIHtAbGluayBUZW1wbGF0ZUF0dHJpYnV0ZX1zIG9mIHRoZSB0ZW1wbGF0ZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGhpZGVWYWx1ZXMoQ29yZSBjb250ZXh0Q29yZSwgTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gdGVtcGxhdGVBdHRyaWJ1dGVzKSB7CisJCVNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8Pihjb250ZXh0Q29yZS5nZXRWYWx1ZXMoKS5rZXlTZXQoKSk7CisJCW5hbWVzLnJlbW92ZShFbnRpdHkuQVRUUl9OQU1FKTsKKwkJbmFtZXMucmVtb3ZlKEVudGl0eS5BVFRSX01JTUVUWVBFKTsKKwkJdGVtcGxhdGVBdHRyaWJ1dGVzLnN0cmVhbSgpLm1hcChFbnRpdHk6OmdldE5hbWUpLmZvckVhY2gobmFtZXM6OnJlbW92ZSk7CisJCWNvbnRleHRDb3JlLmhpZGVWYWx1ZXMobmFtZXMpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Qb29sLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvUG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzY3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvUG9vbC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwb29sIGVudGl0eSB0eXBlLiBUaGUgcG9vbCBlbnRpdHkgaXMgdXNlZCB0byBlc3RhYmxpc2gKKyAqIGEgZnVydGhlciBuYXZpZ2F0aW9uIHN0cnVjdHVyZSB0aHJvdWdoIHRoZSBzdG9yZWQgbWVhc3VyZW1lbnQgZGF0YS4gSXRzIG5hbWUKKyAqIG1heSBiZSBmcmVlbHkgY2hvc2VuIGJ1dCBoYXMgdG8gdG8gYmUgdW5pcXVlLiBBIHByb2plY3QgY29udGFpbnMge0BsaW5rIFRlc3R9CisgKiBlbnRpdGllcyBhcyBpdHMgY2hpbGRyZW4uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFByb2plY3QKKyAqIEBzZWUgVGVzdAorICovCitwdWJsaWMgY2xhc3MgUG9vbCBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZWxldGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSB7QGxpbmsgUHJvamVjdH0gcGFyZW50IHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxQcm9qZWN0PiBQQVJFTlRfVFlQRV9QUk9KRUNUID0gUHJvamVjdC5jbGFzczsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgVGVzdH0gY2hpbGQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFRlc3Q+IENISUxEX1RZUEVfVEVTVCA9IFRlc3QuY2xhc3M7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVBvb2woQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1Byb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Qcm9qZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4ZTk3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Qcm9qZWN0LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHByb2plY3QgZW50aXR5IHR5cGUuIFRoZSBwcm9qZWN0IGlzIHRoZSB0b3AgbGV2ZWwgb2YKKyAqIHN0b3JlZCBtZWFzdXJlbWVudCBkYXRhLiBJdHMgbmFtZSBtYXkgYmUgZnJlZWx5IGNob3NlbiBidXQgaGFzIHRvIHRvIGJlCisgKiB1bmlxdWUuIEEgcHJvamVjdCBjb250YWlucyB7QGxpbmsgUG9vbH0gZW50aXRpZXMgYXMgaXRzIGNoaWxkcmVuLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBQb29sCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9qZWN0IGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIHtAbGluayBQb29sfSBjaGlsZCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8UG9vbD4gQ0hJTERfVFlQRV9QT09MID0gUG9vbC5jbGFzczsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJUHJvamVjdChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvUHJvamVjdERvbWFpbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1Byb2plY3REb21haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWYwZjVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1Byb2plY3REb21haW4uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0RG9tYWluIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlc2NyaWJhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJUHJvamVjdERvbWFpbihDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1JvbGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Sb2xlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhNThmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Sb2xlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlVzZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHJvbGUgZW50aXR5IHR5cGUuIEVhY2ggcm9sZSBjYW4gY29udGFpbiBtdWx0aXBsZQorICoge0BsaW5rIFVzZXJ9IGFuZCBlYWNoIHtAbGluayBVc2VyfSBjYW4gYmUgYXNzaWduZWQgbXVsdGlwbGUge0BsaW5rIFJvbGV9cy4KKyAqLworcHVibGljIGNsYXNzIFJvbGUgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NVUEVSVVNFUl9GTEFHID0gIlN1cGVydXNlckZsYWciOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9HUk9VUFMyVVNFUlMgPSAiZ3JvdXBzMnVzZXJzIjsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlSb2xlKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwkJZ2V0VmFsdWUoQVRUUl9TVVBFUlVTRVJfRkxBRykuc2V0KChzaG9ydCkgMCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHVzZXIgVXNlciB0byBhZGQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRVc2VyKFVzZXIgdXNlcikgeworCQlnZXRDb3JlKCkuZ2V0TnRvTVN0b3JlKCkuYWRkKFJFTF9HUk9VUFMyVVNFUlMsIHVzZXIpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB1c2VyIHtAbGluayBVc2VyfSB0byByZW1vdmUKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVVc2VyKFVzZXIgdXNlcikgeworCQlnZXRDb3JlKCkuZ2V0TnRvTVN0b3JlKCkucmVtb3ZlKFJFTF9HUk9VUFMyVVNFUlMsIHVzZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9TdGF0dXMuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9TdGF0dXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFhMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1N0YXR1cy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZXNjcmliYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU3RhdHVzQXR0YWNoYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YXR1cyBlbnRpdHkgdHlwZS4gQSBzdGF0dXMgbWF5IGJlIGF0dGFjaGVkIHRvCisgKiB7QGxpbmsgU3RhdHVzQXR0YWNoYWJsZX0gZW50aXRpZXMgbGlrZSB7QGxpbmsgVGVzdH0gb3Ige0BsaW5rIFRlc3RTdGVwfSB0bworICogaW5kaWNhdGUgdGhleSBoYXZlIGEgc3RhdGUgaW4gYSBjb21wbGV0ZSB3b3JrZmxvdy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIFN0YXR1cyBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZXNjcmliYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVN0YXR1cyhDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQXNzaWducyB0aGlzIHN0YXR1cyB0byBnaXZlbiB7QGxpbmsgU3RhdHVzQXR0YWNoYWJsZX1zLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgICAgICAgIFRoZSBzdGF0dXMgYXR0YWNoYWJsZSB0eXBlLgorCSAqIEBwYXJhbSBzdGF0dXNBdHRhY2hhYmxlcyBUaGlzIHN0YXR1cyB3aWxsIGJlIGFzc2lnbmVkIHRvIGFsbCBvZiB0aGVtLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+IHZvaWQgYXNzaWduKExpc3Q8VD4gc3RhdHVzQXR0YWNoYWJsZXMpIHsKKwkJc3RhdHVzQXR0YWNoYWJsZXMuZm9yRWFjaCh0aGlzOjphc3NpZ24pOworCX0KKworCS8qKgorCSAqIEFzc2lnbnMgdGhpcyBzdGF0dXMgdG8gZ2l2ZW4ge0BsaW5rIFN0YXR1c0F0dGFjaGFibGV9LgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgICAgICAgVGhlIHN0YXR1cyBhdHRhY2hhYmxlIHR5cGUuCisJICogQHBhcmFtIHN0YXR1c0F0dGFjaGFibGUgVGhpcyBzdGF0dXMgd2lsbCBiZSBhc3NpZ25lZCB0byBpdC4KKwkgKi8KKwlwdWJsaWMgPFQgZXh0ZW5kcyBTdGF0dXNBdHRhY2hhYmxlPiB2b2lkIGFzc2lnbihUIHN0YXR1c0F0dGFjaGFibGUpIHsKKwkJQ2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24gPSBnZXRDb3JlKHN0YXR1c0F0dGFjaGFibGUpLmdldE11dGFibGVTdG9yZSgpLmdldChDbGFzc2lmaWNhdGlvbi5jbGFzcyk7CisJCWlmIChjbGFzc2lmaWNhdGlvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiTWFuZGF0b3J5IGVsZW1lbnQgY2xhc3NpZmljYXRpb24gbm90IGZvdW5kISIpOworCQl9CisKKwkJZ2V0Q29yZShjbGFzc2lmaWNhdGlvbikuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHRoaXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBTdGF0dXN9IGF0dGFjaGVkIHRvIGdpdmVuIHtAbGluayBTdGF0dXNBdHRhY2hhYmxlfS4KKwkgKgorCSAqIEBwYXJhbSBzdGF0dXNBdHRhY2hhYmxlIFRoZSB7QGNvZGUgU3RhdHVzQXR0YWNoYWJsZX0uCisJICogQHJldHVybiBPcHRpb25hbCBpcyBlbXB0eSBpZiBubyB7QGNvZGUgU3RhdHVzfSBpcyBhdHRhY2hlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFN0YXR1cz4gb2YoU3RhdHVzQXR0YWNoYWJsZSBzdGF0dXNBdHRhY2hhYmxlKSB7CisJCUNsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uID0gZ2V0Q29yZShzdGF0dXNBdHRhY2hhYmxlKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoQ2xhc3NpZmljYXRpb24uY2xhc3MpOworCQlpZiAoY2xhc3NpZmljYXRpb24gPT0gbnVsbCkgeworCQkJcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisJCX0KKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZShjbGFzc2lmaWNhdGlvbikuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFN0YXR1cy5jbGFzcykpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTAxMDg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw0MDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Eb3VibGVDb21wbGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmlsZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZsb2F0Q29tcGxleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWltZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIGF0dHJpYnV0ZSBlbnRpdHkgdHlwZS4gQSB0ZW1wbGF0ZSBhdHRyaWJ1dGUKKyAqIGFkZHMgbWV0YSBkYXRhIHRvIGEge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSXQgYWx3YXlzCisgKiBiZWxvbmdzIHRvIGEge0BsaW5rIFRlbXBsYXRlQ29tcG9uZW50fSBvciBhIHtAbGluayBUZW1wbGF0ZVNlbnNvcn0uIEl0cyBuYW1lCisgKiBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX0gYW5kIGlzIG5vdAorICogYWxsb3dlZCB0byBiZSBtb2RpZmllZCBhdCBhbGwuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFRlbXBsYXRlQ29tcG9uZW50CisgKiBAc2VlIFRlbXBsYXRlU2Vuc29yCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wbGF0ZUF0dHJpYnV0ZSBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZWxldGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoaXMge0Bjb2RlIENvbXBhcmF0b3J9IGNvbXBhcmVzIHtAbGluayBUZW1wbGF0ZUF0dHJpYnV0ZX1zIGJ5IHRoZSBzb3J0IGluZGV4CisJICogb2YgdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gaW4gYXNjZW5kaW5nIG9yZGVyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxUZW1wbGF0ZUF0dHJpYnV0ZT4gQ09NUEFSQVRPUiA9IENvbXBhcmF0b3IKKwkJCS5jb21wYXJpbmcodGEgLT4gdGEuZ2V0Q2F0YWxvZ0F0dHJpYnV0ZSgpLmdldFNvcnRJbmRleCgpKTsKKworCS8qKgorCSAqIFRoZSAnRGVmYXVsdFZhbHVlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFRkFVTFRfVkFMVUUgPSAiRGVmYXVsdFZhbHVlIjsKKworCS8qKgorCSAqIFRoZSAnVmFsdWVSZWFkT25seScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRUFET05MWSA9ICJWYWx1ZVJlYWRvbmx5IjsKKworCS8qKgorCSAqIFRoZSAnT3B0aW9uYWwnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1BUSU9OQUwgPSAiT2JsaWdhdG9yeSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8VmFsdWVUeXBlPD8+LCBGdW5jdGlvbjxTdHJpbmcsIE9iamVjdD4+IFZBTFVFVFlQRV9GVU5DVElPTl9NQVAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlzdGF0aWMgeworCQlWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLnB1dChWYWx1ZVR5cGUuU1RSSU5HLCB2IC0+IHYpOworCQlWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLnB1dChWYWx1ZVR5cGUuREFURSwgdiAtPiBMb2NhbERhdGVUaW1lLnBhcnNlKHYsIFZhbHVlLkxPQ0FMX0RBVEVfVElNRV9GT1JNQVRURVIpKTsKKwkJVkFMVUVUWVBFX0ZVTkNUSU9OX01BUC5wdXQoVmFsdWVUeXBlLkJPT0xFQU4sIEJvb2xlYW46OnZhbHVlT2YpOworCQlWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLnB1dChWYWx1ZVR5cGUuQllURSwgQnl0ZTo6dmFsdWVPZik7CisJCVZBTFVFVFlQRV9GVU5DVElPTl9NQVAucHV0KFZhbHVlVHlwZS5TSE9SVCwgU2hvcnQ6OnZhbHVlT2YpOworCQlWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLnB1dChWYWx1ZVR5cGUuSU5URUdFUiwgSW50ZWdlcjo6dmFsdWVPZik7CisJCVZBTFVFVFlQRV9GVU5DVElPTl9NQVAucHV0KFZhbHVlVHlwZS5MT05HLCBMb25nOjp2YWx1ZU9mKTsKKwkJVkFMVUVUWVBFX0ZVTkNUSU9OX01BUC5wdXQoVmFsdWVUeXBlLkZMT0FULCBGbG9hdDo6dmFsdWVPZik7CisJCVZBTFVFVFlQRV9GVU5DVElPTl9NQVAucHV0KFZhbHVlVHlwZS5ET1VCTEUsIERvdWJsZTo6dmFsdWVPZik7CisJCVZBTFVFVFlQRV9GVU5DVElPTl9NQVAucHV0KFZhbHVlVHlwZS5GTE9BVF9DT01QTEVYLCBGbG9hdENvbXBsZXg6OnZhbHVlT2YpOworCQlWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLnB1dChWYWx1ZVR5cGUuRE9VQkxFX0NPTVBMRVgsIERvdWJsZUNvbXBsZXg6OnZhbHVlT2YpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVGVtcGxhdGVBdHRyaWJ1dGUoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQge0BsaW5rIFZhbHVlfSBvZiB0aGlzIHRlbXBsYXRlIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRlZmF1bHQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIgfSkKKwlwdWJsaWMgVmFsdWUgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQlWYWx1ZVR5cGUgdmFsdWVUeXBlID0gZ2V0Q2F0YWxvZ0F0dHJpYnV0ZSgpLmdldFZhbHVlVHlwZSgpOworCQlWYWx1ZSBkZWZhdWx0VmFsdWUgPSBnZXRWYWx1ZShBVFRSX0RFRkFVTFRfVkFMVUUpOworCQlib29sZWFuIGlzVmFsaWQgPSBkZWZhdWx0VmFsdWUuaXNWYWxpZCgpOworCQlTdHJpbmcgdmFsdWUgPSBkZWZhdWx0VmFsdWUuZXh0cmFjdCgpOworCQlpZiAodmFsdWVUeXBlLmlzRW51bWVyYXRpb25UeXBlKCkpIHsKKwkJCUVudW1lcmF0aW9uIGVudW1PYmplY3QgPSBnZXRDYXRhbG9nQXR0cmlidXRlKCkuZ2V0RW51bWVyYXRpb25PYmplY3QoKTsKKwkJCXJldHVybiB2YWx1ZVR5cGUuY3JlYXRlKGdldE5hbWUoKSwgIiIsIGlzVmFsaWQsIGlzVmFsaWQgPyBlbnVtT2JqZWN0LnZhbHVlT2YodmFsdWUpIDogbnVsbCwKKwkJCQkJZW51bU9iamVjdC5nZXROYW1lKCkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHZhbHVlVHlwZS5jcmVhdGUoZ2V0TmFtZSgpLCBpc1ZhbGlkID8gcGFyc2UodmFsdWUsIHZhbHVlVHlwZSkgOiBudWxsKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuIEdpdmVuIGlucHV0IHdpbGwgYmUKKwkgKiBzdG9yZWQgaW4gaXRzIHtAbGluayBTdHJpbmd9IHJlcHJlc2VudGF0aW9uLgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoT2JqZWN0IGlucHV0KSB7CisJCWlmIChpbnB1dCA9PSBudWxsKSB7CisJCQlnZXRWYWx1ZShBVFRSX0RFRkFVTFRfVkFMVUUpLnNldChudWxsKTsKKwkJCXJldHVybjsKKwkJfQorCisJCVZhbHVlVHlwZTw/PiB2YWx1ZVR5cGUgPSBnZXRDYXRhbG9nQXR0cmlidXRlKCkuZ2V0VmFsdWVUeXBlKCk7CisJCWJvb2xlYW4gc2VxdWVuY2UgPSB2YWx1ZVR5cGUuaXNTZXF1ZW5jZSgpOworCisJCS8vIGlmIHRoaXMgcGFzc2VzIC0+IGlucHV0IGlzIHZhbGlkCisJCVZhbHVlIHZhbHVlID0gdmFsdWVUeXBlLmNyZWF0ZSgibm90UmVsZXZhbnQiLCBpbnB1dCk7CisKKwkJU3RyaW5nIHN0cmluZ1ZhbHVlOworCQlpZiAodmFsdWVUeXBlLmlzRmlsZUxpbmtUeXBlKCkpIHsKKwkJCXN0cmluZ1ZhbHVlID0gZ2V0U3RyaW5nVmFsdWVGb3JGaWxlTGlua1R5cGUodmFsdWUsIHNlcXVlbmNlKTsKKwkJfSBlbHNlIGlmICh2YWx1ZVR5cGUuaXNEYXRlVHlwZSgpKSB7CisJCQlMb2NhbERhdGVUaW1lW10gdmFsdWVzID0gc2VxdWVuY2UgPyB2YWx1ZS5leHRyYWN0KCkgOiBuZXcgTG9jYWxEYXRlVGltZVtdIHsgdmFsdWUuZXh0cmFjdCgpIH07CisJCQlzdHJpbmdWYWx1ZSA9IFN0cmVhbS5vZih2YWx1ZXMpLm1hcChsZHQgLT4gbGR0LmZvcm1hdChWYWx1ZS5MT0NBTF9EQVRFX1RJTUVfRk9STUFUVEVSKSkKKwkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpOworCQl9IGVsc2UgeworCQkJaWYgKGlucHV0LmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisJCQkJc3RyaW5nVmFsdWUgPSBJbnRTdHJlYW0ucmFuZ2UoMCwgQXJyYXkuZ2V0TGVuZ3RoKGlucHV0KSkubWFwVG9PYmooaSAtPiBBcnJheS5nZXQoaW5wdXQsIGkpLnRvU3RyaW5nKCkpCisJCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSk7CisJCQl9IGVsc2UgeworCQkJCXN0cmluZ1ZhbHVlID0gdmFsdWUuZXh0cmFjdCgpLnRvU3RyaW5nKCk7CisJCQl9CisJCX0KKworCQlnZXRWYWx1ZShBVFRSX0RFRkFVTFRfVkFMVUUpLnNldChzdHJpbmdWYWx1ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgcmVhZCBvbmx5IGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGl0IGlzIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB7QGxpbmsgVmFsdWV9cworCSAqICAgICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgdGVtcGxhdGUgYXR0cmlidXRlLgorCSAqLworCXB1YmxpYyBCb29sZWFuIGlzVmFsdWVSZWFkT25seSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfVkFMVUVfUkVBRE9OTFkpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIGEgbmV3IHZhbHVlIHJlYWQgb25seSBmbGFnIGZvciB0aGlzIHRlbXBsYXRlIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZVJlYWRPbmx5IFRoZSBuZXcgdmFsdWUgcmVhZCBvbmx5IGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWVSZWFkT25seShCb29sZWFuIHZhbHVlUmVhZE9ubHkpIHsKKwkJZ2V0VmFsdWUoQVRUUl9WQUxVRV9SRUFET05MWSkuc2V0KHZhbHVlUmVhZE9ubHkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG9wdGlvbmFsIGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGl0IGlzIGFsbG93ZWQgdG8gb21pdCBhIHtAbGluayBWYWx1ZX0gZGVyaXZlZAorCSAqICAgICAgICAgZnJvbSB0aGlzIHRlbXBsYXRlIGF0dHJpYnV0ZS4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc09wdGlvbmFsKCkgeworCQlib29sZWFuIG1hbmRhdG9yeSA9IGdldFZhbHVlKEFUVFJfT1BUSU9OQUwpLmV4dHJhY3QoKTsKKwkJcmV0dXJuIG1hbmRhdG9yeSA/IEJvb2xlYW4uRkFMU0UgOiBCb29sZWFuLlRSVUU7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBvcHRpb25hbCBmbGFnIGZvciB0aGlzIHRlbXBsYXRlIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSBvcHRpb25hbCBUaGUgbmV3IG9wdGlvbmFsIGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgeworCQlnZXRWYWx1ZShBVFRSX09QVElPTkFMKS5zZXQob3B0aW9uYWwgPyBCb29sZWFuLkZBTFNFIDogQm9vbGVhbi5UUlVFKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUgaXMgYXNzb2NpYXRlZAorCSAqIHdpdGguCisJICoKKwkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZ0F0dHJpYnV0ZSBnZXRDYXRhbG9nQXR0cmlidXRlKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLmdldChDYXRhbG9nQXR0cmlidXRlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVSb290fSB0aGlzIHRlbXBsYXRlIGF0dHJpYnV0ZSBiZWxvbmdzIHRvLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFRlbXBsYXRlUm9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlUm9vdCBnZXRUZW1wbGF0ZVJvb3QoKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudCA9IGdldFRlbXBsYXRlQ29tcG9uZW50KCk7CisJCU9wdGlvbmFsPFRlbXBsYXRlU2Vuc29yPiB0ZW1wbGF0ZVNlbnNvciA9IGdldFRlbXBsYXRlU2Vuc29yKCk7CisJCWlmICh0ZW1wbGF0ZUNvbXBvbmVudC5pc1ByZXNlbnQoKSkgeworCQkJcmV0dXJuIHRlbXBsYXRlQ29tcG9uZW50LmdldCgpLmdldFRlbXBsYXRlUm9vdCgpOworCQl9IGVsc2UgaWYgKHRlbXBsYXRlU2Vuc29yLmlzUHJlc2VudCgpKSB7CisJCQlyZXR1cm4gdGVtcGxhdGVTZW5zb3IuZ2V0KCkuZ2V0VGVtcGxhdGVSb290KCk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQYXJlbnQgZW50aXR5IGlzIHVua25vd24uIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQge0BsaW5rIFRlbXBsYXRlQ29tcG9uZW50fSBvZiB0aGlzIHRlbXBsYXRlIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBhIHtAbGluayBUZW1wbGF0ZVNlbnNvcn0gaXMgcGFyZW50IG9mCisJICogICAgICAgICB0aGlzIHRlbXBsYXRlIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUZW1wbGF0ZVNlbnNvcigpCisJICovCisJcHVibGljIE9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiBnZXRUZW1wbGF0ZUNvbXBvbmVudCgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZSgpLmdldFBlcm1hbmVudFN0b3JlKCkuZ2V0KFRlbXBsYXRlQ29tcG9uZW50LmNsYXNzKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFyZW50IHtAbGluayBUZW1wbGF0ZVNlbnNvcn0gb2YgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IGlzIHBhcmVudCBvZgorCSAqICAgICAgICAgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VGVtcGxhdGVDb21wb25lbnQoKQorCSAqLworCXB1YmxpYyBPcHRpb25hbDxUZW1wbGF0ZVNlbnNvcj4gZ2V0VGVtcGxhdGVTZW5zb3IoKSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldENvcmUoKS5nZXRQZXJtYW5lbnRTdG9yZSgpLmdldChUZW1wbGF0ZVNlbnNvci5jbGFzcykpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBQYXJzZXMgZ2l2ZW4ge0Bjb2RlIFN0cmluZ30gdG8gdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBvZiBnaXZlbgorCSAqIHtAbGluayBWYWx1ZVR5cGV9LgorCSAqCisJICogQHBhcmFtIHZhbHVlICAgICBUaGUge0Bjb2RlIFN0cmluZ30gdmFsdWUuCisJICogQHBhcmFtIHZhbHVlVHlwZSBVc2VkIHRvIHJlc29sdmUgdGhlIGNvcnJlc3BvbmRpbmcgY29udmVydGVyLgorCSAqIEByZXR1cm4gVGhlIHBhcnNlZCBvYmplY3QgaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHBhcnNlKFN0cmluZyB2YWx1ZSwgVmFsdWVUeXBlPD8+IHZhbHVlVHlwZSkgeworCQlpZiAodmFsdWVUeXBlLmlzRmlsZUxpbmtUeXBlKCkpIHsKKwkJCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKFteLF0uKj8pXFxbKC4qPyksKC4qPylcXF0iKTsKKwkJCU1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcih2YWx1ZSk7CisJCQlMaXN0PEZpbGVMaW5rPiBmaWxlTGlua3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCXdoaWxlIChtYXRjaGVyLmZpbmQoKSkgeworCQkJCWZpbGVMaW5rcy5hZGQoRmlsZUxpbmtQYXJzZXIucGFyc2UobWF0Y2hlci5ncm91cCgpKSk7CisJCQl9CisKKwkJCXJldHVybiB2YWx1ZVR5cGUuaXNTZXF1ZW5jZSgpID8gZmlsZUxpbmtzLnRvQXJyYXkobmV3IEZpbGVMaW5rW2ZpbGVMaW5rcy5zaXplKCldKSA6IGZpbGVMaW5rcy5nZXQoMCk7CisJCX0gZWxzZSB7CisJCQlGdW5jdGlvbjxTdHJpbmcsIE9iamVjdD4gY29udmVydGVyID0gZ2V0UGFyc2VyKHZhbHVlVHlwZSk7CisJCQlpZiAodmFsdWVUeXBlLmlzU2VxdWVuY2UoKSkgeworCQkJCUxpc3Q8T2JqZWN0PiB2YWx1ZXMgPSBTdHJlYW0ub2YodmFsdWUuc3BsaXQoIiwiKSkubWFwKGNvbnZlcnRlcikuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCQlPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZSh2YWx1ZVR5cGUuZ2V0VmFsdWVDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgdmFsdWVzLnNpemUoKSk7CisKKwkJCQlpZiAodmFsdWVUeXBlLmdldFZhbHVlQ2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSkgeworCQkJCQlJbnRTdHJlYW0ucmFuZ2UoMCwgdmFsdWVzLnNpemUoKSkuZm9yRWFjaChpIC0+IEFycmF5LnNldChhcnJheSwgaSwgdmFsdWVzLmdldChpKSkpOworCQkJCX0gZWxzZSB7CisJCQkJCXZhbHVlcy50b0FycmF5KChPYmplY3RbXSkgYXJyYXkpOworCQkJCX0KKworCQkJCXJldHVybiBhcnJheTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGNvbnZlcnRlci5hcHBseSh2YWx1ZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGNvZGUgU3RyaW5nfSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZvciBnaXZlbiB7QGxpbmsgVmFsdWVUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZVR5cGUgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTdHJpbmd9IGNvbnZlcnNpb24ge0Bjb2RlIEZ1bmN0aW9ufSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgYSBjb3JyZXNwb25kaW5nIHtAY29kZSBTdHJpbmd9IGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBGdW5jdGlvbjxTdHJpbmcsIE9iamVjdD4gZ2V0UGFyc2VyKFZhbHVlVHlwZTw/PiB2YWx1ZVR5cGUpIHsKKwkJRnVuY3Rpb248U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRlciA9IFZBTFVFVFlQRV9GVU5DVElPTl9NQVAuZ2V0KHZhbHVlVHlwZSk7CisJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGNvbnZlcnNpb24gZm9yIHZhbHVlIHR5cGUgJyIgKyB2YWx1ZVR5cGUgKyAiJyBub3Qgc3VwcG9ydGVkLiIpOworCQl9CisJCXJldHVybiBjb252ZXJ0ZXI7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIElubmVyIGNsYXNzZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBVdGlsaXR5IGNsYXNzIHJlc3RvcmUgYSB7QGxpbmsgRmlsZUxpbmt9IGZyb20gZ2l2ZW4ge0Bjb2RlIFN0cmluZ30uCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZUxpbmtQYXJzZXIgeworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ2xhc3MgdmFyaWFibGVzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvLyBtYXJrZXJzCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19ERVNDX01BUktFUiA9ICJOT19ERVNDIyI7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9NQVJLRVIgPSAiTE9DQUxQQVRIIyI7CisKKwkJLy8gcGF0dGVybiBncm91cCBuYW1lcworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRVRZUEUgPSAibWltZXR5cGUiOworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJwYXRoIjsKKworCQkvLyBwYXR0ZXJuCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gRklMRV9MSU5LX1BBVFRFUk4gPSBQYXR0ZXJuCisJCQkJLmNvbXBpbGUoIig/PCIgKyBERVNDUklQVElPTiArICI+Lio/KVxcWyg/PCIgKyBNSU1FVFlQRSArICI+Lio/KSwoPzwiICsgUEFUSCArICI+Lio/KVxcXSIpOworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gUHVibGljIG1ldGhvZHMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCS8qKgorCQkgKiBQYXJzZXMgZ2l2ZW4ge0Bjb2RlIFN0cmluZ30gYW5kIHJldHVybnMgaXQgYXMge0BsaW5rIEZpbGVMaW5rfS4KKwkJICoKKwkJICogQHBhcmFtIHZhbHVlIFRoZSB7QGNvZGUgU3RyaW5nfSB2YWx1ZSB3aGljaCB3aWxsIGJlIHBhcnNlZC4KKwkJICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyB7QGNvZGUgRmlsZUxpbmt9IGlzIHJldHVybmVkLgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBGaWxlTGluayBwYXJzZShTdHJpbmcgdmFsdWUpIHsKKwkJCU1hdGNoZXIgbWF0Y2hlciA9IEZJTEVfTElOS19QQVRURVJOLm1hdGNoZXIodmFsdWUpOworCQkJaWYgKCFtYXRjaGVyLmZpbmQoKSkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byByZXN0b3JlIGZpbGUgbGluay4iKTsKKwkJCX0KKwkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IG1hdGNoZXIuZ3JvdXAoREVTQ1JJUFRJT04pOworCQkJU3RyaW5nIHBhdGggPSBtYXRjaGVyLmdyb3VwKFBBVEgpOworCQkJRmlsZUxpbmsgZmlsZUxpbms7CisJCQlpZiAocGF0aC5zdGFydHNXaXRoKExPQ0FMX01BUktFUikpIHsKKwkJCQl0cnkgeworCQkJCQlmaWxlTGluayA9IEZpbGVMaW5rLm5ld0xvY2FsKFBhdGhzLmdldChwYXRoLnJlcGxhY2VGaXJzdChMT0NBTF9NQVJLRVIsICIiKSkpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc3RvcmUgbG9jYWwgZmlsZSBsaW5rLiIsIGUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZmlsZUxpbmsgPSBGaWxlTGluay5uZXdSZW1vdGUocGF0aCwgbmV3IE1pbWVUeXBlKG1hdGNoZXIuZ3JvdXAoTUlNRVRZUEUpKSwgZGVzY3JpcHRpb24pOworCQkJfQorCisJCQlmaWxlTGluay5zZXREZXNjcmlwdGlvbihOT19ERVNDX01BUktFUi5lcXVhbHMoZGVzY3JpcHRpb24pID8gbnVsbCA6IGRlc2NyaXB0aW9uKTsKKwkJCXJldHVybiBmaWxlTGluazsKKwkJfQorCisJfQorCisJLyoqCisJICogR2V0IHN0cmluZyB2YWx1ZSBmb3IgRmlsZUxpbmtUeXBlCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgICAgVGhlIHtAY29kZSBWYWx1ZX0gdmFsdWUuCisJICogQHBhcmFtIHNlcXVlbmNlIFRoZSB7QGNvZGUgYm9vbGVhbn0gc2VxdWVuY2UuCisJICogQHJldHVybiBSZXR1cm4ge0Bjb2RlIFN0cmluZ30gc3RyaW5nIHZhbHVlIGZvciBGaWxlTGlua1R5cGUKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdWYWx1ZUZvckZpbGVMaW5rVHlwZShWYWx1ZSB2YWx1ZSwgYm9vbGVhbiBzZXF1ZW5jZSkgeworCQlGaWxlTGlua1tdIHZhbHVlcyA9IHNlcXVlbmNlID8gdmFsdWUuZXh0cmFjdCgpIDogbmV3IEZpbGVMaW5rW10geyB2YWx1ZS5leHRyYWN0KCkgfTsKKwkJcmV0dXJuIFN0cmVhbS5vZih2YWx1ZXMpLm1hcChmbCAtPiB7CisJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCWlmIChmbC5nZXREZXNjcmlwdGlvbigpLmlzRW1wdHkoKSkgeworCQkJCXNiLmFwcGVuZChGaWxlTGlua1BhcnNlci5OT19ERVNDX01BUktFUik7CisJCQl9IGVsc2UgeworCQkJCXNiLmFwcGVuZChmbC5nZXREZXNjcmlwdGlvbigpKTsKKwkJCX0KKwkJCXNiLmFwcGVuZCgnWycpLmFwcGVuZChmbC5nZXRNaW1lVHlwZSgpKS5hcHBlbmQoJywnKTsKKwkJCWlmIChmbC5pc1JlbW90ZSgpKSB7CisJCQkJc2IuYXBwZW5kKGZsLmdldFJlbW90ZVBhdGgoKSk7CisJCQl9IGVsc2UgaWYgKGZsLmlzTG9jYWwoKSkgeworCQkJCXNiLmFwcGVuZChGaWxlTGlua1BhcnNlci5MT0NBTF9NQVJLRVIpLmFwcGVuZChmbC5nZXRMb2NhbFBhdGgoKSk7CisJCQl9IGVsc2UgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZpbGUgbGluayBpcyBuZWl0aGVyIGluIGxvY2FsIG5vciByZW1vdGUgc3RhdGU6ICIgKyBmbCk7CisJCQl9CisKKwkJCXJldHVybiBzYi5hcHBlbmQoJ10nKTsKKwkJfSkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlQ29tcG9uZW50LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQ3NzIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlQ29tcG9uZW50LmphdmEKQEAgLTAsMCArMSw0MDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU29ydGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgY29tcG9uZW50IGVudGl0eSB0eXBlLiBBIHRlbXBsYXRlIGF0dHJpYnV0ZQorICogYWRkcyBtZXRhIGRhdGEgdG8gYSB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0gaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJdCBhbHdheXMKKyAqIGJlbG9uZ3MgdG8gYSB0ZW1wbGF0ZSByb290IG9yIGFub3RoZXIgdGVtcGxhdGUgY29tcG9uZW50LiBJdHMgbmFtZSBoYXMgdG8gYmUKKyAqIHVuaXF1ZSB3aXRoaW4gYWxsIHRlbXBsYXRlIGNvbXBvbmVudHMgYmVsb25naW5nIHRvIHRoZSBzYW1lCisgKiB7QGxpbmsgVGVtcGxhdGVSb290fS4gQSB0ZW1wbGF0ZSBjb21wb25lbnQgbWF5IGRlZmluZSB7QGxpbmsgVGVtcGxhdGVTZW5zb3J9cworICogd2hlcmUgZWFjaCBleHRlbmRzIGEge0BsaW5rIENhdGFsb2dTZW5zb3J9IHByb3ZpZGVkIGJ5IHRoZSBhc3NvY2lhdGVkIHtAY29kZQorICogQ2F0YWxvZ0NvbXBvbmVudH0uIEl0IG1heSBkZWZpbmUge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMgd2hlcmUgZWFjaAorICogdW5pcXVlbHkgZXh0ZW5kcyBhIHtAbGluayBDYXRhbG9nQXR0cmlidXRlfSBwcm92aWRlZCBieSB0aGUgYXNzb2NpYXRlZAorICoge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDYXRhbG9nQ29tcG9uZW50CisgKiBAc2VlIFRlbXBsYXRlUm9vdAorICogQHNlZSBUZW1wbGF0ZUF0dHJpYnV0ZQorICogQHNlZSBUZW1wbGF0ZVNlbnNvcgorICovCitwdWJsaWMgY2xhc3MgVGVtcGxhdGVDb21wb25lbnQgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBTb3J0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIG9wdGlvbmFsIGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVDb21wb25lbnQ+IElTX09QVElPTkFMID0gVGVtcGxhdGVDb21wb25lbnQ6OmlzT3B0aW9uYWw7CisKKwkvKioKKwkgKiBUaGUgbWFuZGF0b3J5IGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uIFRoaXMgaXMgdGhlIGludmVyc2lvbiBvZgorCSAqIHtAbGluayAjSVNfT1BUSU9OQUx9IHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlQ29tcG9uZW50PiBJU19NQU5EQVRPUlkgPSBJU19PUFRJT05BTC5uZWdhdGUoKTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IGFjdGl2ZSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlQ29tcG9uZW50PiBJU19ERUZBVUxUX0FDVElWRSA9IFRlbXBsYXRlQ29tcG9uZW50Ojppc0RlZmF1bHRBY3RpdmU7CisKKwkvKioKKwkgKiBUaGUgc2VyaWVzIGNvbnN0YW50IGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVDb21wb25lbnQ+IElTX1NFUklFU19DT05TVEFOVCA9IFRlbXBsYXRlQ29tcG9uZW50Ojppc1Nlcmllc0NvbnN0YW50OworCisJLyoqCisJICogVGhlIHNlcmllcyB2YXJpYWJsZSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LiBUaGlzIGlzIHRoZSBpbnZlcnNpb24gb2YgdGhlCisJICoge0BsaW5rICNJU19TRVJJRVNfQ09OU1RBTlR9IHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlQ29tcG9uZW50PiBJU19TRVJJRVNfVkFSSUFCTEUgPSBJU19TRVJJRVNfQ09OU1RBTlQubmVnYXRlKCk7CisKKwkvKioKKwkgKiBUaGUgaW1wbGljaXQgY3JlYXRlIGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uIFRoaXMgaXMgYW4gT1IgY29tYmluYXRpb24gb2YKKwkgKiB7QGxpbmsgI0lTX0RFRkFVTFRfQUNUSVZFfSBhbmQge0BsaW5rICNJU19NQU5EQVRPUll9IHtAY29kZSBQcmVkaWNhdGV9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxUZW1wbGF0ZUNvbXBvbmVudD4gSVNfSU1QTElDSVRfQ1JFQVRFID0gSVNfREVGQVVMVF9BQ1RJVkUub3IoSVNfTUFOREFUT1JZKTsKKworCS8qKgorCSAqIFRoZSAnVGVzdFN0ZXBTZXJpZXNWYXJpYWJsZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRVJJRVNfQ09OU1RBTlQgPSAiVGVzdFN0ZXBTZXJpZXNWYXJpYWJsZSI7CisKKwkvKioKKwkgKiBUaGUgJ0RlZmF1bHRBY3RpdmUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVGQVVMVF9BQ1RJVkUgPSAiRGVmYXVsdEFjdGl2ZSI7CisKKwkvKioKKwkgKiBUaGUgJ09wdGlvbmFsJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09QVElPTkFMID0gIk9wdGlvbmFsIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVGVtcGxhdGVDb21wb25lbnQoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG9wdGlvbmFsIGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGl0IGlzIGFsbG93ZWQgdG8gb21pdCBhCisJICogICAgICAgICB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gZGVyaXZlZCBmcm9tIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50LgorCSAqLworCXB1YmxpYyBCb29sZWFuIGlzT3B0aW9uYWwoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX09QVElPTkFMKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBvcHRpb25hbCBmbGFnIGZvciB0aGlzIHRlbXBsYXRlIGNvbXBvbmVudC4KKwkgKgorCSAqIEBwYXJhbSBvcHRpb25hbCBUaGUgbmV3IG9wdGlvbmFsIGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgeworCQlnZXRWYWx1ZShBVFRSX09QVElPTkFMKS5zZXQob3B0aW9uYWwpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgYWN0aXZlIGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGEge0BsaW5rIENvbnRleHRDb21wb25lbnR9IGhhcyB0byBiZSBjcmVhdGVkCisJICogICAgICAgICBhdXRvbWF0aWNhbGx5IGVhY2ggdGltZSBhIG5ldyB7QGxpbmsgQ29udGV4dFJvb3R9IGlzIGRlcml2ZWQgZnJvbSB0aGUKKwkgKiAgICAgICAgIHtAbGluayBUZW1wbGF0ZVJvb3R9IHRoaXMgdGVtcGxhdGUgY29tcG9uZW50IGJlbG9uZ3MgdG8uCisJICovCisJcHVibGljIEJvb2xlYW4gaXNEZWZhdWx0QWN0aXZlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0FDVElWRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgZGVmYXVsdCBhY3RpdmUgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQuCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdEFjdGl2ZSBUaGUgbmV3IGRlZmF1bHQgYWN0aXZlIGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdEFjdGl2ZShCb29sZWFuIGRlZmF1bHRBY3RpdmUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0FDVElWRSkuc2V0KGRlZmF1bHRBY3RpdmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNlcmllcyBjb25zdGFudCBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUge0BsaW5rIENvbnRleHRDb21wb25lbnR9J3Mge0BsaW5rIFZhbHVlfXMKKwkgKiAgICAgICAgIGFjcm9zcyB7QGxpbmsgVGVzdFN0ZXB9IHNpYmxpbmdzIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLgorCSAqLworCXB1YmxpYyBCb29sZWFuIGlzU2VyaWVzQ29uc3RhbnQoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1NFUklFU19DT05TVEFOVCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgc2VyaWVzIGNvbnN0YW50IGZsYWcgZm9yIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50LgorCSAqCisJICogQHBhcmFtIHNlcmllc0NvbnN0YW50IFRoZSBuZXcgc2VyaWVzIGNvbnN0YW50IGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0U2VyaWVzQ29uc3RhbnQoQm9vbGVhbiBzZXJpZXNDb25zdGFudCkgeworCQlnZXRWYWx1ZShBVFRSX1NFUklFU19DT05TVEFOVCkuc2V0KHNlcmllc0NvbnN0YW50KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0gdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQgaXMgYXNzb2NpYXRlZAorCSAqIHdpdGguCisJICoKKwkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIHtAY29kZSBDYXRhbG9nQ29tcG9uZW50fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZ0NvbXBvbmVudCBnZXRDYXRhbG9nQ29tcG9uZW50KCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLmdldChDYXRhbG9nQ29tcG9uZW50LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVSb290fSB0aGlzIHRlbXBsYXRlIGNvbXBvbmVudCBiZWxvbmdzIHRvLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFRlbXBsYXRlUm9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlUm9vdCBnZXRUZW1wbGF0ZVJvb3QoKSB7CisJCVRlbXBsYXRlUm9vdCB0ZW1wbGF0ZVJvb3QgPSBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoVGVtcGxhdGVSb290LmNsYXNzKTsKKwkJaWYgKHRlbXBsYXRlUm9vdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0UGFyZW50VGVtcGxhdGVDb21wb25lbnQoKQorCQkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGFyZW50IGVudGl0eSBpcyB1bmtub3duLiIpKS5nZXRUZW1wbGF0ZVJvb3QoKTsKKwkJfQorCisJCXJldHVybiB0ZW1wbGF0ZVJvb3Q7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFyZW50IHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gb2YgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQgaXMgYW4gaW1tZWRpYXRlCisJICogICAgICAgICBjaGlsZCBvZiB0aGUge0BsaW5rIFRlbXBsYXRlUm9vdH0uCisJICogQHNlZSAjZ2V0VGVtcGxhdGVSb290KCkKKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVDb21wb25lbnQ+IGdldFBhcmVudFRlbXBsYXRlQ29tcG9uZW50KCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoVGVtcGxhdGVDb21wb25lbnQuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVBdHRyaWJ1dGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9LgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9IHdpdGgKKwkgKiAgICAgICAgIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPFRlbXBsYXRlQXR0cmlidXRlPiBnZXRUZW1wbGF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZ2V0VGVtcGxhdGVBdHRyaWJ1dGVzKCkuc3RyZWFtKCkuZmlsdGVyKHRhIC0+IHRhLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMgcmVsYXRlZCB0byB0aGlzIHRlbXBsYXRlCisJICogY29tcG9uZW50LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gZ2V0VGVtcGxhdGVBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoVGVtcGxhdGVBdHRyaWJ1dGUuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBUZW1wbGF0ZUF0dHJpYnV0ZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQXR0cmlidXRlfSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZUF0dHJpYnV0ZX0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZUF0dHJpYnV0ZSA9IGdldFRlbXBsYXRlQXR0cmlidXRlKG5hbWUpOworCQlpZiAodGVtcGxhdGVBdHRyaWJ1dGUuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKHRlbXBsYXRlQXR0cmlidXRlLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogPHA+CisJICogPGI+Tk9URTo8L2I+IFRoZSBuYW1lcyBvZiA8dT5hbGw8L3U+IHRlbXBsYXRlIGNvbXBvbmVudHMgYmVsb25naW5nIHRvIHRoZQorCSAqIHNhbWUge0BsaW5rIFRlbXBsYXRlUm9vdH0gbXVzdCBoYXZlIHVuaXF1ZSBuYW1lcyAobm8gbWF0dGVyIHRoZXkgYXJlCisJICogaW1tZWRpYXRlIGNoaWxkcmVuIG9yIG5vdCkuIFRoZXJlZm9yZSwgaWYgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQgZG9lcyBub3QKKwkgKiBoYXZlIGFuIGltbWVkaWF0ZSB0ZW1wbGF0ZSBjb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdGhpcyBsb29rdXAgcmVxdWVzdAorCSAqIGlzIHJlY3Vyc2l2ZWx5IGRlbGVnYXRlZCB0byBhbGwgb2YgaXRzIGNoaWxkIHRlbXBsYXRlIGNvbXBvbmVudHMuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB3aXRoCisJICogICAgICAgICBnaXZlbiBuYW1lIGRvZXMgbm90IGV4aXN0IChuZWl0aGVyIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50IG5vciBvbmUgb2YKKwkgKiAgICAgICAgIGl0cyBjaGlsZHJlbiBoYXMgYSB0ZW1wbGF0ZSBjb21wb25lbnQgd2l0aCBnaXZlbiBuYW1lKS4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVDb21wb25lbnQ+IGdldFRlbXBsYXRlQ29tcG9uZW50KFN0cmluZyBuYW1lKSB7CisJCUxpc3Q8VGVtcGxhdGVDb21wb25lbnQ+IHRlbXBsYXRlQ29tcG9uZW50cyA9IGdldFRlbXBsYXRlQ29tcG9uZW50cygpOworCQlPcHRpb25hbDxUZW1wbGF0ZUNvbXBvbmVudD4gdGVtcGxhdGVDb21wb25lbnQgPSB0ZW1wbGF0ZUNvbXBvbmVudHMuc3RyZWFtKCkuZmlsdGVyKHRjIC0+IHRjLm5hbWVFcXVhbHMobmFtZSkpCisJCQkJLmZpbmRBbnkoKTsKKwkJaWYgKHRlbXBsYXRlQ29tcG9uZW50LmlzUHJlc2VudCgpKSB7CisJCQlyZXR1cm4gdGVtcGxhdGVDb21wb25lbnQ7CisJCX0KKworCQlyZXR1cm4gdGVtcGxhdGVDb21wb25lbnRzLnN0cmVhbSgpLm1hcChjdCAtPiBjdC5nZXRUZW1wbGF0ZUNvbXBvbmVudChuYW1lKSkuZmlsdGVyKE9wdGlvbmFsOjppc1ByZXNlbnQpCisJCQkJLm1hcChPcHRpb25hbDo6Z2V0KS5maW5kQW55KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgaW1tZWRpYXRlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH1zIHJlbGF0ZWQgdG8gdGhpcyB0ZW1wbGF0ZQorCSAqIGNvbXBvbmVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8VGVtcGxhdGVDb21wb25lbnQ+IGdldFRlbXBsYXRlQ29tcG9uZW50cygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KFRlbXBsYXRlQ29tcG9uZW50LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5PVEU6PC9iPiBUaGUgbmFtZXMgb2YgPHU+YWxsPC91PiB0ZW1wbGF0ZSBjb21wb25lbnRzIGJlbG9uZ2luZyB0byB0aGUKKwkgKiBzYW1lIHtAbGluayBUZW1wbGF0ZVJvb3R9IG11c3QgaGF2ZSB1bmlxdWUgbmFtZXMgKG5vIG1hdHRlciB0aGV5IGFyZQorCSAqIGltbWVkaWF0ZSBjaGlsZHJlbiBvciBub3QpLiBUaGVyZWZvcmUsIGlmIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50IGRvZXMgbm90CisJICogaGF2ZSBhbiBpbW1lZGlhdGUgdGVtcGxhdGUgY29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG5hbWUsIHRoaXMgcmVtb3ZlIHJlcXVlc3QKKwkgKiBpcyByZWN1cnNpdmVseSBkZWxlZ2F0ZWQgdG8gYWxsIG9mIGl0cyBjaGlsZCB0ZW1wbGF0ZSBjb21wb25lbnRzLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlQ29tcG9uZW50KFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudCA9IGdldFRlbXBsYXRlQ29tcG9uZW50KG5hbWUpOworCQlpZiAodGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiBwYXJlbnRUZW1wbGF0ZUNvbXBvbmVudCA9IHRlbXBsYXRlQ29tcG9uZW50LmdldCgpLmdldFBhcmVudFRlbXBsYXRlQ29tcG9uZW50KCk7CisJCQlpZiAocGFyZW50VGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCQlwYXJlbnRUZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5yZW1vdmVUZW1wbGF0ZUNvbXBvbmVudChuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUodGVtcGxhdGVDb21wb25lbnQuZ2V0KCkpOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFRlbXBsYXRlU2Vuc29yfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlU2Vuc29yfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFRlbXBsYXRlU2Vuc29yfSB3aXRoIGdpdmVuCisJICogICAgICAgICBuYW1lIGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxUZW1wbGF0ZVNlbnNvcj4gZ2V0VGVtcGxhdGVTZW5zb3IoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldFRlbXBsYXRlU2Vuc29ycygpLnN0cmVhbSgpLmZpbHRlcih0cyAtPiB0cy5uYW1lRXF1YWxzKG5hbWUpKS5maW5kQW55KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHtAbGluayBUZW1wbGF0ZVNlbnNvcn1zIHJlbGF0ZWQgdG8gdGhpcyB0ZW1wbGF0ZQorCSAqIGNvbXBvbmVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8VGVtcGxhdGVTZW5zb3I+IGdldFRlbXBsYXRlU2Vuc29ycygpIHsKKwkJaWYgKGdldENhdGFsb2dDb21wb25lbnQoKS5nZXRDb250ZXh0VHlwZSgpLmlzVGVzdEVxdWlwbWVudCgpKSB7CisJCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoVGVtcGxhdGVTZW5zb3IuY2xhc3MpOworCQl9CisKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBUZW1wbGF0ZVNlbnNvcn0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlU2Vuc29yfSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZVNlbnNvcn0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlU2Vuc29yKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlU2Vuc29yPiB0ZW1wbGF0ZVNlbnNvciA9IGdldFRlbXBsYXRlU2Vuc29yKG5hbWUpOworCQlpZiAodGVtcGxhdGVTZW5zb3IuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKHRlbXBsYXRlU2Vuc29yLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkubWFwKFZhbHVlOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKworCQlMaXN0PFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZUF0dHJpYnV0ZXMgPSBnZXRUZW1wbGF0ZUF0dHJpYnV0ZXMoKTsKKwkJaWYgKCF0ZW1wbGF0ZUF0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVBdHRyaWJ1dGVzID0gIikuYXBwZW5kKHRlbXBsYXRlQXR0cmlidXRlcyk7CisJCX0KKworCQlMaXN0PFRlbXBsYXRlU2Vuc29yPiB0ZW1wbGF0ZVNlbnNvcnMgPSBnZXRUZW1wbGF0ZVNlbnNvcnMoKTsKKwkJaWYgKCF0ZW1wbGF0ZVNlbnNvcnMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVTZW5zb3JzID0gIikuYXBwZW5kKHRlbXBsYXRlU2Vuc29ycyk7CisJCX0KKworCQlMaXN0PFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudHMgPSBnZXRUZW1wbGF0ZUNvbXBvbmVudHMoKTsKKwkJaWYgKCF0ZW1wbGF0ZUNvbXBvbmVudHMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVDb21wb25lbnRzID0gIikuYXBwZW5kKHRlbXBsYXRlQ29tcG9uZW50cyk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IHRoZSBnaXZlbiB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gaXMKKwkgKiBkZXJpdmVkIGZyb20uCisJICoKKwkgKiBAcGFyYW0gY29udGV4dENvbXBvbmVudCBUaGUge0Bjb2RlIENvbnRleHRDb21wb25lbnR9IHdob3NlIHtAY29kZQorCSAqIAkJVGVtcGxhdGVDb21wb25lbnR9IGlzIHJlcXVlc3RlZC4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgdGhlIGdpdmVuIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fSBpcworCSAqICAgICAgICAgbm90IGRlcml2ZWQgZnJvbSBhIHRlbXBsYXRlLCB3aGljaCBpcyBkYXRhIHNvdXJjZSBzcGVjaWZpYy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiBvZihDb250ZXh0Q29tcG9uZW50IGNvbnRleHRDb21wb25lbnQpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZShjb250ZXh0Q29tcG9uZW50KS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVDb21wb25lbnQuY2xhc3MpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVJvb3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVJvb3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI2NTYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlUm9vdC5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBhdHRyaWJ1dGUgZW50aXR5IHR5cGUuIEEgdGVtcGxhdGUgcm9vdCBkZWZpbmVzCisgKiBhIHRyZWUgb2Yge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fXMuIFN1Y2ggYSB0cmVlIGZvcm1zIGEgaGllcmFyY2hpY2FsCisgKiB0ZW1wbGF0ZSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgY29tcG9zaXRpb24gb2YgYQorICoge0BsaW5rIENvbnRleHRSb290fS4gQSB0ZW1wbGF0ZSByb290IGltcGxlbWVudHMgdGhlIHtAbGluayBWZXJzaW9uYWJsZX0KKyAqIGludGVyZmFjZSBhbmQgaGVuY2UgaGFzIGEgdmVyc2lvbiBhbmQgYSBzdGF0ZS4gQXMgbG9uZyBhcworICoge0BsaW5rICNpc0VkaXRhYmxlKCl9IHJldHVybnMge0Bjb2RlIHRydWV9IGFueSBwYXJ0IG9mIHRoYXQgdGVtcGxhdGUgcm9vdCBpcworICogYWxsb3dlZCB0byBiZSBtb2RpZmllZC4gT25jZSBhIHRlbXBsYXRlIHJvb3QgaXMgc2V0IHRvIGJlIHZhbGlkCisgKiAoe0BsaW5rICNpc1ZhbGlkKCl9ID09IHtAY29kZSB0cnVlfSkgaXQgbWF5IGJlIHVzZWQgdG8gY29tcG9zZSBhCisgKiB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0gYW5kIHRoZW4gaXMgbm8gbG9uZ2VyIGFsbG93ZWQgdG8gYmUgbW9kaWZpZWQgaW4gYW55CisgKiB3YXkuIElmIGEgdmFsaWQgdGVtcGxhdGUgcm9vdCBuZWVkcyB0byBiZSBtb2RpZmllZCwgdGhlbiBhIGRlZXAgY29weSB3aXRoIGEKKyAqIHVuaXF1ZSBuYW1lIGFuZCB2ZXJzaW9uIGNvbWJpbmF0aW9uIGhhcyB0byBiZSBjcmVhdGVkIChkZWVwIGNvcHkgbWVhbnMgbmV3CisgKiBpbnN0YW5jZXMpLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBUZW1wbGF0ZUNvbXBvbmVudAorICogQHNlZSBWZXJzaW9uYWJsZQorICovCitwdWJsaWMgY2xhc3MgVGVtcGxhdGVSb290IGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSwgVmVyc2lvbmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgQ29udGV4dFR5cGUgY29udGV4dFR5cGU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVRlbXBsYXRlUm9vdChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisKKwkJU3RyaW5nIHR5cGVOYW1lID0gY29yZS5nZXRUeXBlTmFtZSgpLnRvVXBwZXJDYXNlKExvY2FsZS5ST09UKTsKKwkJZm9yIChDb250ZXh0VHlwZSBjb250ZXh0VHlwZUNhbmRpZGF0ZSA6IENvbnRleHRUeXBlLnZhbHVlcygpKSB7CisJCQlpZiAodHlwZU5hbWUuY29udGFpbnMoY29udGV4dFR5cGVDYW5kaWRhdGUubmFtZSgpKSkgeworCQkJCWNvbnRleHRUeXBlID0gY29udGV4dFR5cGVDYW5kaWRhdGU7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29yZSBpcyBpbmNvbXBhdGlibGUuIik7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRUeXBlfSBvZiB0aGlzIHRlbXBsYXRlIHJvb3QuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDb250ZXh0VHlwZSBnZXRDb250ZXh0VHlwZSgpIHsKKwkJcmV0dXJuIGNvbnRleHRUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogPHA+CisJICogPGI+Tk9URTo8L2I+IFRoZSBuYW1lcyBvZiA8dT5hbGw8L3U+IHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH1zIGJlbG9uZ2luZyB0bworCSAqIHRoZSBzYW1lIHRlbXBsYXRlIHJvb3QgbXVzdCBoYXZlIHVuaXF1ZSBuYW1lcyAobm8gbWF0dGVyIHRoZXkgYXJlIGltbWVkaWF0ZQorCSAqIGNoaWxkcmVuIG9yIG5vdCkuIFRoZXJlZm9yZSwgaWYgdGhpcyB0ZW1wbGF0ZSByb290IGRvZXMgbm90IGhhdmUgYW4gaW1tZWRpYXRlCisJICoge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB3aXRoIHRoZSBnaXZlbiBuYW1lLCB0aGlzIGxvb2t1cCByZXF1ZXN0IGlzCisJICogcmVjdXJzaXZlbHkgZGVsZWdhdGVkIHRvIGFsbCBvZiBpdHMgY2hpbGQge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fXMuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB3aXRoCisJICogICAgICAgICBnaXZlbiBuYW1lIGRvZXMgbm90IGV4aXN0IGF0IGFsbCB3aXRoaW4gdGhpcyB0ZW1wbGF0ZSByb290LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxUZW1wbGF0ZUNvbXBvbmVudD4gZ2V0VGVtcGxhdGVDb21wb25lbnQoU3RyaW5nIG5hbWUpIHsKKwkJTGlzdDxUZW1wbGF0ZUNvbXBvbmVudD4gdGVtcGxhdGVDb21wb25lbnRzID0gZ2V0VGVtcGxhdGVDb21wb25lbnRzKCk7CisJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudCA9IHRlbXBsYXRlQ29tcG9uZW50cy5zdHJlYW0oKS5maWx0ZXIodGMgLT4gdGMubmFtZUVxdWFscyhuYW1lKSkKKwkJCQkuZmluZEFueSgpOworCQlpZiAodGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCXJldHVybiB0ZW1wbGF0ZUNvbXBvbmVudDsKKwkJfQorCisJCXJldHVybiB0ZW1wbGF0ZUNvbXBvbmVudHMuc3RyZWFtKCkubWFwKHRjIC0+IHRjLmdldFRlbXBsYXRlQ29tcG9uZW50KG5hbWUpKS5maWx0ZXIoT3B0aW9uYWw6OmlzUHJlc2VudCkKKwkJCQkubWFwKE9wdGlvbmFsOjpnZXQpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBpbW1lZGlhdGUge0BsaW5rIFRlbXBsYXRlQ29tcG9uZW50fXMgcmVsYXRlZCB0byB0aGlzIHRlbXBsYXRlCisJICogY29tcG9uZW50LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUZW1wbGF0ZUNvbXBvbmVudD4gZ2V0VGVtcGxhdGVDb21wb25lbnRzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoVGVtcGxhdGVDb21wb25lbnQuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogPHA+CisJICogPGI+Tk9URTo8L2I+IFRoZSBuYW1lcyBvZiA8dT5hbGw8L3U+IHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH1zIGJlbG9uZ2luZyB0bworCSAqIHRoZSBzYW1lIHRlbXBsYXRlIHJvb3RzIG11c3QgaGF2ZSB1bmlxdWUgbmFtZXMgKG5vIG1hdHRlciB0aGV5IGFyZSBpbW1lZGlhdGUKKwkgKiBjaGlsZHJlbiBvciBub3QpLiBUaGVyZWZvcmUsIGlmIHRoaXMgdGVtcGxhdGUgcm9vdCBkb2VzIG5vdCBoYXZlIGFuIGltbWVkaWF0ZQorCSAqIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdGhpcyByZW1vdmUgcmVxdWVzdCBpcworCSAqIHJlY3Vyc2l2ZWx5IGRlbGVnYXRlZCB0byBhbGwgb2YgaXRzIGNoaWxkIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH1zLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlQ29tcG9uZW50KFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudCA9IGdldFRlbXBsYXRlQ29tcG9uZW50KG5hbWUpOworCQlpZiAodGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiBwYXJlbnRUZW1wbGF0ZUNvbXBvbmVudCA9IHRlbXBsYXRlQ29tcG9uZW50LmdldCgpLmdldFBhcmVudFRlbXBsYXRlQ29tcG9uZW50KCk7CisJCQlpZiAocGFyZW50VGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCQlwYXJlbnRUZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5yZW1vdmVUZW1wbGF0ZUNvbXBvbmVudChuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUodGVtcGxhdGVDb21wb25lbnQuZ2V0KCkpOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZCgiQ29udGV4dFR5cGUgPSAiKS5hcHBlbmQoZ2V0Q29udGV4dFR5cGUoKSkuYXBwZW5kKCIsICIpOworCQlzYi5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkubWFwKFZhbHVlOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKworCQlMaXN0PFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudHMgPSBnZXRUZW1wbGF0ZUNvbXBvbmVudHMoKTsKKwkJaWYgKCF0ZW1wbGF0ZUNvbXBvbmVudHMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVDb21wb25lbnRzID0gIikuYXBwZW5kKHRlbXBsYXRlQ29tcG9uZW50cyk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVSb290fSB0aGUgZ2l2ZW4ge0BsaW5rIENvbnRleHRSb290fSBpcyBkZXJpdmVkCisJICogZnJvbS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0Um9vdCBUaGUge0Bjb2RlIENvbnRleHRSb290fSB3aG9zZSB7QGNvZGUgVGVtcGxhdGVSb290fSBpcworCSAqICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQuCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHRoZSBnaXZlbiB7QGNvZGUgQ29udGV4dFJvb3R9IGlzIG5vdAorCSAqICAgICAgICAgZGVyaXZlZCBmcm9tIGEgdGVtcGxhdGUsIHdoaWNoIGlzIGRhdGEgc291cmNlIHNwZWNpZmljLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8VGVtcGxhdGVSb290PiBvZihDb250ZXh0Um9vdCBjb250ZXh0Um9vdCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKGNvbnRleHRSb290KS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVSb290LmNsYXNzKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVTZW5zb3IuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVNlbnNvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YzJiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVTZW5zb3IuamF2YQpAQCAtMCwwICsxLDMzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkF4aXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Q29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0U2Vuc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlc2NyaWJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5RdWFudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU29ydGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBzZW5zb3IgZW50aXR5IHR5cGUuIEEgdGVtcGxhdGUgc2Vuc29yIGFkZHMKKyAqIG1ldGEgZGF0YSB0byBhIHtAbGluayBDYXRhbG9nU2Vuc29yfSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIEl0IGFsd2F5cyBiZWxvbmdzCisgKiB0byBhIHRlbXBsYXRlIGNvbXBvbmVudCBvciBhIHRlbXBsYXRlIHNlbnNvci4gSXRzIG5hbWUgaGFzIHRvIGJlIHVuaXF1ZQorICogd2l0aGluIGFsbCB0ZW1wbGF0ZSBzZW5zb3JzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9LgorICogQSB0ZW1wbGF0ZSBzZW5zb3IgZGVmaW5lIHtAbGluayBUZW1wbGF0ZUF0dHJpYnV0ZX1zIHdoZXJlIGVhY2ggdW5pcXVlbHkKKyAqIGV4dGVuZHMgYSB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gcHJvdmlkZWQgYnkgdGhlIGFzc29jaWF0ZWQge0Bjb2RlCisgKiBDYXRhbG9nU2Vuc29yfS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgQ2F0YWxvZ1NlbnNvcgorICogQHNlZSBUZW1wbGF0ZUNvbXBvbmVudAorICogQHNlZSBUZW1wbGF0ZUF0dHJpYnV0ZQorICovCitwdWJsaWMgY2xhc3MgVGVtcGxhdGVTZW5zb3IgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSwgU29ydGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSBvcHRpb25hbCBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlU2Vuc29yPiBJU19PUFRJT05BTCA9IFRlbXBsYXRlU2Vuc29yOjppc09wdGlvbmFsOworCisJLyoqCisJICogVGhlIG1hbmRhdG9yeSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LiBUaGlzIGlzIHRoZSBpbnZlcnNpb24gb2YKKwkgKiB7QGxpbmsgI0lTX09QVElPTkFMfSB7QGNvZGUgUHJlZGljYXRlfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxUZW1wbGF0ZVNlbnNvcj4gSVNfTUFOREFUT1JZID0gSVNfT1BUSU9OQUwubmVnYXRlKCk7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBhY3RpdmUgZmxhZyB7QGNvZGUgUHJlZGljYXRlfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxUZW1wbGF0ZVNlbnNvcj4gSVNfREVGQVVMVF9BQ1RJVkUgPSBUZW1wbGF0ZVNlbnNvcjo6aXNEZWZhdWx0QWN0aXZlOworCisJLyoqCisJICogVGhlIGltcGxpY2l0IGNyZWF0ZSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LiBUaGlzIGlzIGFuIE9SIGNvbWJpbmF0aW9uIG9mCisJICoge0BsaW5rICNJU19ERUZBVUxUX0FDVElWRX0gYW5kIHtAbGluayAjSVNfTUFOREFUT1JZfSB7QGNvZGUgUHJlZGljYXRlfXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVTZW5zb3I+IElTX0lNUExJQ0lUX0NSRUFURSA9IElTX0RFRkFVTFRfQUNUSVZFLm9yKElTX01BTkRBVE9SWSk7CisKKwkvKioKKwkgKiBUaGUgJ09wdGlvbmFsJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09QVElPTkFMID0gIk9wdGlvbmFsIjsKKworCS8qKgorCSAqIFRoZSAnRGVmYXVsdEFjdGl2ZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0FDVElWRSA9ICJEZWZhdWx0QWN0aXZlIjsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZWRWYWx1ZXNFZGl0YWJsZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRUFTUkVEX1ZBTFVFU19FRElUQUJMRSA9ICJNZWFRdWFudGl0eVZhbHVlc0VkaXRhYmxlIjsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZWRWYWx1ZXNHZW5lcmF0b3JOYW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FQVNSRURfVkFMVUVTX0dFTkVSQVRPUl9OQU1FID0gIk1lYVF1YW50aXR5RWRpdG9yUGx1Z2luIjsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZWRWYWx1ZXNJbmRlcGVuZGVudCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRUFTUkVEX1ZBTFVFU19JTkRFUEVOREVOVCA9ICJNZWFRdWFudGl0eUluZGVwZW5kZW50IjsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZWRWYWx1ZXNBeGlzVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRUFTUkVEX1ZBTFVFU19BWElTVFlQRSA9ICJNZWFRdWFudGl0eUF4aXNUeXBlIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVGVtcGxhdGVTZW5zb3IoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1lYXN1cmVkIHZhbHVlcyBlZGl0YWJsZSBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgbWVhc3VyZWQgdmFsdWVzIGVkaXRhYmxlIGZsYWcgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEJvb2xlYW4gYXJlTWVhc3VyZWRWYWx1ZXNFZGl0YWJsZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUVBU1JFRF9WQUxVRVNfRURJVEFCTEUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIGEgbmV3IG1lYXN1cmVkIHZhbHVlcyBlZGl0YWJsZSBmbGFnIGZvciB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKgorCSAqIEBwYXJhbSBtZWFzdXJlZFZhbHVlc0VkaXRhYmxlIFRoZSBtZWFzdXJlZCB2YWx1ZXMgZWRpdGFibGUgZmxhZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZWFzdXJlZFZhbHVlc0VkaXRhYmxlKEJvb2xlYW4gbWVhc3VyZWRWYWx1ZXNFZGl0YWJsZSkgeworCQlnZXRWYWx1ZShBVFRSX01FQVNSRURfVkFMVUVTX0VESVRBQkxFKS5zZXQobWVhc3VyZWRWYWx1ZXNFZGl0YWJsZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWVhc3VyZWQgdmFsdWVzIGdlbmVyYXRvciBuYW1lIG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgbWVhc3VyZWQgdmFsdWVzIGdlbmVyYXRvciBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWVhc3VyZWRWYWx1ZXNHZW5lcmF0b3JOYW1lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9NRUFTUkVEX1ZBTFVFU19HRU5FUkFUT1JfTkFNRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgbWVhc3VyZWQgdmFsdWVzIGdlbmVyYXRvciBuYW1lIGZvciB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKgorCSAqIEBwYXJhbSBtZWFzdXJlZFZhbHVlc0dlbmVyYXRvck5hbWUgVGhlIG1lYXN1cmVkIHZhbHVlcyBnZW5lcmF0b3IgbmFtZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZWFzdXJlZFZhbHVlc0dlbmVyYXRvck5hbWUoU3RyaW5nIG1lYXN1cmVkVmFsdWVzR2VuZXJhdG9yTmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX01FQVNSRURfVkFMVUVTX0dFTkVSQVRPUl9OQU1FKS5zZXQobWVhc3VyZWRWYWx1ZXNHZW5lcmF0b3JOYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZWFzdXJlZCB2YWx1ZXMgaW5kZXBlbmRlbnQgZmxhZyBvZiB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1lYXN1cmVkIHZhbHVlcyBpbmRlcGVuZGVudCBmbGFnIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBCb29sZWFuIGFyZU1lYXN1cmVkVmFsdWVzSW5kZXBlbmRlbnQoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX01FQVNSRURfVkFMVUVTX0lOREVQRU5ERU5UKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBtZWFzdXJlZCB2YWx1ZXMgaW5kZXBlbmRlbnQgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSBzZW5zb3IuCisJICoKKwkgKiBAcGFyYW0gbWVhc3VyZWRWYWx1ZXNJbmRlcGVuZGVudCBUaGUgbWVhc3VyZWQgdmFsdWVzIGluZGVwZW5kZW50IGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0TWVhc3VyZWRWYWx1ZXNJbmRlcGVuZGVudChCb29sZWFuIG1lYXN1cmVkVmFsdWVzSW5kZXBlbmRlbnQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9NRUFTUkVEX1ZBTFVFU19JTkRFUEVOREVOVCkuc2V0KG1lYXN1cmVkVmFsdWVzSW5kZXBlbmRlbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1lYXN1cmVkIHZhbHVlcyB7QGxpbmsgQXhpc1R5cGV9IG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgbWVhc3VyZWQgdmFsdWVzIHtAY29kZSBBeGlzVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEF4aXNUeXBlIGdldE1lYXN1cmVkVmFsdWVzQXhpc1R5cGUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX01FQVNSRURfVkFMVUVTX0FYSVNUWVBFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBtZWFzdXJlZCB2YWx1ZXMge0BsaW5rIEF4aXNUeXBlfSBmb3IgdGhpcyB0ZW1wbGF0ZSBzZW5zb3IuCisJICoKKwkgKiBAcGFyYW0gYXhpc1R5cGUgVGhlIG1lYXN1cmVkIHZhbHVlcyB7QGNvZGUgQXhpc1R5cGV9LgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lYXN1cmVkVmFsdWVzQXhpc1R5cGUoQXhpc1R5cGUgYXhpc1R5cGUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9NRUFTUkVEX1ZBTFVFU19BWElTVFlQRSkuc2V0KGF4aXNUeXBlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBpdCBpcyBhbGxvd2VkIHRvIG9taXQgYSB7QGxpbmsgQ29udGV4dFNlbnNvcn0KKwkgKiAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc09wdGlvbmFsKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgb3B0aW9uYWwgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSBzZW5zb3IuCisJICoKKwkgKiBAcGFyYW0gb3B0aW9uYWwgVGhlIG5ldyBvcHRpb25hbCBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuc2V0KG9wdGlvbmFsKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGFjdGl2ZSBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBhIHtAbGluayBDb250ZXh0U2Vuc29yfSBoYXMgdG8gYmUgY3JlYXRlZAorCSAqICAgICAgICAgYXV0b21hdGljYWxseSBlYWNoIHRpbWUgYSBuZXcge0BsaW5rIENvbnRleHRDb21wb25lbnR9IGlzIGRlcml2ZWQKKwkgKiAgICAgICAgIGZyb20gdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gdGhpcyB0ZW1wbGF0ZSBzZW5zb3IgYmVsb25ncyB0by4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc0RlZmF1bHRBY3RpdmUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0RFRkFVTFRfQUNUSVZFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBkZWZhdWx0IGFjdGl2ZSBmbGFnIGZvciB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKgorCSAqIEBwYXJhbSBkZWZhdWx0QWN0aXZlIFRoZSBuZXcgZGVmYXVsdCBhY3RpdmUgZmxhZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0QWN0aXZlKEJvb2xlYW4gZGVmYXVsdEFjdGl2ZSkgeworCQlnZXRWYWx1ZShBVFRSX0RFRkFVTFRfQUNUSVZFKS5zZXQoZGVmYXVsdEFjdGl2ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENhdGFsb2dTZW5zb3J9IHRoaXMgdGVtcGxhdGUgc2Vuc29yIGlzIGFzc29jaWF0ZWQgd2l0aC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQge0Bjb2RlIENhdGFsb2dTZW5zb3J9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDYXRhbG9nU2Vuc29yIGdldENhdGFsb2dTZW5zb3IoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KENhdGFsb2dTZW5zb3IuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBRdWFudGl0eX0gbWVhc3VyZWQgZGF0YSBhcmUgYXNzb2NpYXRlZCB3aXRoLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFF1YW50aXR5fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUXVhbnRpdHkgZ2V0UXVhbnRpdHkoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFF1YW50aXR5LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVSb290fSB0aGlzIHRlbXBsYXRlIHNlbnNvciBiZWxvbmdzIHRvLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFRlbXBsYXRlUm9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlUm9vdCBnZXRUZW1wbGF0ZVJvb3QoKSB7CisJCXJldHVybiBnZXRUZW1wbGF0ZUNvbXBvbmVudCgpLmdldFRlbXBsYXRlUm9vdCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhcmVudCB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgcGFyZW50IHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlQ29tcG9uZW50IGdldFRlbXBsYXRlQ29tcG9uZW50KCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldFBlcm1hbmVudFN0b3JlKCkuZ2V0KFRlbXBsYXRlQ29tcG9uZW50LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVBdHRyaWJ1dGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9LgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9IHdpdGgKKwkgKiAgICAgICAgIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPFRlbXBsYXRlQXR0cmlidXRlPiBnZXRUZW1wbGF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZ2V0VGVtcGxhdGVBdHRyaWJ1dGVzKCkuc3RyZWFtKCkuZmlsdGVyKHRhIC0+IHRhLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMgcmVsYXRlZCB0byB0aGlzIHRlbXBsYXRlCisJICogc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gZ2V0VGVtcGxhdGVBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoVGVtcGxhdGVBdHRyaWJ1dGUuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBUZW1wbGF0ZUF0dHJpYnV0ZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQXR0cmlidXRlfSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZUF0dHJpYnV0ZX0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZUF0dHJpYnV0ZSA9IGdldFRlbXBsYXRlQXR0cmlidXRlKG5hbWUpOworCQlpZiAodGVtcGxhdGVBdHRyaWJ1dGUuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKHRlbXBsYXRlQXR0cmlidXRlLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkubWFwKFZhbHVlOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKworCQlMaXN0PFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZUF0dHJpYnV0ZXMgPSBnZXRUZW1wbGF0ZUF0dHJpYnV0ZXMoKTsKKwkJaWYgKCF0ZW1wbGF0ZUF0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVBdHRyaWJ1dGVzID0gIikuYXBwZW5kKHRlbXBsYXRlQXR0cmlidXRlcyk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVTZW5zb3J9IHRoZSBnaXZlbiB7QGxpbmsgQ29udGV4dFNlbnNvcn0gaXMgZGVyaXZlZAorCSAqIGZyb20uCisJICoKKwkgKiBAcGFyYW0gY29udGV4dFNlbnNvciBUaGUge0Bjb2RlIENvbnRleHRTZW5zb3J9IHdob3NlIHtAY29kZQorCSAqIAkJVGVtcGxhdGVTZW5zb3J9IGlzIHJlcXVlc3RlZC4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgdGhlIGdpdmVuIHtAY29kZSBDb250ZXh0U2Vuc29yfSBpcyBub3QKKwkgKiAgICAgICAgIGRlcml2ZWQgZnJvbSBhIHRlbXBsYXRlLCB3aGljaCBpcyBkYXRhIHNvdXJjZSBzcGVjaWZpYy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFRlbXBsYXRlU2Vuc29yPiBvZihDb250ZXh0U2Vuc29yIGNvbnRleHRTZW5zb3IpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZShjb250ZXh0U2Vuc29yKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVTZW5zb3IuY2xhc3MpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2RiNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSB0ZXN0IGVudGl0eSB0eXBlLiBBIHRlbXBsYXRlIHRlc3QgY29uc2lzdHMgb2YKKyAqIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2V9cyB3aXRoIHVuaXF1ZSBuYW1lcy4gSXQgZGVzY3JpYmVzIGEgdGVtcGxhdGUgZm9yCisgKiBhIHRlc3QgcnVuIGFuZCBwcm92aWRlcyBtZXRhIGRhdGEgdG8gcmVzb2x2ZSBob29rcyBhbmQgZGF0YSBzb3VyY2VzIGZvcgorICogbmFtaW5nLCBwcm9wZXJ0eSB2YWxpZGF0aW9uLCByZXNvbHV0aW9uIGFuZCBvdGhlciBwdXJwb3Nlcy4gQSB0ZW1wbGF0ZSB0ZXN0CisgKiBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgVmVyc2lvbmFibGV9IGludGVyZmFjZSBhbmQgaGVuY2UgaGFzIGEgdmVyc2lvbiBhbmQgYQorICogc3RhdGUuIEFzIGxvbmcgYXMge0BsaW5rICNpc0VkaXRhYmxlKCl9IHJldHVybnMge0Bjb2RlIHRydWV9IGFueSBwYXJ0IG9mIHRoYXQKKyAqIHRlbXBsYXRlIHRlc3QgaXMgYWxsb3dlZCB0byBiZSBtb2RpZmllZC4gT25jZSBhIHRlbXBsYXRlIHRlc3QgaXMgc2V0IHRvIGJlCisgKiB2YWxpZCAoe0BsaW5rICNpc1ZhbGlkKCl9ID09IHtAY29kZSB0cnVlfSkgaXQgbWF5IGJlIHVzZWQgdG8gZGVmaW5lIGEgdGVzdAorICogcnVuIHRoZXJlZm9yZSBpcyBubyBsb25nZXIgYWxsb3dlZCB0byBiZSBtb2RpZmllZCBpbiBhbnkgd2F5LiBJZiBhIHZhbGlkCisgKiB0ZW1wbGF0ZSB0ZXN0IG5lZWRzIHRvIGJlIG1vZGlmaWVkLCB0aGVuIGEgZGVlcCBjb3B5IHdpdGggYSB1bmlxdWUgbmFtZSBhbmQKKyAqIHZlcnNpb24gY29tYmluYXRpb24gaGFzIHRvIGJlIGNyZWF0ZWQgKGRlZXAgY29weSBtZWFucyBuZXcgaW5zdGFuY2VzKS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgVGVtcGxhdGVUZXN0U3RlcFVzYWdlCisgKiBAc2VlIFZlcnNpb25hYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wbGF0ZVRlc3QgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSwgVmVyc2lvbmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnTmFtZUhlbHBlckNsYXNzbmFtZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FSEVMUEVSX0NMQVNTTkFNRSA9ICJOYW1lSGVscGVyQ2xhc3NuYW1lIjsKKworCS8qKgorCSAqIFRoZSAnRGF0YVNvdXJjZVBsdWdpbkNsYXNzbmFtZXMnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREFUQVNPVVJDRV9QTFVHSU5fQ0xBU1NOQU1FUyA9ICJEYXRhU291cmNlUGx1Z2luQ2xhc3NuYW1lcyI7CisKKwkvKioKKwkgKiBUaGUgJ1Rlc3RPcmRlckFjdGlvbkNsYXNzbmFtZXMnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVEVTVF9PUkRFUl9BQ1RJT05fQ0xBU1NOQU1FUyA9ICJUZXN0T3JkZXJBY3Rpb25DbGFzc25hbWVzIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVGVtcGxhdGVUZXN0KENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIGhlbHBlciBjbGFzcyBuYW1lIG9mIHRoaXMgdGVtcGxhdGUgdGVzdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWUgaGVscGVyIGNsYXNzIG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lSGVscGVyQ2xhc3NuYW1lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9OQU1FSEVMUEVSX0NMQVNTTkFNRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgbmFtZSBoZWxwZXIgY2xhc3MgbmFtZSBmb3IgdGhpcyB0ZW1wbGF0ZSB0ZXN0LgorCSAqCisJICogQHBhcmFtIG5hbWVIZWxwZXJDbGFzc25hbWUgVGhlIG5ldyBuYW1lIGhlbHBlciBjbGFzcyBuYW1lLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWVIZWxwZXJDbGFzc25hbWUoU3RyaW5nIG5hbWVIZWxwZXJDbGFzc25hbWUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9OQU1FSEVMUEVSX0NMQVNTTkFNRSkuc2V0KG5hbWVIZWxwZXJDbGFzc25hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRhdGEgc291cmNlIHBsdWctaW4gY2xhc3MgbmFtZXMgb2YgdGhpcyB0ZW1wbGF0ZSB0ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUgZGF0YSBzb3VyY2UgcGx1Zy1pbiBjbGFzcyBuYW1lcyBhcmUgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZ1tdIGdldERhdGFTb3VyY2VQbHVnaW5DbGFzc25hbWVzKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9EQVRBU09VUkNFX1BMVUdJTl9DTEFTU05BTUVTKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGF0YSBzb3VyY2UgcGx1Zy1pbiBjbGFzcyBuYW1lcyBmb3IgdGhpcyB0ZW1wbGF0ZSB0ZXN0LgorCSAqCisJICogQHBhcmFtIGRhdGFTb3VyY2VQbHVnaW5DbGFzc25hbWVzIFRoZSBuZXcgZGF0YSBzb3VyY2UgcGx1Zy1pbiBjbGFzcyBuYW1lcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlQ2xhc3NuYW1lcyhTdHJpbmdbXSBkYXRhU291cmNlUGx1Z2luQ2xhc3NuYW1lcykgeworCQlnZXRWYWx1ZShBVFRSX0RBVEFTT1VSQ0VfUExVR0lOX0NMQVNTTkFNRVMpLnNldChkYXRhU291cmNlUGx1Z2luQ2xhc3NuYW1lcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdGVzdCBvcmRlciBhY3Rpb24gY2xhc3MgbmFtZXMgb2YgdGhpcyB0ZW1wbGF0ZSB0ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUgdGVzdCBvcmRlciBhY3Rpb24gY2xhc3MgbmFtZXMgYXJlIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRUZXN0T3JkZXJBY3Rpb25DbGFzc25hbWVzKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9URVNUX09SREVSX0FDVElPTl9DTEFTU05BTUVTKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgdGVzdCBvcmRlciBhY3Rpb24gY2xhc3MgbmFtZXMgZm9yIHRoaXMgdGVtcGxhdGUgdGVzdC4KKwkgKgorCSAqIEBwYXJhbSB0ZXN0T3JkZXJBY3Rpb25DbGFzc25hbWVzIFRoZSBuZXcgdGVzdCBvcmRlciBhY3Rpb24gY2xhc3MgbmFtZXMuCisJICovCisJcHVibGljIHZvaWQgc2V0VGVzdE9yZGVyQWN0aW9uQ2xhc3NuYW1lcyhTdHJpbmdbXSB0ZXN0T3JkZXJBY3Rpb25DbGFzc25hbWVzKSB7CisJCWdldFZhbHVlKEFUVFJfVEVTVF9PUkRFUl9BQ1RJT05fQ0xBU1NOQU1FUykuc2V0KHRlc3RPcmRlckFjdGlvbkNsYXNzbmFtZXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2V9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0gd2l0aAorCSAqICAgICAgICAgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiBnZXRUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldFRlbXBsYXRlVGVzdFN0ZXBVc2FnZXMoKS5zdHJlYW0oKS5maWx0ZXIodHRzdSAtPiB0dHN1Lm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX1zIHJlbGF0ZWQgdG8gdGhpcyB0ZW1wbGF0ZQorCSAqIHRlc3QuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PFRlbXBsYXRlVGVzdFN0ZXBVc2FnZT4gZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlcygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KFRlbXBsYXRlVGVzdFN0ZXBVc2FnZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0gdGhhdCBoYXMgdG8gYmUgcmVtb3ZlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfSB3aXRoIGdpdmVuCisJICogICAgICAgICBuYW1lIGhhcyBiZWVuIHJlbW92ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlVGVtcGxhdGVUZXN0U3RlcFVzYWdlKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlVGVzdFN0ZXBVc2FnZT4gdGVtcGxhdGVUZXN0U3RlcFVzYWdlID0gZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlKG5hbWUpOworCQlpZiAodGVtcGxhdGVUZXN0U3RlcFVzYWdlLmlzUHJlc2VudCgpKSB7CisJCQlnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLnJlbW92ZSh0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2UuZ2V0KCkpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZChnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5tYXAoVmFsdWU6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCisJCUxpc3Q8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiB0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VzID0gZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlcygpOworCQlpZiAoIXRlbXBsYXRlVGVzdFN0ZXBVc2FnZXMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVUZXN0U3RlcFVzYWdlcyA9ICIpLmFwcGVuZCh0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VzKTsKKwkJfQorCisJCXJldHVybiBzYi5hcHBlbmQoJyknKS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gdGhlIGdpdmVuIHtAbGluayBDb250ZXh0Q29tcG9uZW50fSBpcworCSAqIGRlcml2ZWQgZnJvbS4KKwkgKgorCSAqIEBwYXJhbSB0ZXN0IFRoZSB7QGNvZGUgQ29udGV4dENvbXBvbmVudH0gd2hvc2Uge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSBpcworCSAqICAgICAgICAgICAgIHJlcXVlc3RlZC4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgdGhlIGdpdmVuIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fSBpcworCSAqICAgICAgICAgbm90IGRlcml2ZWQgZnJvbSBhIHRlbXBsYXRlLCB3aGljaCBpcyBkYXRhIHNvdXJjZSBzcGVjaWZpYy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFRlbXBsYXRlVGVzdD4gb2YoVGVzdCB0ZXN0KSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldENvcmUodGVzdCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFRlbXBsYXRlVGVzdC5jbGFzcykpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQYWNrYWdlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBnaXZlbiB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfSBpcyBjb250YWluZWQgaW4gdGhpcworCSAqIHRlbXBsYXRlIHRlc3QuCisJICoKKwkgKiBAcGFyYW0gdGVtcGxhdGVUZXN0U3RlcCBUaGUge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0uCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBnaXZlbiB7QGNvZGUgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfSBpcworCSAqICAgICAgICAgY29udGFpbmVkIGluIHRoaXMgdGVtcGxhdGUgdGVzdC4KKwkgKi8KKwlib29sZWFuIGNvbnRhaW5zKFRlbXBsYXRlVGVzdFN0ZXAgdGVtcGxhdGVUZXN0U3RlcCkgeworCQlyZXR1cm4gZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlcygpLnN0cmVhbSgpLm1hcChUZW1wbGF0ZVRlc3RTdGVwVXNhZ2U6OmdldFRlbXBsYXRlVGVzdFN0ZXApCisJCQkJLmZpbHRlcih0dHMgLT4gdHRzLmdldE5hbWUoKS5lcXVhbHModGVtcGxhdGVUZXN0U3RlcC5nZXROYW1lKCkpKQorCQkJCS5maWx0ZXIodHRzIC0+IHR0cy5nZXRWZXJzaW9uKCkuZXF1YWxzKHRlbXBsYXRlVGVzdFN0ZXAuZ2V0VmVyc2lvbigpKSkuZmluZEZpcnN0KCkuaXNQcmVzZW50KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVUZXN0U3RlcC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdFN0ZXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjhkOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdFN0ZXAuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgZW50aXR5IHR5cGUuIEEgdGVtcGxhdGUgdGVzdCBzdGVwCisgKiBkZXNjcmliZXMgdGhlIGNvbXBvc2l0aW9uIG9mIHtAbGluayBUZW1wbGF0ZVJvb3R9cyB3aGljaCBpbiBmaW5hbGx5IGlzIGEKKyAqIHRlbXBsYXRlIGZvciBhIHBlcnNpc3RlZCBjb250ZXh0IGRlc2NyaXB0aW9uICgiYXMgbWVhc3VyZWQiLCAiYXMgb3JkZXJlZCIpLiBBCisgKiB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgaW1wbGVtZW50cyB0aGUge0BsaW5rIFZlcnNpb25hYmxlfSBpbnRlcmZhY2UgYW5kIGhlbmNlIGhhcworICogYSB2ZXJzaW9uIGFuZCBhIHN0YXRlLiBBcyBsb25nIGFzIHtAbGluayAjaXNFZGl0YWJsZSgpfSByZXR1cm5zIHtAY29kZQorICogdHJ1ZX0gYW55IHBhcnQgb2YgdGhhdCB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgaXMgYWxsb3dlZCB0byBiZSBtb2RpZmllZC4gT25jZSBhCisgKiB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgaXMgc2V0IHRvIGJlIHZhbGlkICh7QGxpbmsgI2lzVmFsaWQoKX0gPT0ge0Bjb2RlIHRydWV9KSBpdAorICogbWF5IGJlIHVzZWQgdG8gY29tcG9zZSBhIHtAbGluayBUZW1wbGF0ZVRlc3R9IGFuZCB0aGVuIGlzIG5vIGxvbmdlciBhbGxvd2VkCisgKiB0byBiZSBtb2RpZmllZCBpbiBhbnkgd2F5LiBJZiBhIHZhbGlkIHRlbXBsYXRlIHRlc3Qgc3RlcCBuZWVkcyB0byBiZQorICogbW9kaWZpZWQsIHRoZW4gYSBkZWVwIGNvcHkgd2l0aCBhIHVuaXF1ZSBuYW1lIGFuZCB2ZXJzaW9uIGNvbWJpbmF0aW9uIGhhcyB0bworICogYmUgY3JlYXRlZCAoZGVlcCBjb3B5IG1lYW5zIG5ldyBpbnN0YW5jZXMpLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBUZW1wbGF0ZVJvb3QKKyAqIEBzZWUgVmVyc2lvbmFibGUKKyAqLworcHVibGljIGNsYXNzIFRlbXBsYXRlVGVzdFN0ZXAgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSwgVmVyc2lvbmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlUZW1wbGF0ZVRlc3RTdGVwKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWxhdGVkIHtAbGluayBUZW1wbGF0ZVJvb3R9IHdpdGggZ2l2ZW4ge0BsaW5rIENvbnRleHRUeXBlfSBvZgorCSAqIHRoaXMgdGVtcGxhdGUgdGVzdCBzdGVwLgorCSAqCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGNvZGUgVGVtcGxhdGVSb290fSBvZiBnaXZlbgorCSAqICAgICAgICAge0Bjb2RlIENvbnRleHRUeXBlfSBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVSb290PiBnZXRUZW1wbGF0ZVJvb3QoQ29udGV4dFR5cGUgY29udGV4dFR5cGUpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLmdldChUZW1wbGF0ZVJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHtAbGluayBUZW1wbGF0ZVJvb3R9cyByZWxhdGVkIHRvIHRoaXMgdGVtcGxhdGUgdGVzdAorCSAqIHN0ZXAuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIExpc3R9IGNvbnRhaW5zIHVwIHRvIDMge0Bjb2RlIFRlbXBsYXRlUm9vdH1zIHdpdGgKKwkgKiAgICAgICAgIGRpc3RpbmN0IHtAbGluayBDb250ZXh0VHlwZX1zLgorCSAqLworCXB1YmxpYyBMaXN0PFRlbXBsYXRlUm9vdD4gZ2V0VGVtcGxhdGVSb290cygpIHsKKwkJTGlzdDxUZW1wbGF0ZVJvb3Q+IHRlbXBsYXRlUm9vdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZ2V0VGVtcGxhdGVSb290KENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpLmlmUHJlc2VudCh0ZW1wbGF0ZVJvb3RzOjphZGQpOworCQlnZXRUZW1wbGF0ZVJvb3QoQ29udGV4dFR5cGUuVEVTVFNFUVVFTkNFKS5pZlByZXNlbnQodGVtcGxhdGVSb290czo6YWRkKTsKKwkJZ2V0VGVtcGxhdGVSb290KENvbnRleHRUeXBlLlRFU1RFUVVJUE1FTlQpLmlmUHJlc2VudCh0ZW1wbGF0ZVJvb3RzOjphZGQpOworCQlyZXR1cm4gdGVtcGxhdGVSb290czsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50IHtAbGluayBUZW1wbGF0ZVJvb3R9IHdpdGggdGhlIGdpdmVuIG9uZS4KKwkgKgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVJvb3QgSXMgbm90IGFsbG93ZWQgdG8gYmUgbnVsbC4KKwkgKiBAc2VlICNyZW1vdmVUZW1wbGF0ZVJvb3QoQ29udGV4dFR5cGUpCisJICovCisJcHVibGljIHZvaWQgc2V0VGVtcGxhdGVSb290KFRlbXBsYXRlUm9vdCB0ZW1wbGF0ZVJvb3QpIHsKKwkJZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLnNldCh0ZW1wbGF0ZVJvb3QsIHRlbXBsYXRlUm9vdC5nZXRDb250ZXh0VHlwZSgpKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGN1cnJlbnQge0BsaW5rIFRlbXBsYXRlUm9vdH0gd2l0aCBnaXZlbiB7QGxpbmsgQ29udGV4dFR5cGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgVGVtcGxhdGVSb290fSBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlUm9vdChDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlib29sZWFuIGNvbnRhaW5lZCA9IGdldFRlbXBsYXRlUm9vdChjb250ZXh0VHlwZSkuaXNQcmVzZW50KCk7CisJCWdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5yZW1vdmUoVGVtcGxhdGVSb290LmNsYXNzLCBjb250ZXh0VHlwZSk7CisJCXJldHVybiBjb250YWluZWQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9IHRoZSBnaXZlbiB7QGxpbmsgVGVzdFN0ZXB9IGlzIGRlcml2ZWQKKwkgKiBmcm9tLgorCSAqCisJICogQHBhcmFtIHRlc3RTdGVwIFRoZSB7QGNvZGUgVGVzdFN0ZXB9IHdob3NlIHtAY29kZSBUZW1wbGF0ZVRlc3RTdGVwfSBpcworCSAqICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQuCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHRoZSBnaXZlbiB7QGNvZGUgVGVzdFN0ZXB9IGlzIG5vdAorCSAqICAgICAgICAgZGVyaXZlZCBmcm9tIGEgdGVtcGxhdGUuCisJICovCisJcHVibGljIHN0YXRpYyBPcHRpb25hbDxUZW1wbGF0ZVRlc3RTdGVwPiBvZihUZXN0U3RlcCB0ZXN0U3RlcCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKHRlc3RTdGVwKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVUZXN0U3RlcC5jbGFzcykpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdFN0ZXBVc2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdFN0ZXBVc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTlkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVUZXN0U3RlcFVzYWdlLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Tb3J0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIHRlc3Qgc3RlcCB1c2FnZSBlbnRpdHkgdHlwZS4gQSB0ZW1wbGF0ZSB0ZXN0CisgKiByZWxhdGVzIGEge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9IHdpdGggYSBwYXJlbnQge0BsaW5rIFRlbXBsYXRlVGVzdH0gKG46bSkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFRlbXBsYXRlVGVzdAorICogQHNlZSBUZW1wbGF0ZVRlc3RTdGVwCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBTb3J0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIG9wdGlvbmFsIGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiBJU19PUFRJT05BTCA9IFRlbXBsYXRlVGVzdFN0ZXBVc2FnZTo6aXNPcHRpb25hbDsKKworCS8qKgorCSAqIFRoZSBtYW5kYXRvcnkgZmxhZyB7QGNvZGUgUHJlZGljYXRlfS4gVGhpcyBpcyB0aGUgaW52ZXJzaW9uIG9mCisJICoge0BsaW5rICNJU19PUFRJT05BTH0ge0Bjb2RlIFByZWRpY2F0ZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiBJU19NQU5EQVRPUlkgPSBJU19PUFRJT05BTC5uZWdhdGUoKTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IGFjdGl2ZSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlVGVzdFN0ZXBVc2FnZT4gSVNfREVGQVVMVF9BQ1RJVkUgPSBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2U6OmlzRGVmYXVsdEFjdGl2ZTsKKworCS8qKgorCSAqIFRoZSBpbXBsaWNpdCBjcmVhdGUgZmxhZyB7QGNvZGUgUHJlZGljYXRlfS4gVGhpcyBpcyBhbiBPUiBjb21iaW5hdGlvbiBvZgorCSAqIHtAbGluayAjSVNfREVGQVVMVF9BQ1RJVkV9IGFuZCB7QGxpbmsgI0lTX01BTkRBVE9SWX0ge0Bjb2RlIFByZWRpY2F0ZX1zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlVGVzdFN0ZXBVc2FnZT4gSVNfSU1QTElDSVRfQ1JFQVRFID0gSVNfREVGQVVMVF9BQ1RJVkUub3IoSVNfTUFOREFUT1JZKTsKKworCS8qKgorCSAqIFRoZSAnRGVmYXVsdEFjdGl2ZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0FDVElWRSA9ICJEZWZhdWx0QWN0aXZlIjsKKworCS8qKgorCSAqIFRoZSAnT3B0aW9uYWwnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1BUSU9OQUwgPSAiT3B0aW9uYWwiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgYWN0aXZlIGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgdXNhZ2UuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGEge0BsaW5rIFRlc3RTdGVwfSBoYXMgdG8gYmUgY3JlYXRlZAorCSAqICAgICAgICAgYXV0b21hdGljYWxseSBlYWNoIHRpbWUgYSBuZXcge0BsaW5rIFRlc3R9IGlzIGRlcml2ZWQgZnJvbSB0aGUKKwkgKiAgICAgICAgIHtAbGluayBUZW1wbGF0ZVRlc3R9IHRoaXMgdGVtcGxhdGUgdGVzdCBzdGVwIHVzYWdlIGJlbG9uZ3MgdG8uCisJICovCisJcHVibGljIEJvb2xlYW4gaXNEZWZhdWx0QWN0aXZlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0FDVElWRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgZGVmYXVsdCBhY3RpdmUgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgdXNhZ2UuCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdEFjdGl2ZSBUaGUgbmV3IGRlZmF1bHQgYWN0aXZlIGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdEFjdGl2ZShCb29sZWFuIGRlZmF1bHRBY3RpdmUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0FDVElWRSkuc2V0KGRlZmF1bHRBY3RpdmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG9wdGlvbmFsIGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSB0ZXN0IHN0ZXAuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGl0IGlzIGFsbG93ZWQgdG8gb21pdCBhIHtAbGluayBUZXN0U3RlcH0KKwkgKiAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHRlbXBsYXRlIHRlc3Qgc3RlcCB1c2FnZS4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc09wdGlvbmFsKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgb3B0aW9uYWwgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgdXNhZ2UuCisJICoKKwkgKiBAcGFyYW0gb3B0aW9uYWwgVGhlIG5ldyBvcHRpb25hbCBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuc2V0KG9wdGlvbmFsKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQge0BsaW5rIFRlbXBsYXRlVGVzdH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQge0Bjb2RlIFRlbXBsYXRlVGVzdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlVGVzdCBnZXRUZW1wbGF0ZVRlc3QoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoVGVtcGxhdGVUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0gcmVsYXRlZCB0byB0aGlzIHRlbXBsYXRlIHRlc3Qgc3RlcAorCSAqIHVzYWdlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXB9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZW1wbGF0ZVRlc3RTdGVwIGdldFRlbXBsYXRlVGVzdFN0ZXAoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFRlbXBsYXRlVGVzdFN0ZXAuY2xhc3MpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1ZhbHVlTGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1ZhbHVlTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTJkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVmFsdWVMaXN0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGF0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZXNjcmliYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHZhbHVlIGxpc3QgZW50aXR5IHR5cGUuIEEgdmFsdWUgbGlzdCBwcm92aWRlcyBhIHNldCBvZgorICogZGVmYXVsdCB2YWx1ZXMgd2hpY2ggbWF5IGJlIHVzZWQgYXMgb3B0aW9ucyB3aGlsZSBkZWZpbmluZyBkZWZhdWx0IHZhbHVlcyBpbgorICogdGVtcGxhdGVzIG9yIG1vZGlmeWluZyBjb250ZXh0IGRhdGEuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFZhbHVlTGlzdFZhbHVlCisgKiBAc2VlIENhdGFsb2dBdHRyaWJ1dGUKKyAqLworcHVibGljIGNsYXNzIFZhbHVlTGlzdCBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEYXRhYmxlLCBEZXNjcmliYWJsZSwgRGVsZXRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVmFsdWVMaXN0KENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmFsdWVMaXN0VmFsdWV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgVmFsdWVMaXN0VmFsdWV9LgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGNvZGUgVmFsdWVMaXN0VmFsdWV9IHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPFZhbHVlTGlzdFZhbHVlPiBnZXRWYWx1ZUxpc3RWYWx1ZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZ2V0VmFsdWVMaXN0VmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKHZsdiAtPiB2bHYubmFtZUVxdWFscyhuYW1lKSkuZmluZEFueSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSB7QGxpbmsgVmFsdWVMaXN0VmFsdWV9cyByZWxhdGVkIHRvIHRoaXMgdmFsdWUgbGlzdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8VmFsdWVMaXN0VmFsdWU+IGdldFZhbHVlTGlzdFZhbHVlcygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KFZhbHVlTGlzdFZhbHVlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSB7QGxpbmsgVmFsdWVMaXN0VmFsdWV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHtAY29kZSBWYWx1ZUxpc3RWYWx1ZX0gdGhhdCBoYXMgdG8gYmUgcmVtb3ZlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgVmFsdWVMaXN0VmFsdWVzfSB3aXRoIGdpdmVuIG5hbWUKKwkgKiAgICAgICAgIGhhcyBiZWVuIHJlbW92ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlVmFsdWVMaXN0VmFsdWUoU3RyaW5nIG5hbWUpIHsKKwkJT3B0aW9uYWw8VmFsdWVMaXN0VmFsdWU+IHZhbHVlTGlzdFZhbHVlID0gZ2V0VmFsdWVMaXN0VmFsdWUobmFtZSk7CisJCWlmICh2YWx1ZUxpc3RWYWx1ZS5pc1ByZXNlbnQoKSkgeworCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUodmFsdWVMaXN0VmFsdWUuZ2V0KCkpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZChnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5tYXAoVmFsdWU6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCisJCUxpc3Q8VmFsdWVMaXN0VmFsdWU+IHZhbHVlTGlzdFZhbHVlcyA9IGdldFZhbHVlTGlzdFZhbHVlcygpOworCQlpZiAoIXZhbHVlTGlzdFZhbHVlcy5pc0VtcHR5KCkpIHsKKwkJCXNiLmFwcGVuZCgiLCBWYWx1ZUxpc3RWYWx1ZXMgPSAiKS5hcHBlbmQodmFsdWVMaXN0VmFsdWVzKTsKKwkJfQorCisJCXJldHVybiBzYi5hcHBlbmQoJyknKS50b1N0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1ZhbHVlTGlzdFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVmFsdWVMaXN0VmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDE5MzVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1ZhbHVlTGlzdFZhbHVlLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNvcnRhYmxlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB2YWx1ZSBsaXN0IHZhbHVlIGVudGl0eSB0eXBlLiBBIHZhbHVlIGxpc3QgdmFsdWUgaXMgYQorICogdW5pcXVlIHZhbHVlIG9wdGlvbiB3aXRoaW4gdGhlIHBhcmVudCB7QGxpbmsgVmFsdWVMaXN0fS4gVGhlcmVmb3JlIHRoZSBuYW1lcworICogb2YgdGhlIHZhbHVlIGxpc3QgdmFsdWVzIHdpdGhpbiBhIHtAY29kZSBWYWx1ZUxpc3R9IGhhdmUgdG8gYmUgdW5pcXVlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBWYWx1ZUxpc3QKKyAqLworcHVibGljIGNsYXNzIFZhbHVlTGlzdFZhbHVlIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSwgRGVzY3JpYmFibGUsIFNvcnRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ1NjYWxhclR5cGUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU0NBTEFSX1RZUEUgPSAiRGF0YVR5cGUiOworCisJLyoqCisJICogVGhlICdWYWx1ZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRSA9ICJWYWx1ZSI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVZhbHVlTGlzdFZhbHVlKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX1ZBTFVFKS5zZXQobmFtZSk7CisJCXN1cGVyLnNldE5hbWUobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFyZW50IHtAbGluayBWYWx1ZUxpc3R9LgorCSAqCisJICogQHJldHVybiBUaGUgcGFyZW50IHtAY29kZSBWYWx1ZUxpc3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBWYWx1ZUxpc3QgZ2V0VmFsdWVMaXN0KCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldFBlcm1hbmVudFN0b3JlKCkuZ2V0KFZhbHVlTGlzdC5jbGFzcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVmVyc2lvbmFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9WZXJzaW9uYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3M2JmODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVmVyc2lvbmFibGUuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRhdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZlcnNpb25TdGF0ZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBleHRlbmRzIHRoZSB7QGxpbmsgRGF0YWJsZX0gaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBnZXR0ZXIgYW5kCisgKiBzZXR0ZXIgbWV0aG9kcyBmb3IgdGhlICdWZXJzaW9uJyBhbmQgJ1ZlcnNpb25TdGF0ZScgZmllbGRzIG9mIGFuIGVudGl0eS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBWZXJzaW9uYWJsZSBleHRlbmRzIERhdGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoaXMge0Bjb2RlIENvbXBhcmF0b3J9IGNvbXBhcmVzIHtAbGluayBWZXJzaW9uYWJsZX1zIGJ5IHRoZWlyIG5hbWUgKGluCisJICogYXNjZW5kaW5nIG9yZGVyKSBhbmQgdmVyc2lvbiAoaW4gZGVzY2VuZGluZyBvcmRlcikuCisJICovCisJQ29tcGFyYXRvcjxWZXJzaW9uYWJsZT4gQ09NUEFSQVRPUiA9IENvbXBhcmF0b3IuY29tcGFyaW5nKFZlcnNpb25hYmxlOjpnZXROYW1lKQorCQkJLnRoZW5Db21wYXJpbmcoQ29tcGFyYXRvci5jb21wYXJpbmcoVmVyc2lvbmFibGU6OmdldFZlcnNpb24pLnJldmVyc2VkKCkpOworCisJLyoqCisJICogVGhlICdWZXJzaW9uJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlTdHJpbmcgQVRUUl9WRVJTSU9OID0gIlZlcnNpb24iOworCisJLyoqCisJICogVGhlICdWZXJzaW9uU3RhdGUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCVN0cmluZyBBVFRSX1ZFUlNJT05fU1RBVEUgPSAiVmFsaWRGbGFnIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB2ZXJzaW9uIGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgSW50ZWdlciBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldFZhbHVlKEFUVFJfVkVSU0lPTikuZXh0cmFjdCgpKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB2ZXJzaW9uIGZvciB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBuZXcgdmVyc2lvbi4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgc2V0VmVyc2lvbihJbnRlZ2VyIHZlcnNpb24pIHsKKwkJZ2V0VmFsdWUoQVRUUl9WRVJTSU9OKS5zZXQodmVyc2lvbi50b1N0cmluZygpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmVyc2lvblN0YXRlfSBvZiB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBWZXJzaW9uU3RhdGV9IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgVmVyc2lvblN0YXRlIGdldFZlcnNpb25TdGF0ZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfVkVSU0lPTl9TVEFURSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IHtAbGluayBWZXJzaW9uU3RhdGV9IGZvciB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEBwYXJhbSB2ZXJzaW9uU3RhdGUgVGhlIG5ldyB7QGNvZGUgVmVyc2lvblN0YXRlfS4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgc2V0VmVyc2lvblN0YXRlKFZlcnNpb25TdGF0ZSB2ZXJzaW9uU3RhdGUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9WRVJTSU9OX1NUQVRFKS5zZXQodmVyc2lvblN0YXRlKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBwYXJ0cyBvZiB0aGlzIHZlcnNpb25hYmxlIGFyZSBhbGxvd2VkIHRvIGJlIG1vZGlmaWVkLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBtb2RpZmljYXRpb25zIGFyZSBhbGxvd2VkLgorCSAqLworCWRlZmF1bHQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgeworCQlyZXR1cm4gZ2V0VmVyc2lvblN0YXRlKCkuaXNFZGl0YWJsZSgpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgdmVyc2lvbmFibGUgaXMgdmFsaWQgYW5kIHRoZXJlZm9yZSBpcyBubyBsb25nZXIgYWxsb3dlZAorCSAqIHRvIGJlIG1vZGlmaWVkLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHZlcnNpb25hYmxlIGlzIHZhbGlkLgorCSAqLworCWRlZmF1bHQgYm9vbGVhbiBpc1ZhbGlkKCkgeworCQlyZXR1cm4gZ2V0VmVyc2lvblN0YXRlKCkuaXNWYWxpZCgpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgdmVyc2lvbmFibGUgaXMgYXJjaGl2ZWQuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgdmVyc2lvbmFibGUgaXMgYXJjaGl2ZWQuCisJICovCisJZGVmYXVsdCBib29sZWFuIGlzQXJjaGl2ZWQoKSB7CisJCXJldHVybiBnZXRWZXJzaW9uU3RhdGUoKS5pc0FyY2hpdmVkKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvRW50aXR5RmFjdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9FbnRpdHlGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNTM2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvRW50aXR5RmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWw7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBFbnRpdHlGYWN0b3J5VGVzdCB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUJhc2VFbnRpdGllcygpIHsKKwkJRW50aXR5RmFjdG9yeSBlbnRpdHlGYWN0b3J5ID0gbW9jayhFbnRpdHlGYWN0b3J5LmNsYXNzKTsKKwkJd2hlbihlbnRpdHlGYWN0b3J5LmNyZWF0ZUJhc2VFbnRpdHkoYW55KCksIGFueSgpKSkudGhlbkNhbGxSZWFsTWV0aG9kKCk7CisKKwkJLy8gVGhlIEVudGl0aWVzIGJlbG93IHdlcmUgY2hvc2VuIGFzIHJlcHJlc2VudGF0aXZlcyBvZiB0aGVpciByZXNwZWN0aXZlCisJCS8vIHBhY2thZ2VzIHNpbmNlIHRoZWlyIGNvbnN0cnVjdG9ycyBkb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSBDb3JlIGluc3RhbmNlcworCQkvLyBwYXNzZWQgdG8gdGhlbSwgc28gYSBudWxsIHBvaW50ZXIgaXMgc3VmZmljaWVudCBmb3IgdGhpcyB0ZXN0LgorCisJCS8vIENoYW5uZWwgY2xhc3MgaXMgaW4gcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwKKwkJLy8gKEJhc2VFbnRpdHlGYWN0b3J5J3MgcGFja2FnZSk6CisJCWFzc2VydFRoYXQoZW50aXR5RmFjdG9yeS5jcmVhdGVCYXNlRW50aXR5KENoYW5uZWwuY2xhc3MsIG51bGwpKS5pc0luc3RhbmNlT2YoQ2hhbm5lbC5jbGFzcyk7CisJCS8vIENhdGFsb2dTZW5zb3IgY2xhc3MgaXMgaW4gcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwKKwkJLy8gKEVudGl0eUZhY3RvcnkncyBwYWNrYWdlKToKKwkJYXNzZXJ0VGhhdChlbnRpdHlGYWN0b3J5LmNyZWF0ZUJhc2VFbnRpdHkoQ2F0YWxvZ1NlbnNvci5jbGFzcywgbnVsbCkpLmlzSW5zdGFuY2VPZihDYXRhbG9nU2Vuc29yLmNsYXNzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvLmdpdGlnbm9yZSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTZkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE4IEBACisjIGVjbGlwc2UKKy5jbGFzc3BhdGgKKy5wcm9qZWN0Cisuc2V0dGluZ3MvCitiaW4vCitzcmMvZ2VuLworCisjIGdyYWRsZQorLmdyYWRsZQorYnVpbGQvCisKKyMgaW50ZWxsaWoKKy5pZGVhLworb3V0LworKi5pcHIKKyouaW1sCisqLml3cworL2Jpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4ZTA5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDI3NyBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wCisKKyAgICBUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorICAgIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04KKyAgICBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisxLiBERUZJTklUSU9OUworCisiQ29udHJpYnV0aW9uIiBtZWFuczoKKworICBhKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKKyAgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorICAgICBpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKyAgICAgaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKyAgd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20KKyAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICJvcmlnaW5hdGVzIiBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5CisgIHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4KKyAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB0aGF0CisgIGFyZSBub3QgTW9kaWZpZWQgV29ya3MuCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKK2FyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKK29yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCitBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK29yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisKKyJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyCitmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBQcm9ncmFtIGFuZCBmb3Igd2hpY2ggdGhlCitlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCityZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4KKworIk1vZGlmaWVkIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0gdGhhdAorcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCitjb250ZW50cyBvZiB0aGUgUHJvZ3JhbSwgaW5jbHVkaW5nLCBmb3IgcHVycG9zZXMgb2YgY2xhcml0eSBhbnkgbmV3IGZpbGUKK2luIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBjb250YWlucyBhbnkgY29udGVudHMgb2YgdGhlIFByb2dyYW0uIE1vZGlmaWVkCitXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsCitpbnRlcmZhY2VzLCB0eXBlcywgY2xhc3Nlcywgc3RydWN0dXJlcywgb3IgZmlsZXMgb2YgdGhlIFByb2dyYW0gc29sZWx5CitpbiBlYWNoIGNhc2UgaW4gb3JkZXIgdG8gbGluayB0bywgYmluZCBieSBuYW1lLCBvciBzdWJjbGFzcyB0aGUgUHJvZ3JhbQorb3IgTW9kaWZpZWQgV29ya3MgdGhlcmVvZi4KKworIkRpc3RyaWJ1dGUiIG1lYW5zIHRoZSBhY3RzIG9mIGEpIGRpc3RyaWJ1dGluZyBvciBiKSBtYWtpbmcgYXZhaWxhYmxlCitpbiBhbnkgbWFubmVyIHRoYXQgZW5hYmxlcyB0aGUgdHJhbnNmZXIgb2YgYSBjb3B5LgorCisiU291cmNlIENvZGUiIG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworbW9kaWZpY2F0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwKK2RvY3VtZW50YXRpb24gc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworIlNlY29uZGFyeSBMaWNlbnNlIiBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorVmVyc2lvbiAyLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aGF0IGxpY2Vuc2UsIGluY2x1ZGluZyBhbnkKK2V4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBpbml0aWFsCitDb250cmlidXRvci4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKKyAgYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKKyAgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKKyAgcHVibGljbHkgcGVyZm9ybSwgRGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKKyAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3Jrcy4KKworICBiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudAorICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsCisgIGlmIGFueSwgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbAorICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0CisgIHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uCisgIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKKyAgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKKyAgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCisgIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworICBjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKKyAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCisgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMKKyAgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKKyAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUKKyAgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5CisgIGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbAorICBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5CisgIHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBEaXN0cmlidXRlIHRoZQorICBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZQorICBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCisgIGQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzCisgIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50CisgIHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKyAgZSkgTm90d2l0aHN0YW5kaW5nIHRoZSB0ZXJtcyBvZiBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UsIG5vCisgIENvbnRyaWJ1dG9yIG1ha2VzIGFkZGl0aW9uYWwgZ3JhbnRzIHRvIGFueSBSZWNpcGllbnQgKG90aGVyIHRoYW4KKyAgdGhvc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50KSBhcyBhIHJlc3VsdCBvZiBzdWNoIFJlY2lwaWVudCdzCisgIHJlY2VpcHQgb2YgdGhlIFByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UKKyAgKGlmIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAzKS4KKworMy4gUkVRVUlSRU1FTlRTCisKKzMuMSBJZiBhIENvbnRyaWJ1dG9yIERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtIGluIGFueSBmb3JtLCB0aGVuOgorCisgIGEpIHRoZSBQcm9ncmFtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBhcyBTb3VyY2UgQ29kZSwgaW4KKyAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgIHRoZSBQcm9ncmFtIHdpdGggYSBzdGF0ZW1lbnQgdGhhdCB0aGUgU291cmNlIENvZGUgZm9yIHRoZSBQcm9ncmFtCisgIGlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGluZm9ybXMgUmVjaXBpZW50cyBob3cgdG8KKyAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZTsgYW5kCisKKyAgYikgdGhlIENvbnRyaWJ1dG9yIG1heSBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIHVuZGVyIGEgbGljZW5zZQorICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgIGkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCisgICAgIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kCisgICAgIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcworICAgICBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKKyAgICAgaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCisgICAgIGlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cycgcmlnaHRzCisgICAgIGluIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBzZWN0aW9uIDMuMjsgYW5kCisKKyAgICAgaXYpIHJlcXVpcmVzIGFueSBzdWJzZXF1ZW50IGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbnkKKyAgICAgcGFydHkgdG8gYmUgdW5kZXIgYSBsaWNlbnNlIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMKKyAgICAgb2YgdGhpcyBzZWN0aW9uIDMuCisKKzMuMiBXaGVuIHRoZSBQcm9ncmFtIGlzIERpc3RyaWJ1dGVkIGFzIFNvdXJjZSBDb2RlOgorCisgIGEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIG9yIGlmIHRoZQorICBQcm9ncmFtIChpKSBpcyBjb21iaW5lZCB3aXRoIG90aGVyIG1hdGVyaWFsIGluIGEgc2VwYXJhdGUgZmlsZSBvcgorICBmaWxlcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBhIFNlY29uZGFyeSBMaWNlbnNlLCBhbmQgKGlpKSB0aGUgaW5pdGlhbAorICBDb250cmlidXRvciBhdHRhY2hlZCB0byB0aGUgU291cmNlIENvZGUgdGhlIG5vdGljZSBkZXNjcmliZWQgaW4KKyAgRXhoaWJpdCBBIG9mIHRoaXMgQWdyZWVtZW50LCB0aGVuIHRoZSBQcm9ncmFtIG1heSBiZSBtYWRlIGF2YWlsYWJsZQorICB1bmRlciB0aGUgdGVybXMgb2Ygc3VjaCBTZWNvbmRhcnkgTGljZW5zZXMsIGFuZAorCisgIGIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mCisgIHRoZSBQcm9ncmFtLgorCiszLjMgQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCwKK3RyYWRlbWFyaywgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zCitvZiBsaWFiaWxpdHkgKCJub3RpY2VzIikgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbSBmcm9tIGFueSBjb3B5IG9mCit0aGUgUHJvZ3JhbSB3aGljaCB0aGV5IERpc3RyaWJ1dGUsIHByb3ZpZGVkIHRoYXQgQ29udHJpYnV0b3JzIG1heSBhZGQKK3RoZWlyIG93biBhcHByb3ByaWF0ZSBub3RpY2VzLgorCis0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgorCitDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcword2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCitsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLAordGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMKK3RoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5CitvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLAorZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMKK2FuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0KK2luIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdAorYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkCitpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCit3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLAorYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55CityZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CitwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKK2Fsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KK2RlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvCitwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5Cit0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQKK1BFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVywgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIgorQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUgorSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgorVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCithcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwKK3Jpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMKK29yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQKK1BFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVywgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMKK1NIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCitFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUCitQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCitDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUKK0VYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlcgorYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCitQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlCitvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MKK3JpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YKK3RpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlCithbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4KK0hvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKK2dyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCitidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZAorbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZAorcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24KK2lzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlCityZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZQorZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nCit2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCitEaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzCityZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsCitDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cworQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQKK3JlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKK2VzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQKK3VuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAordG8gYmUgZW5mb3JjZWFibGUgYnkgYW55IGVudGl0eSB0aGF0IGlzIG5vdCBhIENvbnRyaWJ1dG9yIG9yIFJlY2lwaWVudC4KK05vIHRoaXJkLXBhcnR5IGJlbmVmaWNpYXJ5IHJpZ2h0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGlzIEFncmVlbWVudC4KKworRXhoaWJpdCBBIC0gRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlCisKKyJUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcKK1NlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGgKK2luIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2LiAyLjAgYXJlIHNhdGlzZmllZDoge25hbWUgbGljZW5zZShzKSwKK3ZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uIgorCisgIFNpbXBseSBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgdGhpcyBFeGhpYml0IEEKKyAgaXMgbm90IHN1ZmZpY2llbnQgdG8gbGljZW5zZSB0aGUgU291cmNlIENvZGUgdW5kZXIgU2Vjb25kYXJ5IExpY2Vuc2VzLgorCisgIElmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyCisgIGZpbGUsIHRoZW4gWW91IG1heSBpbmNsdWRlIHRoZSBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhIExJQ0VOU0UKKyAgZmlsZSBpbiBhIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvCisgIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuCisKKyAgWW91IG1heSBhZGQgYWRkaXRpb25hbCBhY2N1cmF0ZSBub3RpY2VzIG9mIGNvcHlyaWdodCBvd25lcnNoaXAuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvTk9USUNFLnR4dCBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjgxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvTk9USUNFLnR4dApAQCAtMCwwICsxLDM4MiBAQAorIyBOb3RpY2VzIGZvciBFY2xpcHNlIE1ETXxCTAorCitUaGlzIGNvbnRlbnQgaXMgcHJvZHVjZWQgYW5kIG1haW50YWluZWQgYnkgdGhlIEVjbGlwc2UgTURNfEJMIHByb2plY3QsCitpdCBpcyBhIHByb2plY3Qgb2YgdGhlIG9wZW5NRE0oUikgRWNsaXBzZSBXb3JraW5nIEdyb3VwLgorCisqIFByb2plY3QgaG9tZTogaHR0cHM6Ly9wcm9qZWN0cy5lY2xpcHNlLm9yZy9wcm9qZWN0cy90ZWNobm9sb2d5Lm1kbWJsCisKKyMjIFRyYWRlbWFya3MKKworRWNsaXBzZSBNRE18QkwsIE1ETXxCTCBhbmQgRWNsaXBzZSBvcGVuTURNKFIpIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcworb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbi4KKworIyMgQ29weXJpZ2h0CisKK0FsbCBjb250ZW50IGlzIHRoZSBwcm9wZXJ0eSBvZiB0aGUgZm9sbG93aW5nIHJlc3BlY3RpdmUgYXV0aG9ycyBvciB0aGVpciBlbXBsb3llcnMuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYXV0aG9yc2hpcCBvZiBjb250ZW50LCBwbGVhc2UgY29uc3VsdCB0aGUgbGlzdGVkCitzb3VyY2UgY29kZSByZXBvc2l0b3J5IGxvZ3MuCisKK0NvcHlyaWdodCAoYykgMjAxNi0yMDE5IEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICitDb3B5cmlnaHQgKGMpIDIwMTYtMjAyMCBQZWFrIFNvbHV0aW9uIEdtYkgKK0NvcHlyaWdodCAoYykgMjAxNy0yMDE4IHNjaWVuY2UgKyBjb21wdXRpbmcgQUcgVHVlYmluZ2VuIChBVE9TIFNFKQorQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggQ2Fub28gRW5naW5lZXJpbmcgQUcKK0NvcHlyaWdodCAoYykgMjAxNyBGbG9yaWFuIFNjaG1pdHQKK0NvcHlyaWdodCAoYykgMjAxNy0yMDIwIEFuZ2VsaWthIFdpdHRlaworQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgRWxla3Ryb25pc2NoZSBGYWhyd2Vya3N5c3RlbWUgR01CSAorQ29weXJpZ2h0IChjKSAyMDE4LTIwMjAgS2FyYWt1biBBRworQ29weXJpZ2h0IChjKSAyMDE4LTIwMjAgQWxleGFuZGVyIE5laG1lcgorCisjIyBEZWNsYXJlZCBQcm9qZWN0IExpY2Vuc2VzCisKK1RoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQordGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorCisjIyBTb3VyY2UgQ29kZQorCitUaGUgcHJvamVjdCBtYWludGFpbnMgdGhlIGZvbGxvd2luZyBzb3VyY2UgY29kZSByZXBvc2l0b3JpZXM6CisKK29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5naXQJICAgIC0gVGhlIG9wZW5NRE0oUikgQVBJLgorb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0LmdpdAkgICAgLSBFeHRlbnNpb24gb2YgdGhlIG9wZW5NRE0oUikgQVBJIGNvbnRhaW5pbmcgZGVmYXVsdCBlbGVtZW50cy4KK29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5naXQJLSBPRFMgaW1wbGVtZW50YXRpb24gb2YgcGVyc2lzdGVuY2UgYWRhcHRlci4KK29yZy5lY2xpcHNlLm1kbS5udWNsZXVzLmdpdAkgICAgICAgIC0gQ29yZSBidWlsZGluZyBibG9ja3MgZm9yIHRoZSBvcGVuTURNIEJ1c2luZXNzIExvZ2ljIGFuZCBXZWIgRnJvbnRlbmQuCisKKyMjIFRoaXJkLXBhcnR5IENvbnRlbnQKKworVGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4KK0lmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZworaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0bwordGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuCisKK2FudGxyNC00LjUuMy5qYXIoMi41LjMpCisgICAgKiBMaWNlbnNlOiBOZXcgQlNEIGxpY2Vuc2UKKworYW9wYWxsaWFuY2UtcmVwYWNrYWdlZC0yLjUuMC1iMDUuamFyICgyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2NvbW1vbnMtY29kZWMtMS4yLmphciAoMS4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitjb21tb25zLWh0dHBjbGllbnQtMy4xLmphciAgKDMuMSkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworY29tbW9ucy1sYW5nMy0zLjguMS5qYXIgKDMuOC4xKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitjb21tb25zLXRleHQtMS42LmphciAoMS42KQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitnc29uLTIuNy5qYXIgKDIuNykKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworR29vZ2xlIEd1YXZhIFZlcnNpb246IDI1LjAtanJlICAoMjUuMCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworR3JhZGxlIFdyYXBwZXIgKDQuMTAuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworaGsyLWFwaS0yLjUuMC1iMDUuamFyICgyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMLTEuMQorCitoazItbG9jYXRvci0yLjUuMC1iMDUuamFyKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworaGsyLXV0aWxzLTIuNS4wLWIwNS5qYXIgKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworamFja3Nvbi1hbm5vdGF0aW9ucy0yLjkuMC5qYXIgICgyLjkuMCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1jb3JlLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1kYXRhYmluZC0yLjkuMi5qYXIgICgyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1qYXhycy1iYXNlLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1qYXhycy1qc29uLXByb3ZpZGVyLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1tb2R1bGUtamF4Yi1hbm5vdGF0aW9ucy0yLjkuMi5qYXIgICgyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamF2YXNzaXN0LTMuMjAuMC1HQS5qYXIgICgyLjIwLjAtR0EpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgMi4wCisKK2pjbC1vdmVyLXNsZjRqLTEuNy4yNS5qYXIoMS43LjI1KQorICAgICogTGljZW5zZTogTUlUIExpY2Vuc2UKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly93d3cuc2xmNGoub3JnL2xpY2Vuc2UuaHRtbAorICAgICogUHJvamVjdCBVUkw6ICBodHRwczovL3d3dy5zbGY0ai5vcmcKKyAgICAqIFNvdXJjZSBVUkw6ICAgaHR0cHM6Ly9naXRodWIuY29tL3Fvcy1jaC9zbGY0agorCitqZXJzZXktY2xpZW50LTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1jb21tb24tMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktY29udGFpbmVyLXNlcnZsZXQtMi4yMy4yLmphciAgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUtMi4yMy4zLmphcigyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1ndWF2YS0yLjIzLjIuamFyICAoMi4yMy4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqZXJzZXktbWVkaWEtamF4Yi0yLjIzLjIuamFyKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LW1lZGlhLXNzZS0yLjIzLjIuamFyICgyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1tZWRpYS1tdWx0aXBhcnQtMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktc2VydmVyLTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworbG9nNGotb3Zlci1zbGY0ai0xLjcuMjUuamFyICgxLjcuMjUpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK2xvZ2JhY2stY2xhc3NpYy0xLjIuMy5qYXIoMS4yLjMpCisgICAgKiBMaWNlbnNlOiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDEuMAorCitsb2diYWNrLWNvcmUtMS4yLjMuamFyKDEuMi4zKQorICAgICogTGljZW5zZTogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAxLjAKKworbWltZXB1bGwtMS45LjYuamFyICgxLjkuNCkKKyAgICAqIExpY2Vuc2U6IENEREwKKworb3BlbmF0ZngtMC43LjQuamFyICgwLjcuNCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworb3NnaS1yZXNvdXJjZS1sb2NhdG9yLTEuMC4xLmphcigxLjAuMSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworcHJvdG9idWYtamF2YS0zLjIuMC5qYXIgKDMuMi4wKQorICAgICogTGljZW5zZTogTmV3IEJTRCBsaWNlbnNlCisKK3Byb3RvYnVmLWphdmEtdXRpbC0zLjIuMC5qYXIgICgzLjIuMCkKKyAgICAqIExpY2Vuc2U6IE5ldyBCU0QgbGljZW5zZQorCitzd2FnZ2VyLWFubm90YXRpb25zLTIuMC44LmphciAoMi4wLjgpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK3N3YWdnZXItdWktMy4yMy4wLmphciAoMy4yMy4wKQorICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorCitzbGY0ai1hcGktMS43LjI1LmphciAgKDEuNy4yNSkKKyAgICAqIExpY2Vuc2U6IE1JVCBsaWNlbnNlCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vd3d3LnNsZjRqLm9yZy9saWNlbnNlLmh0bWwKKyAgICAqIFByb2plY3QgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vcW9zLWNoL3NsZjRqCisgICAgKiBTb3VyY2UgVVJMOiAgaHR0cHM6Ly9naXRodWIuY29tL3Fvcy1jaC9zbGY0ai9yZWxlYXNlcy90YWcvdl8xLjcuMjUKKworc3RheDItYXBpLTMuMS40LmphciAoMy4xLjQpCisgICAgKiBMaWNlbnNlOiBCU0QtMi1DbGF1c2UKKwordmFsaWRhdGlvbi1hcGktMS4xLjAuRmluYWwuamFyICgxLjEuMC5GaW5hbCkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK3ZhdnItMC45LjEtc291cmNlcy5qYXIgKDAuOS4xKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKwordmF2ci1tYXRjaC0wLjkuMS5qYXIgKDAuOS4xKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKword29vZHN0b3gtY29yZS1hc2wtNC40LjEuamFyICg0LjQuMSkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKKworRkZBTUZBTUZBTSBTaWxrIEljb24sIFZlcnNpb24gMS4zCisgICAgKiBMaWNlbnNlOiBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBMaWNlbnNlCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvCisgICAgKiBQcm9qZWN0OiBodHRwOi8vd3d3LmZhbWZhbWZhbS5jb20vbGFiL2ljb25zL3NpbGsvCisgICAgKiBTb3VyY2U6ICBodHRwOi8vd3d3LmZhbWZhbWZhbS5jb20vbGFiL2ljb25zL3NpbGsvCisKK0Bhbmd1bGFyL2FuaW1hdGlvbnM6Ny4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pby9hcGkvYW5pbWF0aW9ucworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvY2RrOjcuMS4xCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8vYXBpCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjEuMQorCisKK0Bhbmd1bGFyL2NvbW1vbkA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40cgorCitAYW5ndWxhci9jb21waWxlckA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9jb3JlQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2Zvcm1zQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2h0dHBANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvcm91dGVyQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK2Jvb3RzdHJhcEA0LjEuMworICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcAorCitjbGFzcy10cmFuc2Zvcm1lckAwLjEuNgorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlc3RhY2svY2xhc3MtdHJhbnNmb3JtZXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3BsZWVyb2NrL2NsYXNzLXRyYW5zZm9ybWVyCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcGxlZXJvY2svY2xhc3MtdHJhbnNmb3JtZXIKKworY29yZS1qc0AyLjYuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3Jhdy9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3JlbGVhc2VzL3RhZy92Mi42LjAKKworZmlsZS1zYXZlckAxLjMuMworICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcy9yYXcvbWFzdGVyL0xJQ0VOU0UubWQKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzCisKK2ZvbnQtYXdlc29tZUA0LjcuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3J0QXdlc29tZS9Gb250LUF3ZXNvbWUvYmxvYi9tYXN0ZXIvTElDRU5TRS50eHQKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tLworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL0ZvcnRBd2Vzb21lL0ZvbnQtQXdlc29tZQorCituZzItc3BsaXQtcGFuZUAxLjMuMQorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS93YW5uYWJlZ2Vlay9uZzItc3BsaXQtcGFuZS9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS93YW5uYWJlZ2Vlay9uZzItc3BsaXQtcGFuZQorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3dhbm5hYmVnZWVrL25nMi1zcGxpdC1wYW5lCisKK25neC1ib290c3RyYXBAMy4xLjIKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vdmFsb3Itc29mdHdhcmUvbmd4LWJvb3RzdHJhcC9ibG9iL3YzLjEuMi9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL3ZhbG9yLXNvZnR3YXJlLmNvbS9uZ3gtYm9vdHN0cmFwCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vdmFsb3Itc29mdHdhcmUvbmd4LWJvb3RzdHJhcC90cmVlL3YzLjEuMgorCitAbmd4LXRyYW5zbGF0ZS9jb3JlQDExLjAuMQorICAgICogTGljZW5zZTogTUlUIAorICAgICogTGljZW5jZSBQYXRoOiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2NvcmUvYmxvYi92MTEuMC4xL0xJQ0VOU0UgIAorICAgICogUHJvamVjdCBVUkw6ICAgIGh0dHA6Ly93d3cubmd4LXRyYW5zbGF0ZS5jb20vCisgICAgKiBTb3VyY2UgVVJMOiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvY29yZQorCitAbmd4LXRyYW5zbGF0ZS9odHRwLWxvYWRlckA0LjAuMAorICAgICogTGljZW5zZTogTUlUIAorICAgICogTGljZW5jZSBQYXRoOiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2h0dHAtbG9hZGVyL2Jsb2IvdjQuMC4wL0xJQ0VOU0UgIAorICAgICogUHJvamVjdCBVUkw6ICAgIGh0dHA6Ly93d3cubmd4LXRyYW5zbGF0ZS5jb20vCisgICAgKiBTb3VyY2UgVVJMOiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvaHR0cC1sb2FkZXIvdHJlZS92NC4wLjAKKworcHJpbWVpY29uczoxLjAuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1laWNvbnMvYmxvYi8xLjAuMC9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL3d3dy5wcmltZWZhY2VzLm9yZy9wcmltZW5nCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZWljb25zL3RyZWUvMS4wLjAKKworcHJpbWVuZ0A3LjAuMQorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1lbmcvYmxvYi83LjAuMS9MSUNFTlNFLm1kCisgICAgKiBQcm9qZWN0OiBodHRwczovL3d3dy5wcmltZWZhY2VzLm9yZy9wcmltZW5nCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZW5nL3RyZWUvNy4wLjEKKworcnhqc0A2LjMuMworICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorICAgICogUHJvamVjdDogaHR0cHM6Ly9yeGpzLWRldi5maXJlYmFzZWFwcC5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvdHJlZS82LjMuMworCityeGpzLWNvbXBhdDo2LjMuMworICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorICAgICogUHJvamVjdDogaHR0cHM6Ly9yeGpzLWRldi5maXJlYmFzZWFwcC5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvdHJlZS82LjMuMy9jb21wYXQKKwordHNsaWJAMS45LjAKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdHNsaWIKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdHNsaWIvdHJlZS8xLjkuMAorCit6b25lLmpzQDAuOC4yNgorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvcmF3L21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhcgorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9yZWxlYXNlcy90YWcvdjAuOC4yNgorCitPTUcgRXZlbnQgU2VydmljZSBTcGVjaWZpY2F0aW9uICgxLjIpCisKKyogTGljZW5zZTogTGljZW5zZVJlZiAtIE9iamVjdC1NYW5hZ2VtZW50LUdyb3VwLUxpY2Vuc2UKKyogUHJvamVjdDogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL0VWTlQvMS4yLworKiBTb3VyY2U6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9FVk5ULzEuMi9wZGYKKworT01HIE5vdGlmaWNhdGlvbiBTZXJ2aWNlIFNwZWNpZmljYXRpb24gKDEuMSkKKworKiBMaWNlbnNlOiBMaWNlbnNlUmVmIC0gT2JqZWN0LU1hbmFnZW1lbnQtR3JvdXAtTGljZW5zZQorKiBQcm9qZWN0OiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvTk9ULworKiBTb3VyY2U6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9OT1QvMS4xL1BERgorCitvZHM1MzAuaWRsCitEYXRlOiBIb2VoZW5raXJjaGVuLCAwNi8wMS8yMDE2CisiVGhlIEFTQU0gQm9hcmQgb2YgRGlyZWN0b3JzIHJlbGVhc2VzIHRoZSBJREwgZmlsZXMgZm9yIHVzZSB1bmRlciB0aGUgRVBMIHRvIHRoZSBFY2xpcHNlIElXRyBvcGVuTURNLgorVGhpcyBpcyB2YWxpZCBmb3IgYWxsIHZlcnNpb25zIG9mIEFTQU0gT0RTIDUuMy54LgorVGhpcyBwZXJtaXNzaW9uIGlzIHZhbGlkIHVuZGVyIHRoZSBjb25kaXRpb25zIG9mIEVjbGlwc2Ugd2lsbCBub3QgbW9kaWZ5IHRoZSBmaWxlLiIKKworQXZhbG9uRXZlbnQuaWRsLCBDb3JiYUZpbGVTZXJ2ZXIuaWRsCitEYXRlOiAwOC8xNS8yMDE2CisiSGVyZXdpdGgsIHdlIHJlbGVhc2UgdGhlIGdlbmVyYXRlZCBDbGllbnQtU291cmNlLUNvZGUgZ2VuZXJhdGVkIGZyb20gb3VyIENPUkJBIElETHMsIG5hbWVseQorKiBDT1JCQU5vdGlmaWNhdGlvbiBTZXJ2aWNlIChnZW5lcmF0ZWQgZnJvbSDigJ5BdmFsb25FdmVudC5pZGzigJ0pCisqIENPUkJBRmlsZVNlcnZlciAoZ2VuZXJhdGVkIGZyb20g4oCeQ29yYmFGaWxlU2VydmVyLmlkbOKAnCksCitVbmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKS4gVGhpcyBhZ3JlZW1lbnQgZG9lcyBub3QgaW5jbHVkZSB0aGUg4oCeQXZhbG9uRXZlbnQuaWRs4oCcIGFuZAor4oCeQ29yYmFGaWxlU2VydmVyLmlkbOKAnCBpdHNlbGYsIHdoaWNoIHJlbWFpbiBwcm90ZWN0ZWQgcHJvcGVydHkgb2YgSGlnaFFTb2Z0LiAiCisKKyMjIENyeXB0b2dyYXBoeQorCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5CittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzCitwZXJtaXR0ZWQuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDdlYjFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL1JFQURNRS5tZApAQCAtMCwwICsxLDE2MyBAQAorIyBNRE01IEFQSSAjCisKKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHNlcnZpY2VzIGRlZmluZWQgaW4gdGhlIE1ETTUgQVBJLgorCisKKyMjIDEuIEludHJvZHVjdGlvbiAjIworCitUaGUgTURNNSBBUEkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwcm9qZWN0czoKKworCistICAgKipvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UqKlwKKyAgICBEZWZpbmVzIHRoZSBjb3JlIHNlcnZpY2VzIGFuZCBlbnRpdGllcy4gRW50aXRpZXMgY29udGFpbmVkIGluIHRoaXMKKyAgICBwcm9qZWN0IG11c3QgYmUgc3VwcG9ydGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuCisKKy0gICAqKm9yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdCoqXAorICAgIEV4dGVuZHMgdGhlIGNvcmUgQVBJIHdpdGggY2F0YWxvZyBhbmQgdGVtcGxhdGUgZW50aXRpZXMgdG8gb3JnYW5pemUKKyAgICB0aGUgc3RvcmFnZSBvZiBjb250ZXh0IGRhdGEuCisKKy0gICAqKm9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcioqXAorICAgIEltcGxlbWVudHMgYm90aCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UgYW5kIG9yZy5lY2xpcHNlLm1kbS5kZWZhdWx0CisgICAgdXNpbmcgdGhlIHF1ZXJ5IGJhc2VkIEFTQU0gT0RTIE9PIEFQSS4KKworCisjIyAyLiBFbnRpdHlNYW5hZ2VyICMjCisKK09uY2UgYSBjb25uZWN0aW9uIHRvIGEgcGVyc2lzdGVuY2UgKGUuZy4gT0RTIHNlcnZlcikgaXMgZXN0YWJsaXNoZWQsIHRoZQorZW50aXR5IG1hbmFnZXIgYWxsb3dzIHRvIGxvYWQgZW50aXRpZXMgb2YgYW55IGtpbmQgYW5kIHByb3ZpZGVzIGFjY2VzcwordG8gYXZhaWxhYmxlIHNlcnZpY2VzLgorCisKK1JldHVybmVkIGVudGl0aWVzIGFyZSBhbHdheXMgY29tcGxldGUuIFRoaXMgbWVhbnMgdGhleSBhcmUgbG9hZGVkIHdpdGgKK2FsbCBvZiB0aGVpciBwcm9wZXJ0aWVzIGFuZCByZWxhdGVkIGVudGl0aWVzIChhcyBleHBvc2VkIGJ5IHRoZWlyIEFQSSkuCitUaGVyZWZvcmUgaXQgZG9lcyBub3QgbWF0dGVyIGhvdyBlbnRpdGllcyBhcmUgcmV0cmlldmVkIChlLmcuIGVudGl0eQorbWFuYWdlciBvciBzZWFyY2ggc2VydmljZSkuIFRoZSBlbnRpdHkgbWFuYWdlciBwcm92aWRlcyB2YXJpb3VzIG1ldGhvZHMKK3RvIGxvYWQgaW5zdGFuY2VzIGJ5IHRoZWlyIGlkLCBsb2FkIHBhcmVudCBvciBjaGlsZCBlbnRpdGllcyBmb3IgYSBnaXZlbgorZW50aXR5IG9yIGZpbHRlciBsb2FkZWQgZW50aXRpZXMgd2l0aCBhIGdpdmVuIG5hbWluZyBwYXR0ZXJuLiBDb250ZXh0CitkYXRhIG1heSBiZSBsb2FkZWQgZm9yIFRlc3RTdGVwIG9yIE1lYXN1cmVtZW50IGVudGl0aWVzLgorCisKK01hc3MgZGF0YSBtYXkgYmUgbG9hZGVkIGJ5IGRlZmluaW5nIGEgY29ycmVzcG9uZGluZyByZXF1ZXN0LiBTdWNoIGEKK3JlcXVlc3QgY29uc2lzdHMgb2YgYSBDaGFubmVsR3JvdXAgYW5kIGEgc3Vic2V0IG9mIHJlbGF0ZWQgQ2hhbm5lbHMuCitGaW5hbGx5LCBhIHJhbmdlIGlzIGRlZmluZWQgdG8gbG9hZGVkIHN0b3JlZCB2YWx1ZXMgaXRlcmF0aXZlbHkgb3IgYWxsIGF0CitvbmNlLiBUaGlzIGFsbG93cyBhIGZpbmUgZ3JhaW5lZCBhY2Nlc3MgdG8gc3RvcmVkIG1hc3MgZGF0YS4KKworCisjIyMgMi4xLiBTZWFyY2hTZXJ2aWNlICMjIworCitUaGUgc2VhcmNoIHNlcnZpY2UgYWxsb3dzIHRvIHNlYXJjaCBmb3IgZW50aXRpZXMgbGlrZSBUZXN0LCBUZXN0U3RlcCwKK01lYXN1cmVtZW50IGFuZCBDaGFubmVsIGFjcm9zcyBoaWVyYXJjaGllcy4gU28gb25lIGNhbiwgZm9yIGV4YW1wbGUsCitzZWFyY2ggZm9yIFRlc3RzIGFuZCBhcHBseSBmaWx0ZXIgY3JpdGVyaWEgZm9yIGNvbnRleHQgZGF0YSBvZiByZWxhdGVkCitUZXN0U3RlcHMgYW5kIE1lYXN1cmVtZW50cyB3aXRob3V0IGRlZmluaW5nIGFueSBqb2lucy4gVGhpcyBpcyBkb25lIGJ5Cit0aGUgaW50ZXJuYWxseSB1c2VkIHNlYXJjaCBxdWVyaWVzLiBFYWNoIHNlYXJjaCBxdWVyeSBkZWZpbmVzIGEgc2V0IG9mCitzdXBwb3J0ZWQgZW50aXR5IHR5cGVzIGFuZCBoZW5jZSBhbGwgb2YgaXRzIGF0dHJpYnV0ZXMgbWF5IGJlIHVzZWQgZm9yCitzZWxlY3Rpb25zIG9yIGZpbHRlciBjcml0ZXJpYS4gVGhlIHNlYXJjaCBzZXJ2aWNlIGFsbG93cyB0byBxdWVyeQorcG9zc2libGUgZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBzdXBwb3J0ZWQgYXR0cmlidXRlLgorCisKK0luIGFkZGl0aW9uIHRvIHRoYXQgYSBxdWVyeSBzdHJpbmcgbWF5IGJlIHVzZWQgdG8gc2VhcmNoIGZvciBlbnRpdGllcy4KK1RoaXMgcXVlcnkgc3RyaW5nIGlzIGV2YWx1YXRhdGVkIGFuZCBwcm9jZXNzZWQgYnkgYSBmdWxsIHRleHQgc2VhcmNoCit3aGljaCByZXR1cm5zIGEgcmVzdWx0IGNvbnNpc3Rpbmcgb2YgVGVzdCwgVGVzdFN0ZXAgb3IgTWVhc3VyZW1lbnQKK2VudGl0aWVzLgorCisKKyMjIyAyLjIuIE5vdGlmaWNhdGlvbiAjIyMKKworVE9ETworCisKKyMjIyAyLjMuIEZpbGVTZXJ2aWNlICMjIworCitUaGUgZmlsZSBzZXJ2aWNlIG1heSBiZSB1c2VkIHRvIGRvd25sb2FkIGV4dGVybmFsbHkgbGlua2VkIGZpbGVzLCBxdWVyeQordGhlaXIgc2l6ZSBvciBvcGVuIGEgY29uc3VtYWJsZSBkb3dubG9hZCBzdHJlYW0gZm9yIGEgZ2l2ZW4gZXh0ZXJuYWxseQorbGlua2VkIGZpbGUuIFNlcXVlbnRpYWwgb3IgcGFyYWxsZWwgZG93bmxvYWQgb2YgbXVsdGlwbGUgZmlsZXMgaXMKK3Bvc3NpYmxlIGFzIHdlbGwuIEEgZG93bmxvYWQgcmVxdWVzdCB3aXRoIG11bHRpcGxlIGZpbGVzIG1heSBoYXZlCittdWx0aXBsZSBsaW5rcyB0byB0aGUgc2FtZSBmaWxlLiBJbiBzdWNoIGEgY2FzZSB0aGlzIGZpbGUgaXMgZG93bmxvYWRlZAorb25seSBvbmNlIGFuZCBhbGwgbGlua3Mgd2lsbCBwb2ludCB0byB0aGUgc2FtZSBsb2NhbCBjb3B5IG9mIHRoZQorZG93bmxvYWRlZCBmaWxlLiBTaW5jZSBkb3dubG9hZGluZyBsYXJnZSBmaWxlcyBtYXkgdGFrZSBpdHMgdGltZSB0bworY29tcGxldGUsIG9uZSBjYW4gcGFzcyBhIGxpc3RlbmVyIHRvIHRyYWNrIHRoZSBvdmVyYWxsIHByb2dyZXNzLgorCitOT1RFOgorPHByZT4KK1RoaXMgc2VydmljZSBkb2VzIG5vdCBhbGxvdyBtYW51YWxseSB1cGxvYWRpbmcgb3IgZGVsZXRpbmcgZmlsZXMuIEluc3RlYWQgCitmaWxlcyBhcmUgYXV0b21hdGljYWxseSB1cGxvYWRlZCAvIGRlbGV0ZWQgd2hpbGUgZW50aXRpZXMgYXJlIHdyaXR0ZW4gCit3aXRoaW4gYSBTZWN0aW9uIDIuNSwgIlRyYW5zYWN0aW9uIi4KKzwvcHJlPgorCisjIyMgMi40LiBFbnRpdHlGYWN0b3J5ICMjIworCitUaGUgZW50aXR5IGZhY3RvcnkgaXMgdGhlIG9ubHkgd2F5IHRvIGNyZWF0ZSBuZXcgZW50aXRpZXMuIEVhY2ggZW50aXR5CityZXR1cm5lZCBieSB0aGlzIHNlcnZpY2UgaXMgY29uc2lkZXJlZCB0byBiZSB2aXJ0dWFsLCBzaW5jZSBpdCBkb2VzIG5vdAoraGF2ZSBhbiBpZCB1bnRpbCBpdCBpcyB3cml0dGVuLiBFbnRpdGllcyB3aXRoIGluZm9ybWF0aW9uYWwgcmVsYXRpb25zCitsaWtlIFF1YW50aXR5IChyZWZlcmVuY2VzIGEgVW5pdCkgb3IgVW5pdCAocmVmZXJlbmNlcyBhCitQaHlzaWNhbERpbWVuc2lvbikgbWF5IG9ubHkgcmVmZXJlbmNlIGFscmVhZHkgcGVyc2lzdGVkIGVudGl0aWVzLiBUaGlzCittZWFucyB0aGF0IGEgbmV3IFF1YW50aXR5IG1heSBvbmx5IGJlIGNyZWF0ZWQgd2l0aCBhbiBhbHJlYWR5IHBlcnNpc3RlZAorVW5pdCBhbmQgYSBuZXcgVW5pdCBtYXkgb25seSBiZSBjcmVhdGVkIHdpdGggYW4gYWxyZWFkeSBwZXJzaXN0ZWQKK1BoeXNpY2FsRGltZW5zaW9uLgorCisKK09uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgcGFyZW50IC8gY2hpbGQgdHJlZXMKK2NvbnNpc3Rpbmcgb2YgdmlydHVhbCBvciBwZXJzaXN0ZWQgZW50aXRpZXMgKHBhcmVudCBhbmQgY2hpbGQgZW50aXRpZXMKK2FyZSBpbnRlcm5hbGx5IGxpbmtlZCB0b2dldGhlcikuIFdpdGhpbiBhIHRyYW5zYWN0aW9uIHN1Y2ggdHJlZXMgYXJlCityZWN1cnNpdmVseSBwcm9jZXNzZWQsIHRoZXJlZm9yZSBpdCBpcyBub3QgcmVxdWlyZWQgdG8gZXhwbGljaXRseQorY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIGNoaWxkIGVudGl0aWVzLCBpbnN0ZWFkIGl0IGlzIHN1ZmZpY2llbnQgYW5kCitoaWdobHkgcmVjb21tZW5kZWQgdG8gd3JpdGUgb25seSB0aGUgcm9vdCBlbnRpdHkgb2YgdGhlIHRyZWUocykuIFRoZQordHJhbnNhY3Rpb24gc2VydmljZSByZWN1cnNpdmVseSByZXNvbHZlcyBzdWNoIHRyZWVzIGFuZCBleGVjdXRlcyBiYXRjaAoraW5zZXJ0LSwgdXBkYXRlLSBvciBkZWxldGUtc3RhdGVtZW50cyBmb3IgdGhlIGNoaWxkcmVuLgorCisKKyMjIyAyLjUuIFRyYW5zYWN0aW9uICMjIworCitUaGUgdHJhbnNhY3Rpb24gc2VydmljZSBlZmZlY3RpdmVseSBtb2RpZmllcyB0aGUgc3RvcmVkIGNvbnRlbnRzLgorRW50aXRpZXMgYXJlIGdyb3VwZWQgYnkgdGhlaXIgdHlwZSBiZWZvcmUgdGhleSBhcmUgcHJvY2Vzc2VkLiBFYWNoIGdyb3VwCitpcyBwcm9jZXNzZWQgYXQgb25jZSB3aXRoIGEgYmF0Y2ggc3RhdGVtZW50LiBFYWNoIHdyaXR0ZW4gZW50aXR5IGlzCitzY2FubmVkIGZvciBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcy4gTmV3IG9uZXMgYXJlIGF1dG9tYXRpY2FsbHkgdXBsb2FkZWQsCit3aGlsZSByZW1vdmVkIG9uZXMgYXJlIGRlbGV0ZWQuIEluIGNhc2Ugb2YgZXJyb3JzIGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlCitwZXJzaXN0ZW5jZSBhcmUgY2FuY2VsbGVkIGFuZCBoZW5jZSBhbnkgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIGZpbGUgaGFzIHRvCitiZSBkZWxldGVkLiBVbmZvcnR1bmF0ZWx5LCB0aGUgcmVtb3ZhbCBvZiB1cGxvYWRlZCBmaWxlcyBjYW5ub3QgYmUKK2d1YXJhbnRlZWQgKGUuZy4gYSBicm9rZW4gY29ubmVjdGlvbiksIGluc3RlYWQgYSBkZWxldGUgcmVxdWVzdCBmb3IgdGhlCit1cGxvYWRlZCBmaWxlcyBpcyBzZW5kIG9uIGEgYmVzdCBlZmZvcnQgYmFzaXMuCisKK0lNUE9SVEFOVDoKKzxwcmU+CitFeHRlcm5hbGx5IGxpbmtlZCBmaWxlcyBvZiBkZWxldGVkIGVudGl0aWVzIGFyZSBvbmx5IHJlbW92ZWQgaWYgdGhlCitlbnRpdHkgaXMgYW4gaW5zdGFuY2Ugb2YgRmlsZXNBdHRhY2hhYmxlIChUZXN0LCBUZXN0U3RlcCwgTWVhc3VyZW1lbnQpLgorSW4gYW55IG90aGVyIGNhc2UsIGV4dGVybmFsbHkgbGlua2VkIGZpbGVzIGFyZSBub3QgcmVtb3ZlZCBzaW5jZSB0aGlzIAorbWF5IGhhdmUgYW4gaW1wYWN0IG9uIG90aGVyIGVudGl0aWVzIHdoaWNoIHJlZmVyZW5jZSB0aGUgc2FtZSBmaWxlLgorPC9wcmU+CisKK0Jlc2lkZXMgdGhlIG1vZGlmaWNhdGlvbiBvZiBlbnRpdGllcywgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgbWFzcyBkYXRhCitieSBkZWZpbmluZyB3cml0ZSByZXF1ZXN0cy4gQSB3cml0ZSByZXF1ZXN0IGRlc2NyaWJlcyBpbiBkZXRhaWwgaG93IHRoZQorbWFzcyBkYXRhIG9mIGEgQ2hhbm5lbCBpcyBvcmdhbml6ZWQgKGUuZy4gdmFsdWVzIGFyZSBleHBsaWNpdCBvcgorZ2VuZXJhdGVkLCBzdG9yZWQgaW4gZXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMgZXRjLikuCisKKworCisjIyAzLiBDb25uZWN0IHRvIGFuIE9EUyBTZXJ2ZXIgIyMKKworVGhlIE9EUyBlbnRpdHkgbWFuYWdlciBmYWN0b3J5IGlzIHVzZWQgdG8gY29ubmVjdCB0byBhbiBPRFMgc2VydmVyLiBJdAordGFrZXMgcGFyYW1ldGVycywgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3csIHRvIGVzdGFibGlzaCBhCitjb25uZWN0aW9uLiBPbiBzdWNjZXNzIGFuIGVudGl0eSBtYW5hZ2VyIGlzIHJldHVybmVkLgorCisKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgIGNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChPRFNFbnRpdHlNYW5hZ2VyRmFjdG9yeS5QQVJBTV9OQU1FU0VSVklDRSwgImNvcmJhbG9jOjoxLjJAPFNFUlZFUj46PFBPUlQ+L05hbWVTZXJ2aWNlIik7CisgICAgY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KE9EU0VudGl0eU1hbmFnZXJGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FLCAiPFNFUlZJQ0U+LkFTQU0tT0RTIik7CisgICAgY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KE9EU0VudGl0eU1hbmFnZXJGYWN0b3J5LlBBUkFNX1VTRVIsICJzYSIpOworICAgIGNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChPRFNFbnRpdHlNYW5hZ2VyRmFjdG9yeS5QQVJBTV9QQVNTV09SRCwgInNhIik7CisgICAgRW50aXR5TWFuYWdlciBlbnRpdHlNYW5hZ2VyID0gbmV3IE9EU0VudGl0eU1hbmFnZXJGYWN0b3J5KCkuY29ubmVjdChjb25uZWN0aW9uUGFyYW1ldGVycyk7CisgICAgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bAorICAgIGVudGl0eU1hbmFnZXIuY2xvc2UoKTsKKworIyMgNC4gQ29weXJpZ2h0IGFuZCBMaWNlbnNlICMjCitDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorCisgU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorCisgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL2J1aWxkLmdyYWRsZSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwMzkxYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9idWlsZC5ncmFkbGUKQEAgLTAsMCArMSwxOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZGVzY3JpcHRpb24gPSAnTURNIEFQSSAtIE9EU0FkYXB0ZXInCitncm91cCA9ICdvcmcuZWNsaXBzZS5tZG0nCit2ZXJzaW9uID0gJzUuMS4wTTgnCisKK2FwcGx5IHBsdWdpbjogJ2phdmEnCithcHBseSBwbHVnaW46ICdtYXZlbicKK2FwcGx5IHBsdWdpbjogJ2VjbGlwc2UnCithcHBseSBwbHVnaW46ICdjb20uZ29vZ2xlLnByb3RvYnVmJworCitidWlsZHNjcmlwdCB7CisJcmVwb3NpdG9yaWVzIHsKKwkJbWF2ZW5DZW50cmFsKCkKKwl9CisJZGVwZW5kZW5jaWVzIHsKKwkJY2xhc3NwYXRoICdjb20uZ29vZ2xlLnByb3RvYnVmOnByb3RvYnVmLWdyYWRsZS1wbHVnaW46MC44LjEnCisJfQorfQorCityZXBvc2l0b3JpZXMgeworCWpjZW50ZXIoKQorCW1hdmVuTG9jYWwoKQorCW1hdmVuQ2VudHJhbCgpCit9CisKK3NvdXJjZVNldHMgeworCisJZ2VuZXJhdGVkIHsKKwkJamF2YSB7CisJCQlzcmNEaXIgJ3NyYy9nZW4vamF2YScKKwkJCXNyY0RpciAnYnVpbGQvZ2VuZXJhdGVkL3NvdXJjZS9wcm90by9tYWluL2phdmEnCisJCX0KKwl9CisKKwltYWluIHsKKwkJY29tcGlsZUNsYXNzcGF0aCArPSBnZW5lcmF0ZWQub3V0cHV0CisJCXJ1bnRpbWVDbGFzc3BhdGggKz0gZ2VuZXJhdGVkLm91dHB1dAorCX0KKworCXRlc3QgeworCQljb21waWxlQ2xhc3NwYXRoICs9IGdlbmVyYXRlZC5vdXRwdXQKKwkJcnVudGltZUNsYXNzcGF0aCArPSBnZW5lcmF0ZWQub3V0cHV0CisJfQorfQorCitjb25maWd1cmF0aW9ucy5hbGwgeworCWV4Y2x1ZGUgZ3JvdXA6ICdqYXZheC5pbmplY3QnLCBtb2R1bGU6ICdqYXZheC5pbmplY3QnCisJZXhjbHVkZSBncm91cDogJ2NvbW1vbnMtbG9nZ2luZycsIG1vZHVsZTogJ2NvbW1vbnMtbG9nZ2luZycKKwkKKwkvLyBleGNsdWRlIGd1YXZhIGRlcGVuZGVuY2llcworCWV4Y2x1ZGUgZ3JvdXA6ICdjb20uZ29vZ2xlLmNvZGUuZmluZGJ1Z3MnLCBtb2R1bGU6ICdqc3IzMDUnCisJZXhjbHVkZSBncm91cDogJ2NvbS5nb29nbGUuZXJyb3Jwcm9uZScsIG1vZHVsZTogJ2Vycm9yX3Byb25lX2Fubm90YXRpb25zJworCWV4Y2x1ZGUgZ3JvdXA6ICdjb20uZ29vZ2xlLmoyb2JqYycsIG1vZHVsZTogJ2oyb2JqYy1hbm5vdGF0aW9ucycKKwlleGNsdWRlIGdyb3VwOiAnb3JnLmNvZGVoYXVzLm1vam8nLCBtb2R1bGU6ICdhbmltYWwtc25pZmZlci1hbm5vdGF0aW9ucycKKwlleGNsdWRlIGdyb3VwOiAnb3JnLmNoZWNrZXJmcmFtZXdvcmsnLCBtb2R1bGU6ICdjaGVja2VyLWNvbXBhdC1xdWFsJworfQorCitkZXBlbmRlbmNpZXMgeworCWNvbXBpbGVPbmx5ICdqYXZheDpqYXZhZWUtYXBpOjcuMCcKKworCS8vIGxvZ2dpbmcKKwljb21waWxlICdvcmcuc2xmNGo6c2xmNGotYXBpOjEuNy4yNScKKwkvLyBodHRwY2xpZW50IHVzZXMgY29tbW9ucy1sb2dnaW5nCisJY29tcGlsZSAnb3JnLnNsZjRqOmpjbC1vdmVyLXNsZjRqOjEuNy4yNScKKworCS8vIE1ETTUgQVBJCisJY29tcGlsZSAib3JnLmVjbGlwc2UubWRtOm9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZToke3ZlcnNpb259IgorCWNvbXBpbGUgIm9yZy5lY2xpcHNlLm1kbTpvcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQ6JHt2ZXJzaW9ufSIKKworCS8vIGNvbXBpbGUgQ09SQkEgaWRsIHVzaW5nIEpESyB0b29scworCWdlbmVyYXRlZENvbXBpbGUgZmlsZXMoU3lzdGVtLmdldGVudignSkFWQV9IT01FJykgKyAnL2xpYi90b29scy5qYXInKQorICAgIGdlbmVyYXRlZENvbXBpbGUgZmlsZXMoJ3NyYy9tYWluL2lkbC8nKQorICAgIAorCS8vIFBlYWsgbm90aWZpY2F0aW9uIHNlcnZpY2UKKwljb21waWxlICdjb20uZ29vZ2xlLnByb3RvYnVmOnByb3RvYnVmLWphdmE6My4yLjAnCisJY29tcGlsZSAnY29tLmdvb2dsZS5wcm90b2J1Zjpwcm90b2J1Zi1qYXZhLXV0aWw6My4yLjAnCisJY29tcGlsZSAnY29tLmdvb2dsZS5ndWF2YTpndWF2YToyNS4wLWpyZScKKwljb21waWxlICdvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlOmplcnNleS1jbGllbnQ6Mi4yMy4yJworCWNvbXBpbGUgJ29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhOmplcnNleS1tZWRpYS1zc2U6Mi4yMy4yJworCWdlbmVyYXRlZENvbXBpbGUgJ2NvbS5nb29nbGUucHJvdG9idWY6cHJvdG9idWYtamF2YTozLjIuMCcKKworCS8vIHF1ZXJ5aW5nIGVzCisJY29tcGlsZSAnY29tbW9ucy1odHRwY2xpZW50OmNvbW1vbnMtaHR0cGNsaWVudDozLjEnCisJY29tcGlsZSAnb3JnLmFwYWNoZS5jb21tb25zOmNvbW1vbnMtbGFuZzM6My44LjEnCisKKwkvLyB0ZXN0aW5nCisJdGVzdENvbXBpbGUgJ2p1bml0Omp1bml0OjQuMTInCisJdGVzdFJ1bnRpbWUgJ29yZy5zbGY0ajpzbGY0ai1zaW1wbGU6MS43LjI1JworCXRlc3RDb21waWxlICdvcmcubW9ja2l0bzptb2NraXRvLWNvcmU6Mi4xMy4wJworCXRlc3RDb21waWxlICdvcmcuYXNzZXJ0ajphc3NlcnRqLWNvcmU6My42LjInCisJdGVzdENvbXBpbGUoZ3JvdXA6ICdvcmcuZWxhc3RpY3NlYXJjaCcsIG5hbWU6ICdlbGFzdGljc2VhcmNoJywgdmVyc2lvbjogJzIuMy40JykKKwl0ZXN0Q29tcGlsZShncm91cDogJ29yZy5lbGFzdGljc2VhcmNoJywgbmFtZTogJ2VsYXN0aWNzZWFyY2gnLCB2ZXJzaW9uOiAnMi4zLjQnLCBjbGFzc2lmaWVyOiAndGVzdHMnKQorfQorCit0ZXN0IHsKKwlpZihwcm9qZWN0Lmhhc1Byb3BlcnR5KCdob3N0JykpIHsKKwkJc3lzdGVtUHJvcGVydHkgJ2hvc3QnLCBwcm9qZWN0LnByb3BlcnR5KCdob3N0JykKKwl9IGVsc2UgeworCQlzeXN0ZW1Qcm9wZXJ0eSAnaG9zdCcsICc8aG9zdD4nCisJfQorCisJaWYocHJvamVjdC5oYXNQcm9wZXJ0eSgncG9ydCcpKSB7CisJCXN5c3RlbVByb3BlcnR5ICdwb3J0JywgcHJvamVjdC5wcm9wZXJ0eSgncG9ydCcpCisJfSBlbHNlIHsKKwkJc3lzdGVtUHJvcGVydHkgJ3BvcnQnLCAnMjgwOScKKwl9CisJCisJaWYocHJvamVjdC5oYXNQcm9wZXJ0eSgnc2VydmljZScpKSB7CisJCXN5c3RlbVByb3BlcnR5ICdzZXJ2aWNlJywgcHJvamVjdC5wcm9wZXJ0eSgnc2VydmljZScpCisJfSBlbHNlIHsKKwkJc3lzdGVtUHJvcGVydHkgJ3NlcnZpY2UnLCAnPHNlcnZpY2U+JworCX0KKworCWp2bUFyZ3MgJy1Eb3JnLnNsZjRqLnNpbXBsZUxvZ2dlci5kZWZhdWx0TG9nTGV2ZWw9ZGVidWcnCit9CisKK3Byb3RvYnVmIHsKKwlwcm90b2MgeworCQlhcnRpZmFjdCA9ICdjb20uZ29vZ2xlLnByb3RvYnVmOnByb3RvYzozLjIuMCcKKwl9Cit9CisKKwordGFzayBjb21waWxlSURMKHR5cGU6IEphdmFFeGVjKSB7CisJY2xhc3NwYXRoID0gY29uZmlndXJhdGlvbnMuZ2VuZXJhdGVkQ29tcGlsZQorCisJbWFpbiA9ICdjb20uc3VuLnRvb2xzLmNvcmJhLnNlLmlkbC50b0phdmFQb3J0YWJsZS5Db21waWxlJworCisJLy8gYWRkICdmYWxsVElFJyBpZiA8VHlwZT5QT0EgJiA8VHlwZT5QT0FUaWUgaGF2ZSB0byBiZSBnZW5lcmF0ZWQgICAKKwlhcmdzICctZmFsbFRJRScsICctdGQnLCAnc3JjL2dlbi9qYXZhLycsICdzcmMvbWFpbi9pZGwvb2RzNTMwLmlkbCcKKworCW91dHB1dHMuZGlyKCJzcmMvZ2VuL2phdmEiKQorfQorCit0YXNrIGNvbXBpbGVOb3RpZmljYXRpb25TZXJ2aWNlSURMKHR5cGU6IEphdmFFeGVjKSB7CisJY2xhc3NwYXRoID0gY29uZmlndXJhdGlvbnMuZ2VuZXJhdGVkQ29tcGlsZQorCisJbWFpbiA9ICdjb20uc3VuLnRvb2xzLmNvcmJhLnNlLmlkbC50b0phdmFQb3J0YWJsZS5Db21waWxlJworCisJYXJncyAnLWVtaXRBbGwnLCAnLWZhbGxUSUUnLCAnLWknLCAnc3JjL21haW4vaWRsLycsICctdGQnLCAnc3JjL2dlbi9qYXZhLycsICdzcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q2hhbm5lbEFkbWluLmlkbCcKKworCW91dHB1dHMuZGlyKCJzcmMvZ2VuL2phdmEiKQorCW91dHB1dHMudXBUb0RhdGVXaGVuIHsgZmFsc2UgfQorfQorCitjb21waWxlR2VuZXJhdGVkSmF2YSB7CisJaW5wdXRzLmRpcigiYnVpbGQvZ2VuZXJhdGVkL3NvdXJjZSIpCisJaW5wdXRzLmRpcigic3JjL2dlbi9qYXZhIikKK30KKworLy8gZ2VuZXJhdGUgY2xhc3NlcyBmcm9tIGlkbCBhbmQgY29tcGlsZSB0aGVtCitjb21waWxlR2VuZXJhdGVkSmF2YS5kZXBlbmRzT24gY29tcGlsZUlETAorY29tcGlsZUdlbmVyYXRlZEphdmEuZGVwZW5kc09uIGNvbXBpbGVOb3RpZmljYXRpb25TZXJ2aWNlSURMCisKK2NvbXBpbGVKYXZhLmRlcGVuZHNPbiBjb21waWxlR2VuZXJhdGVkSmF2YQorCitqYXIgeworCWZyb20gc291cmNlU2V0cy5nZW5lcmF0ZWQub3V0cHV0CisJZGVwZW5kc09uIGdlbmVyYXRlZENsYXNzZXMKKworCW1ldGFJbmYgeyBmcm9tICdOT1RJQ0UudHh0JyB9CisJbWV0YUluZiB7IGZyb20gJ0xJQ0VOU0UudHh0JyB9Cit9CisKK3Rhc2sgc291cmNlc0phcih0eXBlOiBKYXIsIGRlcGVuZHNPbjogY2xhc3NlcykgeworCWNsYXNzaWZpZXIgPSAnc291cmNlcycKKwlmcm9tIHNvdXJjZVNldHMubWFpbi5hbGxTb3VyY2UKK30KKworYXJ0aWZhY3RzIHsKKwlhcmNoaXZlcyBzb3VyY2VzSmFyCit9CisKK3Rhc2sgZGVsZXRlR2VuZXJhdGVkKHR5cGU6IERlbGV0ZSkgeworCWRlbGV0ZSAnc3JjL2dlbicKKwlkZWxldGUgJ2J1aWxkJworfQorCitjbGVhbi5kZXBlbmRzT24gZGVsZXRlR2VuZXJhdGVkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiNTQzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGUucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitzb3VyY2VDb21wYXRpYmlsaXR5PTEuOAordGFyZ2V0Q29tcGF0aWJpbGl0eT0xLjgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTMyNjVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmUwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQ0KK2Rpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cw0KK3ppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FDQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMNCitkaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS00LjEwLjItYmluLnppcA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGV3IGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL2dyYWRsZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NjZGQzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGV3LmJhdCBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGV3LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTU2NDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KK0ByZW0NCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MNCitAcmVtDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0ByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsDQorDQorc2V0IERJUk5BTUU9JX5kcDANCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uDQorc2V0IEFQUF9CQVNFX05BTUU9JX5uMA0KK3NldCBBUFBfSE9NRT0lRElSTkFNRSUNCisNCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lg0KK3NldCBERUZBVUxUX0pWTV9PUFRTPQ0KKw0KK0ByZW0gRmluZCBqYXZhLmV4ZQ0KK2lmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUNCisNCitzZXQgSkFWQV9FWEU9amF2YS5leGUNCislSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQ0KK2lmICIlRVJST1JMRVZFTCUiID09ICIwIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6ZmluZEphdmFGcm9tSmF2YUhvbWUNCitzZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lDQorc2V0IEpBVkFfRVhFPSVKQVZBX0hPTUUlL2Jpbi9qYXZhLmV4ZQ0KKw0KK2lmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6aW5pdA0KK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMNCisNCitpZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIHdpbjl4TUVfYXJncw0KKw0KKzp3aW45eE1FX2FyZ3MNCitAcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLg0KK3NldCBDTURfTElORV9BUkdTPQ0KK3NldCBfU0tJUD0yDQorDQorOndpbjl4TUVfYXJnc19zbHVycA0KK2lmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlDQorDQorc2V0IENNRF9MSU5FX0FSR1M9JSoNCisNCis6ZXhlY3V0ZQ0KK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQ0KKw0KK3NldCBDTEFTU1BBVEg9JUFQUF9IT01FJVxncmFkbGVcd3JhcHBlclxncmFkbGUtd3JhcHBlci5qYXINCisNCitAcmVtIEV4ZWN1dGUgR3JhZGxlDQorIiVKQVZBX0VYRSUiICVERUZBVUxUX0pWTV9PUFRTJSAlSkFWQV9PUFRTJSAlR1JBRExFX09QVFMlICItRG9yZy5ncmFkbGUuYXBwbmFtZT0lQVBQX0JBU0VfTkFNRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gJUNNRF9MSU5FX0FSR1MlDQorDQorOmVuZA0KK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kDQorDQorOmZhaWwNCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YNCityZW0gdGhlIF9jbWQuZXhlIC9jXyByZXR1cm4gY29kZSENCitpZiAgbm90ICIiID09ICIlR1JBRExFX0VYSVRfQ09OU09MRSUiIGV4aXQgMQ0KK2V4aXQgL2IgMQ0KKw0KKzptYWluRW5kDQoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwNCisNCis6b21lZ2ENCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc2V0dGluZ3MuZ3JhZGxlIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NldHRpbmdzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWU4MTc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxLDE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Jvb3RQcm9qZWN0Lm5hbWUgPSAnb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyJwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2RvYy9tZG01X2FwaS5hZG9jIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2RvYy9tZG01X2FwaS5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNzY1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vZG9jL21kbTVfYXBpLmFkb2MKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCis9IE1ETTUgQVBJCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzZXJ2aWNlcyBkZWZpbmVkIGluIHRoZSBNRE01IEFQSS4KKworPT0gSW50cm9kdWN0aW9uCitUaGUgTURNNSBBUEkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwcm9qZWN0czoKKworKiAqb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlKiArCisgICAgRGVmaW5lcyB0aGUgY29yZSBzZXJ2aWNlcyBhbmQgZW50aXRpZXMuIEVudGl0aWVzIGNvbnRhaW5lZCBpbiB0aGlzIHByb2plY3QgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4KKyogKm9yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdCogKworICAgIEV4dGVuZHMgdGhlIGNvcmUgQVBJIHdpdGggY2F0YWxvZyBhbmQgdGVtcGxhdGUgZW50aXRpZXMgdG8gb3JnYW5pemUgdGhlIHN0b3JhZ2Ugb2YgY29udGV4dCBkYXRhLiAKKyogKm9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlciogKworICAgIEltcGxlbWVudHMgYm90aCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UgYW5kIG9yZy5lY2xpcHNlLm1kbS5kZWZhdWx0IHVzaW5nIHRoZSBxdWVyeSBiYXNlZCBBU0FNIE9EUyBPTyBBUEkuCisgICAgCis9PSBFbnRpdHlNYW5hZ2VyCisKK09uY2UgYSBjb25uZWN0aW9uIHRvIGEgcGVyc2lzdGVuY2UgKGUuZy4gT0RTIHNlcnZlcikgaXMgZXN0YWJsaXNoZWQsIHRoZSBlbnRpdHkgbWFuYWdlciBhbGxvd3MgdG8gbG9hZCBlbnRpdGllcyBvZiBhbnkga2luZCBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIGF2YWlsYWJsZSBzZXJ2aWNlcy4gCisKK1JldHVybmVkIGVudGl0aWVzIGFyZSBhbHdheXMgY29tcGxldGUuIFRoaXMgbWVhbnMgdGhleSBhcmUgbG9hZGVkIHdpdGggYWxsIG9mIHRoZWlyIHByb3BlcnRpZXMgYW5kIHJlbGF0ZWQgZW50aXRpZXMgKGFzIGV4cG9zZWQgYnkgdGhlaXIgQVBJKS4gVGhlcmVmb3JlIGl0IGRvZXMgbm90IG1hdHRlciBob3cgZW50aXRpZXMgYXJlIHJldHJpZXZlZCAoZS5nLiBlbnRpdHkgbWFuYWdlciBvciBzZWFyY2ggc2VydmljZSkuIFRoZSBlbnRpdHkgbWFuYWdlciBwcm92aWRlcyB2YXJpb3VzIG1ldGhvZHMgdG8gbG9hZCBpbnN0YW5jZXMgYnkgdGhlaXIgaWQsIGxvYWQgcGFyZW50IG9yIGNoaWxkIGVudGl0aWVzIGZvciBhIGdpdmVuIGVudGl0eSBvciBmaWx0ZXIgbG9hZGVkIGVudGl0aWVzIHdpdGggYSBnaXZlbiBuYW1pbmcgcGF0dGVybi4gQ29udGV4dCBkYXRhIG1heSBiZSBsb2FkZWQgZm9yIFRlc3RTdGVwIG9yIE1lYXN1cmVtZW50IGVudGl0aWVzLgorCitNYXNzIGRhdGEgbWF5IGJlIGxvYWRlZCBieSBkZWZpbmluZyBhIGNvcnJlc3BvbmRpbmcgcmVxdWVzdC4gU3VjaCBhIHJlcXVlc3QgY29uc2lzdHMgb2YgYSBDaGFubmVsR3JvdXAgYW5kIGEgc3Vic2V0IG9mIHJlbGF0ZWQgQ2hhbm5lbHMuIEZpbmFsbHkgYSByYW5nZSBpcyBkZWZpbmVkIHRvIGxvYWRlZCBzdG9yZWQgdmFsdWVzIGl0ZXJhdGl2ZWx5IG9yIGFsbCBhdCBvbmNlLiBUaGlzIGFsbG93cyBhIGZpbmUgZ3JhaW5lZCBhY2Nlc3MgdG8gc3RvcmVkIG1hc3MgZGF0YS4KKworPT09IFNlYXJjaFNlcnZpY2UKK1RoZSBzZWFyY2ggc2VydmljZSBhbGxvd3MgdG8gc2VhcmNoIGZvciBlbnRpdGllcyBsaWtlIFRlc3QsIFRlc3RTdGVwLCBNZWFzdXJlbWVudCBhbmQgQ2hhbm5lbCBhY3Jvc3MgaGllcmFyY2hpZXMuIFNvIG9uZSBjYW4sIGZvciBleGFtcGxlLCBzZWFyY2ggZm9yIFRlc3RzIGFuZCBhcHBseSBmaWx0ZXIgY3JpdGVyaWEgZm9yIGNvbnRleHQgZGF0YSBvZiByZWxhdGVkIFRlc3RTdGVwcyBhbmQgTWVhc3VyZW1lbnRzIHdpdGhvdXQgZGVmaW5pbmcgYW55IGpvaW5zLiBUaGlzIGlzIGRvbmUgYnkgdGhlIGludGVybmFsbHkgdXNlZCBzZWFyY2ggcXVlcmllcy4gRWFjaCBzZWFyY2ggcXVlcnkgZGVmaW5lcyBhIHNldCBvZiBzdXBwb3J0ZWQgZW50aXR5IHR5cGVzIGFuZCBoZW5jZSBhbGwgb2YgaXRzIGF0dHJpYnV0ZXMgbWF5IGJlIHVzZWQgZm9yIHNlbGVjdGlvbnMgb3IgZmlsdGVyIGNyaXRlcmlhLiBUaGUgc2VhcmNoIHNlcnZpY2UgYWxsb3dzIHRvIHF1ZXJ5IHBvc3NpYmxlIGZpbHRlciB2YWx1ZXMgZm9yIGVhY2ggc3VwcG9ydGVkIGF0dHJpYnV0ZS4KKworSW4gYWRkaXRpb24gdG8gdGhhdCBhIHF1ZXJ5IHN0cmluZyBtYXkgYmUgdXNlZCB0byBzZWFyY2ggZm9yIGVudGl0aWVzLiBUaGlzIHF1ZXJ5IHN0cmluZyBpcyBldmFsdWF0ZWQgYW5kIHByb2Nlc3NlZCBieSBhIGZ1bGwgdGV4dCBzZWFyY2ggd2hpY2ggcmV0dXJucyBhIHJlc3VsdCBjb25zaXN0aW5nIG9mIFRlc3QsIFRlc3RTdGVwIG9yIE1lYXN1cmVtZW50IGVudGl0aWVzLgorCis9PT0gTm90aWZpY2F0aW9uCitUT0RPCisKKz09PSBGaWxlU2VydmljZQorVGhlIGZpbGUgc2VydmljZSBtYXkgYmUgdXNlZCB0byBkb3dubG9hZCBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcywgcXVlcnkgdGhlaXIgc2l6ZSBvciBvcGVuIGEgY29uc3VtYWJsZSBkb3dubG9hZCBzdHJlYW0gZm9yIGEgZ2l2ZW4gZXh0ZXJuYWxseSBsaW5rZWQgZmlsZS4gU2VxdWVudGlhbCBvciBwYXJhbGxlbCBkb3dubG9hZCBvZiBtdWx0aXBsZSBmaWxlcyBpcyBwb3NzaWJsZSBhcyB3ZWxsLiBBIGRvd25sb2FkIHJlcXVlc3Qgd2l0aCBtdWx0aXBsZSBmaWxlcyBtYXkgaGF2ZSBtdWx0aXBsZSBsaW5rcyB0byB0aGUgc2FtZSBmaWxlLiBJbiBzdWNoIGEgY2FzZSB0aGlzIGZpbGUgaXMgZG93bmxvYWRlZCBvbmx5IG9uY2UgYW5kIGFsbCBsaW5rcyB3aWxsIHBvaW50IHRvIHRoZSBzYW1lIGxvY2FsIGNvcHkgb2YgdGhlIGRvd25sb2FkZWQgZmlsZS4gU2luY2UgZG93bmxvYWRpbmcgbGFyZ2UgZmlsZXMgbWF5IHRha2UgaXRzIHRpbWUgdG8gY29tcGxldGUsIG9uZSBjYW4gcGFzcyBhIGxpc3RlbmVyIHRvIHRyYWNrIHRoZSBvdmVyYWxsIHByb2dyZXNzLgorCitbTk9URV0KKz09PT0KK1RoaXMgc2VydmljZSBkb2VzIG5vdCBhbGxvdyBtYW51YWxseSB1cGxvYWRpbmcgb3IgZGVsZXRpbmcgZmlsZXMuIEluc3RlYWQgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgdXBsb2FkZWQgLyBkZWxldGVkIHdoaWxlIGVudGl0aWVzIGFyZSB3cml0dGVuIHdpdGhpbiBhIDw8VHJhbnNhY3Rpb24+Pi4KKz09PT0KKworPT09IEVudGl0eUZhY3RvcnkKK1RoZSBlbnRpdHkgZmFjdG9yeSBpcyB0aGUgb25seSB3YXkgdG8gY3JlYXRlIG5ldyBlbnRpdGllcy4gRWFjaCBlbnRpdHkgcmV0dXJuZWQgYnkgdGhpcyBzZXJ2aWNlIGlzIGNvbnNpZGVyZWQgdG8gYmUgdmlydHVhbCwgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBhbiBpZCB1bnRpbCBpdCBpcyB3cml0dGVuLiBFbnRpdGllcyB3aXRoIGluZm9ybWF0aW9uYWwgcmVsYXRpb25zIGxpa2UgUXVhbnRpdHkgKHJlZmVyZW5jZXMgYSBVbml0KSBvciBVbml0IChyZWZlcmVuY2VzIGEgUGh5c2ljYWxEaW1lbnNpb24pIG1heSBvbmx5IHJlZmVyZW5jZSBhbHJlYWR5IHBlcnNpc3RlZCBlbnRpdGllcy4gVGhpcyBtZWFucyB0aGF0IGEgbmV3IFF1YW50aXR5IG1heSBvbmx5IGJlIGNyZWF0ZWQgd2l0aCBhbiBhbHJlYWR5IHBlcnNpc3RlZCBVbml0IGFuZCBhIG5ldyBVbml0IG1heSBvbmx5IGJlIGNyZWF0ZWQgd2l0aCBhbiBhbHJlYWR5IHBlcnNpc3RlZCBQaHlzaWNhbERpbWVuc2lvbi4KKworT24gdGhlIG90aGVyIGhhbmQgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIHBhcmVudCAvIGNoaWxkIHRyZWVzIGNvbnNpc3Rpbmcgb2YgdmlydHVhbCBvciBwZXJzaXN0ZWQgZW50aXRpZXMgKHBhcmVudCBhbmQgY2hpbGQgZW50aXRpZXMgYXJlIGludGVybmFsbHkgbGlua2VkIHRvZ2V0aGVyKS4gV2l0aGluIGEgdHJhbnNhY3Rpb24gc3VjaCB0cmVlcyBhcmUgcmVjdXJzaXZlbHkgcHJvY2Vzc2VkLCB0aGVyZWZvcmUgaXQgaXMgbm90IHJlcXVpcmVkIHRvIGV4cGxpY2l0bHkgY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIGNoaWxkIGVudGl0aWVzLCBpbnN0ZWFkIGl0IGlzIHN1ZmZpY2llbnQgYW5kIGhpZ2hseSByZWNvbW1lbmRlZCB0byB3cml0ZSBvbmx5IHRoZSByb290IGVudGl0eSBvZiB0aGUgdHJlZShzKS4gVGhlIHRyYW5zYWN0aW9uIHNlcnZpY2UgcmVjdXJzaXZlbHkgcmVzb2x2ZXMgc3VjaCB0cmVlcyBhbmQgZXhlY3V0ZXMgYmF0Y2ggaW5zZXJ0LSwgdXBkYXRlLSBvciBkZWxldGUtc3RhdGVtZW50cyBmb3IgdGhlIGNoaWxkcmVuLgorCis9PT0gVHJhbnNhY3Rpb24KK1RoZSB0cmFuc2FjdGlvbiBzZXJ2aWNlIGVmZmVjdGl2ZWx5IG1vZGlmaWVzIHRoZSBzdG9yZWQgY29udGVudHMuIEVudGl0aWVzIGFyZSBncm91cGVkIGJ5IHRoZWlyIHR5cGUgYmVmb3JlIHRoZXkgYXJlIHByb2Nlc3NlZC4gRWFjaCBncm91cCBpcyBwcm9jZXNzZWQgYXQgb25jZSB3aXRoIGEgYmF0Y2ggc3RhdGVtZW50LiBFYWNoICB3cml0dGVuIGVudGl0eSBpcyBzY2FubmVkIGZvciBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcy4gTmV3IG9uZXMgYXJlIGF1dG9tYXRpY2FsbHkgdXBsb2FkZWQsIHdoaWxlIHJlbW92ZWQgb25lcyBhcmUgZGVsZXRlZC4gSW4gY2FzZSBvZiBlcnJvcnMgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgcGVyc2lzdGVuY2UgYXJlIGNhbmNlbGxlZCBhbmQgaGVuY2UgYW55IHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCBmaWxlIGhhcyB0byBiZSBkZWxldGVkLiBVbmZvcnR1bmF0ZWx5IHRoZSByZW1vdmFsIG9mIHVwbG9hZGVkIGZpbGVzIGNhbm5vdCBiZSBndWFyYW50ZWVkIChlLmcuIGEgYnJva2VuIGNvbm5lY3Rpb24pLCBpbnN0ZWFkIGEgZGVsZXRlIHJlcXVlc3QgZm9yIHRoZSB1cGxvYWRlZCBmaWxlcyBpcyBzZW5kIG9uIGEgYmVzdCBlZmZvcnQgYmFzaXMuCisKK1tJTVBPUlRBTlRdCis9PT09CitFeHRlcm5hbGx5IGxpbmtlZCBmaWxlcyBvZiBkZWxldGVkIGVudGl0aWVzIGFyZSBvbmx5IHJlbW92ZWQgaWYgdGhlIGVudGl0eSBpcyBhbiBpbnN0YW5jZSBvZiBGaWxlc0F0dGFjaGFibGUgKFRlc3QsIFRlc3RTdGVwLCBNZWFzdXJlbWVudCkuIEluIGFueSBvdGhlciBjYXNlIGV4dGVybmFsbHkgbGlua2VkIGZpbGVzIGFyZSBub3QgcmVtb3ZlZCwgc2luY2UgdGhpcyBtYXkgaGF2ZSBhbiBpbXBhY3Qgb24gb3RoZXIgZW50aXRpZXMgd2hpY2ggcmVmZXJlbmNlIHRoZSBzYW1lIGZpbGUuCis9PT09CisKK0Jlc2lkZXMgdGhlIG1vZGlmaWNhdGlvbiBvZiBlbnRpdGllcywgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgbWFzcyBkYXRhIGJ5IGRlZmluaW5nIHdyaXRlIHJlcXVlc3RzLiBBIHdyaXRlIHJlcXVlc3QgZGVzY3JpYmVzIGluIGRldGFpbCBob3cgdGhlIG1hc3MgZGF0YSBvZiBhIENoYW5uZWwgaXMgb3JnYW5pemVkIChlLmcuIHZhbHVlcyBhcmUgZXhwbGljaXQgb3IgZ2VuZXJhdGVkLCBzdG9yZWQgaW4gZXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMgZXRjLikuCisKKz09IENvbm5lY3QgdG8gYW4gT0RTIFNlcnZlcgorVGhlIE9EUyBlbnRpdHkgbWFuYWdlciBmYWN0b3J5IGlzIHVzZWQgdG8gY29ubmVjdCB0byBhbiBPRFMgc2VydmVyLiBJdCB0YWtlcyBwYXJhbWV0ZXJzLCBzaG93biBpbiB0aGUgZXhhcG1wbGUgYmVsb3csIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24uIE9uIHN1Y2Nlc3MgYW4gZW50aXR5IG1hbmFnZXIgaXMgcmV0dXJuZWQuCisKK1tzb3VyY2UsamF2YV0KKy0tLS0KK01hcDxTdHJpbmcsIFN0cmluZz4gY29ubmVjdGlvblBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7Citjb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoT0RTRW50aXR5TWFuYWdlckZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0UsICJjb3JiYWxvYzo6MS4yQDxTRVJWRVI+OjxQT1JUPi9OYW1lU2VydmljZSIpOworY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KE9EU0VudGl0eU1hbmFnZXJGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FLCAiPFNFUlZJQ0U+LkFTQU0tT0RTIik7Citjb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoT0RTRW50aXR5TWFuYWdlckZhY3RvcnkuUEFSQU1fVVNFUiwgInNhIik7Citjb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoT0RTRW50aXR5TWFuYWdlckZhY3RvcnkuUEFSQU1fUEFTU1dPUkQsICJzYSIpOworCitFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXIgPSBuZXcgT0RTRW50aXR5TWFuYWdlckZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKworLy8gZG8gc29tZXRoaW5nIHVzZWZ1bAorCitlbnRpdHlNYW5hZ2VyLmNsb3NlKCk7CistLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9Db3NFdmVudENoYW5uZWxBZG1pbi5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc0V2ZW50Q2hhbm5lbEFkbWluLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRmM2EzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9Db3NFdmVudENoYW5uZWxBZG1pbi5pZGwKQEAgLTAsMCArMSw1OSBAQAorLyoqDQorICogVGhpcyBtb2R1bGUgaXMgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQgQ09SQkEgRXZlbnQgU2VydmljZQ0KKyAqIDEuMiwgYXMgZGVzY3JpYmVkIGluOg0KKyAqDQorICogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL0VWTlQvMS4yLw0KKyAqDQorICogVGhlIGlkbCB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIGZvbGxvd2luZyBQREY6DQorICogZm9ybWFsLzA0LTEwLTAyIA0KKyAqLw0KKw0KKyNpZm5kZWYgX0NPU19FVkVOVF9DSEFOTkVMX0FETUlOX0lETF8NCisjZGVmaW5lIF9DT1NfRVZFTlRfQ0hBTk5FTF9BRE1JTl9JRExfDQorDQorI2luY2x1ZGUgIkNvc0V2ZW50Q29tbS5pZGwiCisNCisjcHJhZ21hIHByZWZpeCAib21nLm9yZyINCisKK21vZHVsZSBDb3NFdmVudENoYW5uZWxBZG1pbiB7CisKKyAgIGV4Y2VwdGlvbiBBbHJlYWR5Q29ubmVjdGVkIHt9OworICAgZXhjZXB0aW9uIFR5cGVFcnJvciB7fTsKKworICAgaW50ZXJmYWNlIFByb3h5UHVzaENvbnN1bWVyOiBDb3NFdmVudENvbW06OlB1c2hDb25zdW1lciB7CisgICAgICB2b2lkIGNvbm5lY3RfcHVzaF9zdXBwbGllcihpbiBDb3NFdmVudENvbW06OlB1c2hTdXBwbGllciBwdXNoX3N1cHBsaWVyKQorICAgICAgICAgcmFpc2VzKEFscmVhZHlDb25uZWN0ZWQpOworICAgfTsKKworICAgaW50ZXJmYWNlIFByb3h5UHVsbFN1cHBsaWVyOiBDb3NFdmVudENvbW06OlB1bGxTdXBwbGllciB7CisgICAgICB2b2lkIGNvbm5lY3RfcHVsbF9jb25zdW1lcihpbiBDb3NFdmVudENvbW06OlB1bGxDb25zdW1lciBwdWxsX2NvbnN1bWVyKQorICAgICAgICAgcmFpc2VzKEFscmVhZHlDb25uZWN0ZWQpOworICAgfTsKKworICAgaW50ZXJmYWNlIFByb3h5UHVsbENvbnN1bWVyOiBDb3NFdmVudENvbW06OlB1bGxDb25zdW1lciB7CisgICAgICB2b2lkIGNvbm5lY3RfcHVsbF9zdXBwbGllcihpbiBDb3NFdmVudENvbW06OlB1bGxTdXBwbGllciBwdWxsX3N1cHBsaWVyKQorICAgICAgICAgcmFpc2VzKEFscmVhZHlDb25uZWN0ZWQsVHlwZUVycm9yKTsKKyAgIH07CisKKyAgIGludGVyZmFjZSBQcm94eVB1c2hTdXBwbGllcjogQ29zRXZlbnRDb21tOjpQdXNoU3VwcGxpZXIgeworICAgICAgdm9pZCBjb25uZWN0X3B1c2hfY29uc3VtZXIoaW4gQ29zRXZlbnRDb21tOjpQdXNoQ29uc3VtZXIgcHVzaF9jb25zdW1lcikKKyAgICAgICAgIHJhaXNlcyhBbHJlYWR5Q29ubmVjdGVkLCBUeXBlRXJyb3IpOworICAgfTsKKworICAgaW50ZXJmYWNlIENvbnN1bWVyQWRtaW4geworICAgICAgUHJveHlQdXNoU3VwcGxpZXIgb2J0YWluX3B1c2hfc3VwcGxpZXIoKTsKKyAgICAgIFByb3h5UHVsbFN1cHBsaWVyIG9idGFpbl9wdWxsX3N1cHBsaWVyKCk7CisgICB9OworCisgICBpbnRlcmZhY2UgU3VwcGxpZXJBZG1pbiB7CisgICAgICBQcm94eVB1c2hDb25zdW1lciBvYnRhaW5fcHVzaF9jb25zdW1lcigpOworICAgICAgUHJveHlQdWxsQ29uc3VtZXIgb2J0YWluX3B1bGxfY29uc3VtZXIoKTsKKyAgIH07CisKKyAgIGludGVyZmFjZSBFdmVudENoYW5uZWwgeworICAgICAgQ29uc3VtZXJBZG1pbiBmb3JfY29uc3VtZXJzKCk7CisgICAgICBTdXBwbGllckFkbWluIGZvcl9zdXBwbGllcnMoKTsKKyAgICAgIHZvaWQgZGVzdHJveSgpOworICAgfTsKK307CisjZW5kaWYgLyogaWZuZGVmIF9DT1NfRVZFTlRfQ0hBTk5FTF9BRE1JTl9JRExfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc0V2ZW50Q29tbS5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc0V2ZW50Q29tbS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ODY5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zRXZlbnRDb21tLmlkbApAQCAtMCwwICsxLDQxIEBACisvKioNCisgKiBUaGlzIG1vZHVsZSBpcyB0YWtlbiBmcm9tIHRoZSBzdGFuZGFyZCBDT1JCQSBFdmVudCBTZXJ2aWNlDQorICogMS4yLCBhcyBkZXNjcmliZWQgaW46DQorICoNCisgKiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvRVZOVC8xLjIvDQorICoNCisgKiBUaGUgaWRsIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIFBERjoNCisgKiBmb3JtYWwvMDQtMTAtMDIgDQorICovDQorIA0KKyNpZm5kZWYgX0NPU19FVkVOVF9DT01NX0lETF8NCisjZGVmaW5lIF9DT1NfRVZFTlRfQ09NTV9JRExfDQorDQorI3ByYWdtYSBwcmVmaXggIm9tZy5vcmciDQorDQorbW9kdWxlIENvc0V2ZW50Q29tbSB7CisKKyAgIGV4Y2VwdGlvbiBEaXNjb25uZWN0ZWR7fTsKKworICAgaW50ZXJmYWNlIFB1c2hDb25zdW1lciB7CisgICAgICB2b2lkIHB1c2ggKGluIGFueSBkYXRhKSByYWlzZXMoRGlzY29ubmVjdGVkKTsKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9wdXNoX2NvbnN1bWVyKCk7CisgICB9OworCisgICAgaW50ZXJmYWNlIFB1c2hTdXBwbGllciB7CisgICAgICB2b2lkIGRpc2Nvbm5lY3RfcHVzaF9zdXBwbGllcigpOworICAgfTsKKworICAgaW50ZXJmYWNlIFB1bGxTdXBwbGllciB7CisgICAgICBhbnkgcHVsbCAoKSByYWlzZXMoRGlzY29ubmVjdGVkKTsKKyAgICAgIGFueSB0cnlfcHVsbCAob3V0IGJvb2xlYW4gaGFzX2V2ZW50KSByYWlzZXMoRGlzY29ubmVjdGVkKTsKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9wdWxsX3N1cHBsaWVyKCk7CisgICB9OworCisgICBpbnRlcmZhY2UgUHVsbENvbnN1bWVyIHsKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9wdWxsX2NvbnN1bWVyKCk7CisgICB9OworCit9OworCisjZW5kaWYgLyogaWZuZGVmIF9DT1NfRVZFTlRfQ09NTV9JRExfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc05vdGlmaWNhdGlvbi5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc05vdGlmaWNhdGlvbi5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4OTcwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZpY2F0aW9uLmlkbApAQCAtMCwwICsxLDE4MCBAQAorLyoqDQorICogVGhpcyBtb2R1bGUgaXMgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQgQ09SQkEgTm90aWZpY2F0aW9uIFNlcnZpY2UNCisgKiAxLjEsIGFzIGRlc2NyaWJlZCBpbjoNCisgKg0KKyAqIGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9OT1QvMS4xLw0KKyAqDQorICogVGhlIGlkbCB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIGZvbGxvd2luZyBQREY6DQorICogZm9ybWFsLzA0LTEwLTEzDQorICovDQorDQorI2lmbmRlZiBfQ09TX05PVElGSUNBVElPTl9JRExfDQorI2RlZmluZSBfQ09TX05PVElGSUNBVElPTl9JRExfDQorDQorI3ByYWdtYSBwcmVmaXggIm9tZy5vcmciDQorDQorbW9kdWxlIENvc05vdGlmaWNhdGlvbiB7CisKKyAgIHR5cGVkZWYgc3RyaW5nIElzdHJpbmc7CisgICB0eXBlZGVmIElzdHJpbmcgUHJvcGVydHlOYW1lOworICAgdHlwZWRlZiBhbnkgUHJvcGVydHlWYWx1ZTsKKworICAgc3RydWN0IFByb3BlcnR5IHsKKyAgICAgIFByb3BlcnR5TmFtZSBuYW1lOworICAgICAgUHJvcGVydHlWYWx1ZSB2YWx1ZTsKKyAgIH07CisgICB0eXBlZGVmIHNlcXVlbmNlPFByb3BlcnR5PiBQcm9wZXJ0eVNlcTsKKworICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHNhbWUsIGJ1dCBzZXJ2ZSBkaWZmZXJlbnQgcHVycG9zZXMuCisgICB0eXBlZGVmIFByb3BlcnR5U2VxIE9wdGlvbmFsSGVhZGVyRmllbGRzOworICAgdHlwZWRlZiBQcm9wZXJ0eVNlcSBGaWx0ZXJhYmxlRXZlbnRCb2R5OworICAgdHlwZWRlZiBQcm9wZXJ0eVNlcSBRb1NQcm9wZXJ0aWVzOworICAgdHlwZWRlZiBQcm9wZXJ0eVNlcSBBZG1pblByb3BlcnRpZXM7CisKKyAgIHN0cnVjdCBfRXZlbnRUeXBlIHsKKyAgICAgIHN0cmluZyBkb21haW5fbmFtZTsKKyAgICAgIHN0cmluZyB0eXBlX25hbWU7CisgICB9OworICAgdHlwZWRlZiBzZXF1ZW5jZTxfRXZlbnRUeXBlPiBFdmVudFR5cGVTZXE7CisKKyAgIHN0cnVjdCBQcm9wZXJ0eVJhbmdlIHsKKyAgICAgIFByb3BlcnR5VmFsdWUgbG93X3ZhbDsKKyAgICAgIFByb3BlcnR5VmFsdWUgaGlnaF92YWw7CisgICB9OworCisgICBzdHJ1Y3QgTmFtZWRQcm9wZXJ0eVJhbmdlIHsKKyAgICAgIFByb3BlcnR5TmFtZSBuYW1lOworICAgICAgUHJvcGVydHlSYW5nZSByYW5nZTsKKyAgIH07CisgICB0eXBlZGVmIHNlcXVlbmNlPE5hbWVkUHJvcGVydHlSYW5nZT4gTmFtZWRQcm9wZXJ0eVJhbmdlU2VxOworCisgICBlbnVtIFFvU0Vycm9yX2NvZGUgeworICAgICAgVU5TVVBQT1JURURfUFJPUEVSVFksCisgICAgICBVTkFWQUlMQUJMRV9QUk9QRVJUWSwKKyAgICAgIFVOU1VQUE9SVEVEX1ZBTFVFLAorICAgICAgVU5BVkFJTEFCTEVfVkFMVUUsCisgICAgICBCQURfUFJPUEVSVFksCisgICAgICBCQURfVFlQRSwKKyAgICAgIEJBRF9WQUxVRQorICAgfTsKKworICAgc3RydWN0IFByb3BlcnR5RXJyb3IgeworICAgICAgUW9TRXJyb3JfY29kZSBjb2RlOworICAgICAgUHJvcGVydHlOYW1lIG5hbWU7CisgICAgICBQcm9wZXJ0eVJhbmdlIGF2YWlsYWJsZV9yYW5nZTsKKyAgIH07CisgICB0eXBlZGVmIHNlcXVlbmNlPFByb3BlcnR5RXJyb3I+IFByb3BlcnR5RXJyb3JTZXE7CisKKyAgIGV4Y2VwdGlvbiBVbnN1cHBvcnRlZFFvUyB7IFByb3BlcnR5RXJyb3JTZXEgcW9zX2VycjsgfTsKKyAgIGV4Y2VwdGlvbiBVbnN1cHBvcnRlZEFkbWluIHsgUHJvcGVydHlFcnJvclNlcSBhZG1pbl9lcnI7IH07CisKKyAgIC8vIERlZmluZSB0aGUgU3RydWN0dXJlZCBFdmVudCBzdHJ1Y3R1cmUKKyAgIHN0cnVjdCBGaXhlZEV2ZW50SGVhZGVyIHsKKyAgICAgIF9FdmVudFR5cGUgZXZlbnRfdHlwZTsKKyAgICAgIHN0cmluZyBldmVudF9uYW1lOworICAgfTsKKworICAgc3RydWN0IEV2ZW50SGVhZGVyIHsKKyAgICAgIEZpeGVkRXZlbnRIZWFkZXIgZml4ZWRfaGVhZGVyOworICAgICAgT3B0aW9uYWxIZWFkZXJGaWVsZHMgdmFyaWFibGVfaGVhZGVyOworICAgfTsKKworICAgc3RydWN0IFN0cnVjdHVyZWRFdmVudCB7CisgICAgICBFdmVudEhlYWRlciBoZWFkZXI7CisgICAgICBGaWx0ZXJhYmxlRXZlbnRCb2R5IGZpbHRlcmFibGVfZGF0YTsKKyAgICAgIGFueSByZW1haW5kZXJfb2ZfYm9keTsKKyAgIH07IC8vIFN0cnVjdHVyZWRFdmVudAorICAgdHlwZWRlZiBzZXF1ZW5jZTxTdHJ1Y3R1cmVkRXZlbnQ+IEV2ZW50QmF0Y2g7CisKKyAgIC8vIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgZGVjbGFyYXRpb25zIGRlZmluZSB0aGUgc3RhbmRhcmQKKyAgIC8vIFFvUyBwcm9wZXJ0eSBuYW1lcyBhbmQgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGVhY2ggcHJvcGVydHkKKyAgIC8vIGNhbiB0YWtlIG9uLiBUaGUgbmFtZS92YWx1ZSBwYWlycyBmb3IgZWFjaCBzdGFuZGFyZCBwcm9wZXJ0eQorICAgLy8gYXJlIGdyb3VwZWQsIGJlZ2lubmluZyB3aXRoIGEgc3RyaW5nIGNvbnN0YW50IGRlZmluZWQgZm9yIHRoZQorICAgLy8gcHJvcGVydHkgbmFtZSwgZm9sbG93ZWQgYnkgdGhlIHZhbHVlcyB0aGUgcHJvcGVydHkgY2FuIHRha2Ugb24uCisKKyAgIGNvbnN0IHN0cmluZyBFdmVudFJlbGlhYmlsaXR5ID0gIkV2ZW50UmVsaWFiaWxpdHkiOworICAgY29uc3Qgc2hvcnQgQmVzdEVmZm9ydCA9IDA7CisgICBjb25zdCBzaG9ydCBQZXJzaXN0ZW50ID0gMTsKKworICAgY29uc3Qgc3RyaW5nIENvbm5lY3Rpb25SZWxpYWJpbGl0eSA9ICJDb25uZWN0aW9uUmVsaWFiaWxpdHkiOworICAgLy8gQ2FuIHRha2Ugb24gdGhlIHNhbWUgdmFsdWVzIGFzIEV2ZW50UmVsaWFiaWxpdHkKKworICAgY29uc3Qgc3RyaW5nIFByaW9yaXR5ID0gIlByaW9yaXR5IjsKKyAgIGNvbnN0IHNob3J0IExvd2VzdFByaW9yaXR5ID0gLTMyNzY3OworICAgY29uc3Qgc2hvcnQgSGlnaGVzdFByaW9yaXR5ID0gMzI3Njc7CisgICBjb25zdCBzaG9ydCBEZWZhdWx0UHJpb3JpdHkgPSAwOworCisgICBjb25zdCBzdHJpbmcgU3RhcnRUaW1lID0gIlN0YXJ0VGltZSI7CisgICAvLyBTdGFydFRpbWUgdGFrZXMgYSB2YWx1ZSBvZiB0eXBlIFRpbWVCYXNlOjpVdGNULgorCisgICBjb25zdCBzdHJpbmcgU3RvcFRpbWUgPSAiU3RvcFRpbWUiOworICAgLy8gU3RvcFRpbWUgdGFrZXMgYSB2YWx1ZSBvZiB0eXBlIFRpbWVCYXNlOjpVdGNULgorCisgICBjb25zdCBzdHJpbmcgVGltZW91dCA9ICJUaW1lb3V0IjsKKyAgIC8vIFRpbWVvdXQgdGFrZXMgb24gYSB2YWx1ZSBvZiB0eXBlIFRpbWVCYXNlOjpUaW1lVAorCisgICBjb25zdCBzdHJpbmcgT3JkZXJQb2xpY3kgPSAiT3JkZXJQb2xpY3kiOworICAgY29uc3Qgc2hvcnQgQW55T3JkZXIgPSAwOworICAgY29uc3Qgc2hvcnQgRmlmb09yZGVyID0gMTsKKyAgIGNvbnN0IHNob3J0IFByaW9yaXR5T3JkZXIgPSAyOworICAgY29uc3Qgc2hvcnQgRGVhZGxpbmVPcmRlciA9IDM7CisKKyAgIGNvbnN0IHN0cmluZyBEaXNjYXJkUG9saWN5ID0gIkRpc2NhcmRQb2xpY3kiOworICAgLy8gRGlzY2FyZFBvbGljeSB0YWtlcyBvbiB0aGUgc2FtZSB2YWx1ZXMgYXMgT3JkZXJQb2xpY3ksIHBsdXMKKyAgIGNvbnN0IHNob3J0IExpZm9PcmRlciA9IDQ7CisKKyAgIGNvbnN0IHN0cmluZyBNYXhpbXVtQmF0Y2hTaXplID0gIk1heGltdW1CYXRjaFNpemUiOworICAgLy8gTWF4aW11bUJhdGNoU2l6ZSB0YWtlcyBvbiBhIHZhbHVlIG9mIHR5cGUgbG9uZworCisgICBjb25zdCBzdHJpbmcgUGFjaW5nSW50ZXJ2YWwgPSAiUGFjaW5nSW50ZXJ2YWwiOworICAgLy8gUGFjaW5nSW50ZXJ2YWwgdGFrZXMgb24gYSB2YWx1ZSBvZiB0eXBlIFRpbWVCYXNlOjpUaW1lVAorCisgICBjb25zdCBzdHJpbmcgU3RhcnRUaW1lU3VwcG9ydGVkID0gIlN0YXJ0VGltZVN1cHBvcnRlZCI7CisgICAvLyBTdGFydFRpbWVTdXBwb3J0ZWQgdGFrZXMgb24gYSBib29sZWFuIHZhbHVlCisKKyAgIGNvbnN0IHN0cmluZyBTdG9wVGltZVN1cHBvcnRlZCA9ICJTdG9wVGltZVN1cHBvcnRlZCI7CisgICAvLyBTdG9wVGltZVN1cHBvcnRlZCB0YWtlcyBvbiBhIGJvb2xlYW4gdmFsdWUKKworICAgY29uc3Qgc3RyaW5nIE1heEV2ZW50c1BlckNvbnN1bWVyID0gIk1heEV2ZW50c1BlckNvbnN1bWVyIjsKKyAgIC8vIE1heEV2ZW50c1BlckNvbnN1bWVyIHRha2VzIG9uIGEgdmFsdWUgb2YgdHlwZSBsb25nCisKKyAgIGludGVyZmFjZSBRb1NBZG1pbiB7CisKKyAgICAgIFFvU1Byb3BlcnRpZXMgZ2V0X3FvcygpOworCisgICAgICB2b2lkIHNldF9xb3MgKCBpbiBRb1NQcm9wZXJ0aWVzIHFvcykgcmFpc2VzICggVW5zdXBwb3J0ZWRRb1MgKTsKKworICAgICAgdm9pZCB2YWxpZGF0ZV9xb3MgKAorICAgICAgICAgICAgaW4gUW9TUHJvcGVydGllcyByZXF1aXJlZF9xb3MsCisgICAgICAgICAgICBvdXQgTmFtZWRQcm9wZXJ0eVJhbmdlU2VxIGF2YWlsYWJsZV9xb3MgKSByYWlzZXMgKCBVbnN1cHBvcnRlZFFvUyApOworCisgICB9OyAvLyBRb3NBZG1pbgorCisgICAvLyBBZG1pbiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIHNpbWlsYXIgbWFubmVyIGFzIFFvUworICAgLy8gcHJvcGVydGllcy4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXNlIHByb3BlcnRpZXMKKyAgIC8vIGFyZSByZWxhdGVkIHRvIGNoYW5uZWwgYWRtaW5pc3RyYXRpb24gcG9saWNpZXMsIGFzIG9wcG9zZWQKKyAgIC8vIG1lc3NhZ2UgcXVhbGl0eSBvZiBzZXJ2aWNlCisKKyAgIGNvbnN0IHN0cmluZyBNYXhRdWV1ZUxlbmd0aCA9ICJNYXhRdWV1ZUxlbmd0aCI7CisgICAvLyBNYXhRdWV1ZUxlbmd0aCB0YWtlcyBvbiBhIHZhbHVlIG9mIHR5cGUgbG9uZworCisgICBjb25zdCBzdHJpbmcgTWF4Q29uc3VtZXJzID0gIk1heENvbnN1bWVycyI7CisgICAvLyBNYXhDb25zdW1lcnMgdGFrZXMgb24gYSB2YWx1ZSBvZiB0eXBlIGxvbmcKKworICAgY29uc3Qgc3RyaW5nIE1heFN1cHBsaWVycyA9ICJNYXhTdXBwbGllcnMiOworICAgLy8gTWF4U3VwcGxpZXJzIHRha2VzIG9uIGEgdmFsdWUgb2YgdHlwZSBsb25nCisKKyAgIGNvbnN0IHN0cmluZyBSZWplY3ROZXdFdmVudHMgPSAiUmVqZWN0TmV3RXZlbnRzIjsKKyAgIC8vIFJlamVjdE5ld0V2ZW50cyB0YWtlcyBvbiBhIHZhbHVlIG9mIHR5cGUgQm9vbGVhbgorCisgICBpbnRlcmZhY2UgQWRtaW5Qcm9wZXJ0aWVzQWRtaW4geworCisgICAgICBBZG1pblByb3BlcnRpZXMgZ2V0X2FkbWluKCk7CisKKyAgICAgIHZvaWQgc2V0X2FkbWluIChpbiBBZG1pblByb3BlcnRpZXMgYWRtaW4pIHJhaXNlcyAoIFVuc3VwcG9ydGVkQWRtaW4pOworCisgICB9OyAvLyBBZG1pblByb3BlcnRpZXNBZG1pbgorCit9OyAvLyBDb3NOb3RpZmljYXRpb24KKworI2VuZGlmIC8qIF9DT1NfTk9USUZJQ0FUSU9OX0lETF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q2hhbm5lbEFkbWluLmlkbCBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q2hhbm5lbEFkbWluLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjRkM2VhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9Db3NOb3RpZnlDaGFubmVsQWRtaW4uaWRsCkBAIC0wLDAgKzEsMzk0IEBACisvKioKKyAqIFRoaXMgbW9kdWxlIGlzIHRha2VuIGZyb20gdGhlIHN0YW5kYXJkIENPUkJBIE5vdGlmaWNhdGlvbiBTZXJ2aWNlCisgKiAxLjEsIGFzIGRlc2NyaWJlZCBpbjoKKyAqCisgKiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvTk9ULzEuMS8KKyAqCisgKiBUaGUgaWRsIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIFBERjoKKyAqIGZvcm1hbC8wNC0xMC0xMworICovCisKKyNpZm5kZWYgX0NPU19OT1RJRllfQ0hBTk5FTF9BRE1JTl9JRExfCisjZGVmaW5lIF9DT1NfTk9USUZZX0NIQU5ORUxfQURNSU5fSURMXworCisjaW5jbHVkZSAiQ29zTm90aWZpY2F0aW9uLmlkbCIKKyNpbmNsdWRlICJDb3NOb3RpZnlGaWx0ZXIuaWRsIgorI2luY2x1ZGUgIkNvc05vdGlmeUNvbW0uaWRsIgorI2luY2x1ZGUgIkNvc0V2ZW50Q2hhbm5lbEFkbWluLmlkbCIKKworI3ByYWdtYSBwcmVmaXggIm9tZy5vcmciCisKK21vZHVsZSBDb3NOb3RpZnlDaGFubmVsQWRtaW4geworCisgICBleGNlcHRpb24gQ29ubmVjdGlvbkFscmVhZHlBY3RpdmUge307CisgICBleGNlcHRpb24gQ29ubmVjdGlvbkFscmVhZHlJbmFjdGl2ZSB7fTsKKyAgIGV4Y2VwdGlvbiBOb3RDb25uZWN0ZWQge307CisKKyAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zCisgICBpbnRlcmZhY2UgQ29uc3VtZXJBZG1pbjsKKyAgIGludGVyZmFjZSBTdXBwbGllckFkbWluOworICAgaW50ZXJmYWNlIEV2ZW50Q2hhbm5lbDsKKyAgIGludGVyZmFjZSBFdmVudENoYW5uZWxGYWN0b3J5OworCisgICBlbnVtIFByb3h5VHlwZSB7CisgICAgICBQVVNIX0FOWSwKKyAgICAgIFBVTExfQU5ZLAorICAgICAgUFVTSF9TVFJVQ1RVUkVELAorICAgICAgUFVMTF9TVFJVQ1RVUkVELAorICAgICAgUFVTSF9TRVFVRU5DRSwKKyAgICAgIFBVTExfU0VRVUVOQ0UsCisgICAgICBQVVNIX1RZUEVELAorICAgICAgUFVMTF9UWVBFRAorICAgfTsKKworICAgZW51bSBPYnRhaW5JbmZvTW9kZSB7CisgICAgICBBTExfTk9XX1VQREFURVNfT0ZGLAorICAgICAgQUxMX05PV19VUERBVEVTX09OLAorICAgICAgTk9ORV9OT1dfVVBEQVRFU19PRkYsCisgICAgICBOT05FX05PV19VUERBVEVTX09OCisgICB9OworCisgICBpbnRlcmZhY2UgUHJveHlDb25zdW1lciA6CisgICAgICAgICBDb3NOb3RpZmljYXRpb246OlFvU0FkbWluLAorICAgICAgICAgQ29zTm90aWZ5RmlsdGVyOjpGaWx0ZXJBZG1pbiB7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm94eVR5cGUgTXlUeXBlOworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIFN1cHBsaWVyQWRtaW4gTXlBZG1pbjsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpFdmVudFR5cGVTZXEgb2J0YWluX3N1YnNjcmlwdGlvbl90eXBlcygKKyAgICAgICAgICAgIGluIE9idGFpbkluZm9Nb2RlIG1vZGUgKTsKKworICAgICAgdm9pZCB2YWxpZGF0ZV9ldmVudF9xb3MgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpRb1NQcm9wZXJ0aWVzIHJlcXVpcmVkX3FvcywKKyAgICAgICAgICAgIG91dCBDb3NOb3RpZmljYXRpb246Ok5hbWVkUHJvcGVydHlSYW5nZVNlcSBhdmFpbGFibGVfcW9zKQorICAgICAgICAgcmFpc2VzIChDb3NOb3RpZmljYXRpb246OlVuc3VwcG9ydGVkUW9TKTsKKworICAgfTsgLy8gUHJveHlDb25zdW1lcgorCisgICBpbnRlcmZhY2UgUHJveHlTdXBwbGllciA6CisgICAgICAgICBDb3NOb3RpZmljYXRpb246OlFvU0FkbWluLAorICAgICAgICAgQ29zTm90aWZ5RmlsdGVyOjpGaWx0ZXJBZG1pbiB7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm94eVR5cGUgTXlUeXBlOworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIENvbnN1bWVyQWRtaW4gTXlBZG1pbjsKKworICAgICAgYXR0cmlidXRlIENvc05vdGlmeUZpbHRlcjo6TWFwcGluZ0ZpbHRlciBwcmlvcml0eV9maWx0ZXI7CisgICAgICBhdHRyaWJ1dGUgQ29zTm90aWZ5RmlsdGVyOjpNYXBwaW5nRmlsdGVyIGxpZmV0aW1lX2ZpbHRlcjsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpFdmVudFR5cGVTZXEgb2J0YWluX29mZmVyZWRfdHlwZXMoCisgICAgICAgICAgICBpbiBPYnRhaW5JbmZvTW9kZSBtb2RlICk7CisKKyAgICAgIHZvaWQgdmFsaWRhdGVfZXZlbnRfcW9zICgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6UW9TUHJvcGVydGllcyByZXF1aXJlZF9xb3MsCisgICAgICAgICAgICBvdXQgQ29zTm90aWZpY2F0aW9uOjpOYW1lZFByb3BlcnR5UmFuZ2VTZXEgYXZhaWxhYmxlX3FvcykKKyAgICAgICAgIHJhaXNlcyAoQ29zTm90aWZpY2F0aW9uOjpVbnN1cHBvcnRlZFFvUyk7CisKKyAgIH07IC8vIFByb3h5U3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFByb3h5UHVzaENvbnN1bWVyIDoKKyAgICAgICAgIFByb3h5Q29uc3VtZXIsCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpQdXNoQ29uc3VtZXIgeworCisgICAgICB2b2lkIGNvbm5lY3RfYW55X3B1c2hfc3VwcGxpZXIgKAorICAgICAgICAgICAgaW4gQ29zRXZlbnRDb21tOjpQdXNoU3VwcGxpZXIgcHVzaF9zdXBwbGllcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCk7CisKKyAgIH07IC8vIFByb3h5UHVzaENvbnN1bWVyCisKKyAgIGludGVyZmFjZSBTdHJ1Y3R1cmVkUHJveHlQdXNoQ29uc3VtZXIgOgorICAgICAgICAgUHJveHlDb25zdW1lciwKKyAgICAgICAgIENvc05vdGlmeUNvbW06OlN0cnVjdHVyZWRQdXNoQ29uc3VtZXIgeworCisgICAgICB2b2lkIGNvbm5lY3Rfc3RydWN0dXJlZF9wdXNoX3N1cHBsaWVyICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06OlN0cnVjdHVyZWRQdXNoU3VwcGxpZXIgcHVzaF9zdXBwbGllcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCk7CisKKyAgIH07IC8vIFN0cnVjdHVyZWRQcm94eVB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgU2VxdWVuY2VQcm94eVB1c2hDb25zdW1lciA6CisgICAgICAgICBQcm94eUNvbnN1bWVyLAorICAgICAgICAgQ29zTm90aWZ5Q29tbTo6U2VxdWVuY2VQdXNoQ29uc3VtZXIgeworCisgICAgICB2b2lkIGNvbm5lY3Rfc2VxdWVuY2VfcHVzaF9zdXBwbGllciAoCisgICAgICAgICAgICBpbiBDb3NOb3RpZnlDb21tOjpTZXF1ZW5jZVB1c2hTdXBwbGllciBwdXNoX3N1cHBsaWVyKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q2hhbm5lbEFkbWluOjpBbHJlYWR5Q29ubmVjdGVkKTsKKworICAgfTsgLy8gU2VxdWVuY2VQcm94eVB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgUHJveHlQdWxsU3VwcGxpZXIgOgorICAgICAgICAgUHJveHlTdXBwbGllciwKKyAgICAgICAgIENvc05vdGlmeUNvbW06OlB1bGxTdXBwbGllciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9hbnlfcHVsbF9jb25zdW1lciAoCisgICAgICAgICAgICBpbiBDb3NFdmVudENvbW06OlB1bGxDb25zdW1lciBwdWxsX2NvbnN1bWVyKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q2hhbm5lbEFkbWluOjpBbHJlYWR5Q29ubmVjdGVkKTsKKworICAgfTsgLy8gUHJveHlQdWxsU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFN0cnVjdHVyZWRQcm94eVB1bGxTdXBwbGllciA6CisgICAgICAgICBQcm94eVN1cHBsaWVyLAorICAgICAgICAgQ29zTm90aWZ5Q29tbTo6U3RydWN0dXJlZFB1bGxTdXBwbGllciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9zdHJ1Y3R1cmVkX3B1bGxfY29uc3VtZXIgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZ5Q29tbTo6U3RydWN0dXJlZFB1bGxDb25zdW1lciBwdWxsX2NvbnN1bWVyKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q2hhbm5lbEFkbWluOjpBbHJlYWR5Q29ubmVjdGVkKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFByb3h5UHVsbFN1cHBsaWVyCisKKyAgIGludGVyZmFjZSBTZXF1ZW5jZVByb3h5UHVsbFN1cHBsaWVyIDoKKyAgICAgICAgIFByb3h5U3VwcGxpZXIsCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpTZXF1ZW5jZVB1bGxTdXBwbGllciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9zZXF1ZW5jZV9wdWxsX2NvbnN1bWVyICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06OlNlcXVlbmNlUHVsbENvbnN1bWVyIHB1bGxfY29uc3VtZXIpCisgICAgICAgICByYWlzZXMoQ29zRXZlbnRDaGFubmVsQWRtaW46OkFscmVhZHlDb25uZWN0ZWQpOworCisgICB9OyAvLyBTZXF1ZW5jZVByb3h5UHVsbFN1cHBsaWVyCisKKyAgIGludGVyZmFjZSBQcm94eVB1bGxDb25zdW1lciA6CisgICAgICAgICBQcm94eUNvbnN1bWVyLAorICAgICAgICAgQ29zTm90aWZ5Q29tbTo6UHVsbENvbnN1bWVyIHsKKworICAgICAgdm9pZCBjb25uZWN0X2FueV9wdWxsX3N1cHBsaWVyICgKKyAgICAgICAgICAgIGluIENvc0V2ZW50Q29tbTo6UHVsbFN1cHBsaWVyIHB1bGxfc3VwcGxpZXIpCisgICAgICAgICByYWlzZXMoQ29zRXZlbnRDaGFubmVsQWRtaW46OkFscmVhZHlDb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgQ29zRXZlbnRDaGFubmVsQWRtaW46OlR5cGVFcnJvciApOworCisgICAgICB2b2lkIHN1c3BlbmRfY29ubmVjdGlvbigpCisgICAgICAgICByYWlzZXMoQ29ubmVjdGlvbkFscmVhZHlJbmFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgICAgdm9pZCByZXN1bWVfY29ubmVjdGlvbigpCisgICAgICAgICByYWlzZXMoQ29ubmVjdGlvbkFscmVhZHlBY3RpdmUsIE5vdENvbm5lY3RlZCk7CisKKyAgIH07IC8vIFByb3h5UHVsbENvbnN1bWVyCisKKyAgIGludGVyZmFjZSBTdHJ1Y3R1cmVkUHJveHlQdWxsQ29uc3VtZXIgOgorICAgICAgICAgUHJveHlDb25zdW1lciwKKyAgICAgICAgIENvc05vdGlmeUNvbW06OlN0cnVjdHVyZWRQdWxsQ29uc3VtZXIgeworCisgICAgICB2b2lkIGNvbm5lY3Rfc3RydWN0dXJlZF9wdWxsX3N1cHBsaWVyICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06OlN0cnVjdHVyZWRQdWxsU3VwcGxpZXIgcHVsbF9zdXBwbGllcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICBDb3NFdmVudENoYW5uZWxBZG1pbjo6VHlwZUVycm9yICk7CisKKyAgICAgIHZvaWQgc3VzcGVuZF9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUluYWN0aXZlLCBOb3RDb25uZWN0ZWQpOworCisgICAgICB2b2lkIHJlc3VtZV9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFByb3h5UHVsbENvbnN1bWVyCisKKyAgIGludGVyZmFjZSBTZXF1ZW5jZVByb3h5UHVsbENvbnN1bWVyIDoKKyAgICAgICAgIFByb3h5Q29uc3VtZXIsCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpTZXF1ZW5jZVB1bGxDb25zdW1lciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9zZXF1ZW5jZV9wdWxsX3N1cHBsaWVyICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06OlNlcXVlbmNlUHVsbFN1cHBsaWVyIHB1bGxfc3VwcGxpZXIpCisgICAgICAgICByYWlzZXMoQ29zRXZlbnRDaGFubmVsQWRtaW46OkFscmVhZHlDb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgQ29zRXZlbnRDaGFubmVsQWRtaW46OlR5cGVFcnJvciApOworCisgICAgICB2b2lkIHN1c3BlbmRfY29ubmVjdGlvbigpCisgICAgICAgICByYWlzZXMoQ29ubmVjdGlvbkFscmVhZHlJbmFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgICAgdm9pZCByZXN1bWVfY29ubmVjdGlvbigpCisgICAgICAgICByYWlzZXMoQ29ubmVjdGlvbkFscmVhZHlBY3RpdmUsIE5vdENvbm5lY3RlZCk7CisKKyAgIH07IC8vIFNlcXVlbmNlUHJveHlQdWxsQ29uc3VtZXIKKworICAgaW50ZXJmYWNlIFByb3h5UHVzaFN1cHBsaWVyIDoKKyAgICAgICAgIFByb3h5U3VwcGxpZXIsCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpQdXNoU3VwcGxpZXIgeworCisgICAgICB2b2lkIGNvbm5lY3RfYW55X3B1c2hfY29uc3VtZXIgKAorICAgICAgICAgICAgaW4gQ29zRXZlbnRDb21tOjpQdXNoQ29uc3VtZXIgcHVzaF9jb25zdW1lcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICBDb3NFdmVudENoYW5uZWxBZG1pbjo6VHlwZUVycm9yICk7CisKKyAgICAgIHZvaWQgc3VzcGVuZF9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUluYWN0aXZlLCBOb3RDb25uZWN0ZWQpOworCisgICAgICB2b2lkIHJlc3VtZV9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgfTsgLy8gUHJveHlQdXNoU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFN0cnVjdHVyZWRQcm94eVB1c2hTdXBwbGllciA6CisgICAgICAgICBQcm94eVN1cHBsaWVyLAorICAgICAgICAgQ29zTm90aWZ5Q29tbTo6U3RydWN0dXJlZFB1c2hTdXBwbGllciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9zdHJ1Y3R1cmVkX3B1c2hfY29uc3VtZXIgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZ5Q29tbTo6U3RydWN0dXJlZFB1c2hDb25zdW1lciBwdXNoX2NvbnN1bWVyKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q2hhbm5lbEFkbWluOjpBbHJlYWR5Q29ubmVjdGVkLAorICAgICAgICAgICAgICAgIENvc0V2ZW50Q2hhbm5lbEFkbWluOjpUeXBlRXJyb3IgKTsKKworICAgICAgdm9pZCBzdXNwZW5kX2Nvbm5lY3Rpb24oKQorICAgICAgICAgcmFpc2VzKENvbm5lY3Rpb25BbHJlYWR5SW5hY3RpdmUsIE5vdENvbm5lY3RlZCk7CisKKyAgICAgIHZvaWQgcmVzdW1lX2Nvbm5lY3Rpb24oKQorICAgICAgICAgcmFpc2VzKENvbm5lY3Rpb25BbHJlYWR5QWN0aXZlLCBOb3RDb25uZWN0ZWQpOworCisgICB9OyAvLyBTdHJ1Y3R1cmVkUHJveHlQdXNoU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFNlcXVlbmNlUHJveHlQdXNoU3VwcGxpZXIgOgorICAgICAgICAgUHJveHlTdXBwbGllciwKKyAgICAgICAgIENvc05vdGlmeUNvbW06OlNlcXVlbmNlUHVzaFN1cHBsaWVyIHsKKworICAgICAgdm9pZCBjb25uZWN0X3NlcXVlbmNlX3B1c2hfY29uc3VtZXIgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZ5Q29tbTo6U2VxdWVuY2VQdXNoQ29uc3VtZXIgcHVzaF9jb25zdW1lcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICBDb3NFdmVudENoYW5uZWxBZG1pbjo6VHlwZUVycm9yICk7CisKKyAgICAgIHZvaWQgc3VzcGVuZF9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUluYWN0aXZlLCBOb3RDb25uZWN0ZWQpOworCisgICAgICB2b2lkIHJlc3VtZV9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgfTsgLy8gU2VxdWVuY2VQcm94eVB1c2hTdXBwbGllcgorCisgICB0eXBlZGVmIGxvbmcgUHJveHlJRDsKKyAgIHR5cGVkZWYgc2VxdWVuY2UgPFByb3h5SUQ+IFByb3h5SURTZXE7CisKKyAgIGVudW0gQ2xpZW50VHlwZSB7CisgICAgICBBTllfRVZFTlQsCisgICAgICBTVFJVQ1RVUkVEX0VWRU5ULAorICAgICAgU0VRVUVOQ0VfRVZFTlQKKyAgIH07CisKKyAgIGVudW0gSW50ZXJGaWx0ZXJHcm91cE9wZXJhdG9yIHsgQU5EX09QLCBPUl9PUCB9OworCisgICB0eXBlZGVmIGxvbmcgQWRtaW5JRDsKKyAgIHR5cGVkZWYgc2VxdWVuY2U8QWRtaW5JRD4gQWRtaW5JRFNlcTsKKworICAgZXhjZXB0aW9uIEFkbWluTm90Rm91bmQge307CisgICBleGNlcHRpb24gUHJveHlOb3RGb3VuZCB7fTsKKworICAgc3RydWN0IEFkbWluTGltaXQgeworICAgICAgQ29zTm90aWZpY2F0aW9uOjpQcm9wZXJ0eU5hbWUgbmFtZTsKKyAgICAgIENvc05vdGlmaWNhdGlvbjo6UHJvcGVydHlWYWx1ZSB2YWx1ZTsKKyAgIH07CisKKyAgIGV4Y2VwdGlvbiBBZG1pbkxpbWl0RXhjZWVkZWQgeyBBZG1pbkxpbWl0IGFkbWluX3Byb3BlcnR5X2VycjsgfTsKKworICAgaW50ZXJmYWNlIENvbnN1bWVyQWRtaW4gOgorICAgICAgICAgQ29zTm90aWZpY2F0aW9uOjpRb1NBZG1pbiwKKyAgICAgICAgIENvc05vdGlmeUNvbW06Ok5vdGlmeVN1YnNjcmliZSwKKyAgICAgICAgIENvc05vdGlmeUZpbHRlcjo6RmlsdGVyQWRtaW4sCisgICAgICAgICBDb3NFdmVudENoYW5uZWxBZG1pbjo6Q29uc3VtZXJBZG1pbiB7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBZG1pbklEIE15SUQ7CisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgRXZlbnRDaGFubmVsIE15Q2hhbm5lbDsKKworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIEludGVyRmlsdGVyR3JvdXBPcGVyYXRvciBNeU9wZXJhdG9yOworCisgICAgICBhdHRyaWJ1dGUgQ29zTm90aWZ5RmlsdGVyOjpNYXBwaW5nRmlsdGVyIHByaW9yaXR5X2ZpbHRlcjsKKyAgICAgIGF0dHJpYnV0ZSBDb3NOb3RpZnlGaWx0ZXI6Ok1hcHBpbmdGaWx0ZXIgbGlmZXRpbWVfZmlsdGVyOworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgUHJveHlJRFNlcSBwdWxsX3N1cHBsaWVyczsKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm94eUlEU2VxIHB1c2hfc3VwcGxpZXJzOworCisgICAgICBQcm94eVN1cHBsaWVyIGdldF9wcm94eV9zdXBwbGllciAoIGluIFByb3h5SUQgcHJveHlfaWQgKQorICAgICAgICAgcmFpc2VzICggUHJveHlOb3RGb3VuZCApOworCisgICAgICBQcm94eVN1cHBsaWVyIG9idGFpbl9ub3RpZmljYXRpb25fcHVsbF9zdXBwbGllciAoCisgICAgICAgICAgICBpbiBDbGllbnRUeXBlIGN0eXBlLAorICAgICAgICAgICAgb3V0IFByb3h5SUQgcHJveHlfaWQpCisgICAgICAgICByYWlzZXMgKCBBZG1pbkxpbWl0RXhjZWVkZWQgKTsKKworICAgICAgUHJveHlTdXBwbGllciBvYnRhaW5fbm90aWZpY2F0aW9uX3B1c2hfc3VwcGxpZXIgKAorICAgICAgICAgICAgaW4gQ2xpZW50VHlwZSBjdHlwZSwKKyAgICAgICAgICAgIG91dCBQcm94eUlEIHByb3h5X2lkKQorICAgICAgICAgcmFpc2VzICggQWRtaW5MaW1pdEV4Y2VlZGVkICk7CisKKyAgICAgIHZvaWQgZGVzdHJveSgpOworCisgICB9OyAvLyBDb25zdW1lckFkbWluCisKKyAgIGludGVyZmFjZSBTdXBwbGllckFkbWluIDoKKyAgICAgICAgIENvc05vdGlmaWNhdGlvbjo6UW9TQWRtaW4sCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpOb3RpZnlQdWJsaXNoLAorICAgICAgICAgQ29zTm90aWZ5RmlsdGVyOjpGaWx0ZXJBZG1pbiwKKyAgICAgICAgIENvc0V2ZW50Q2hhbm5lbEFkbWluOjpTdXBwbGllckFkbWluIHsKKworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIEFkbWluSUQgTXlJRDsKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBFdmVudENoYW5uZWwgTXlDaGFubmVsOworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgSW50ZXJGaWx0ZXJHcm91cE9wZXJhdG9yIE15T3BlcmF0b3I7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm94eUlEU2VxIHB1bGxfY29uc3VtZXJzOworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIFByb3h5SURTZXEgcHVzaF9jb25zdW1lcnM7CisKKyAgICAgIFByb3h5Q29uc3VtZXIgZ2V0X3Byb3h5X2NvbnN1bWVyICggaW4gUHJveHlJRCBwcm94eV9pZCApCisgICAgICAgICByYWlzZXMgKCBQcm94eU5vdEZvdW5kICk7CisKKyAgICAgIFByb3h5Q29uc3VtZXIgb2J0YWluX25vdGlmaWNhdGlvbl9wdWxsX2NvbnN1bWVyICgKKyAgICAgICAgICAgIGluIENsaWVudFR5cGUgY3R5cGUsCisgICAgICAgICAgICBvdXQgUHJveHlJRCBwcm94eV9pZCkKKyAgICAgICAgIHJhaXNlcyAoIEFkbWluTGltaXRFeGNlZWRlZCApOworCisgICAgICBQcm94eUNvbnN1bWVyIG9idGFpbl9ub3RpZmljYXRpb25fcHVzaF9jb25zdW1lciAoCisgICAgICAgICAgICBpbiBDbGllbnRUeXBlIGN0eXBlLAorICAgICAgICAgICAgb3V0IFByb3h5SUQgcHJveHlfaWQpCisgICAgICAgICByYWlzZXMgKCBBZG1pbkxpbWl0RXhjZWVkZWQgKTsKKworICAgICAgdm9pZCBkZXN0cm95KCk7CisKKyAgIH07IC8vIFN1cHBsaWVyQWRtaW4KKworICAgaW50ZXJmYWNlIEV2ZW50Q2hhbm5lbCA6CisgICAgICBDb3NOb3RpZmljYXRpb246OlFvU0FkbWluLAorICAgICAgQ29zTm90aWZpY2F0aW9uOjpBZG1pblByb3BlcnRpZXNBZG1pbiwKKyAgICAgIENvc0V2ZW50Q2hhbm5lbEFkbWluOjpFdmVudENoYW5uZWwgeworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgRXZlbnRDaGFubmVsRmFjdG9yeSBNeUZhY3Rvcnk7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBDb25zdW1lckFkbWluIGRlZmF1bHRfY29uc3VtZXJfYWRtaW47CisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgU3VwcGxpZXJBZG1pbiBkZWZhdWx0X3N1cHBsaWVyX2FkbWluOworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgQ29zTm90aWZ5RmlsdGVyOjpGaWx0ZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgICBkZWZhdWx0X2ZpbHRlcl9mYWN0b3J5OworCisgICAgICBDb25zdW1lckFkbWluIG5ld19mb3JfY29uc3VtZXJzKAorICAgICAgICAgICAgaW4gSW50ZXJGaWx0ZXJHcm91cE9wZXJhdG9yIG9wLAorICAgICAgICAgICAgb3V0IEFkbWluSUQgaWQgKTsKKworICAgICAgU3VwcGxpZXJBZG1pbiBuZXdfZm9yX3N1cHBsaWVycygKKyAgICAgICAgICAgIGluIEludGVyRmlsdGVyR3JvdXBPcGVyYXRvciBvcCwKKyAgICAgICAgICAgIG91dCBBZG1pbklEIGlkICk7CisKKyAgICAgIENvbnN1bWVyQWRtaW4gZ2V0X2NvbnN1bWVyYWRtaW4gKCBpbiBBZG1pbklEIGlkICkKKyAgICAgICAgIHJhaXNlcyAoQWRtaW5Ob3RGb3VuZCk7CisKKyAgICAgIFN1cHBsaWVyQWRtaW4gZ2V0X3N1cHBsaWVyYWRtaW4gKCBpbiBBZG1pbklEIGlkICkKKyAgICAgICAgIHJhaXNlcyAoQWRtaW5Ob3RGb3VuZCk7CisKKyAgICAgIEFkbWluSURTZXEgZ2V0X2FsbF9jb25zdW1lcmFkbWlucygpOworICAgICAgQWRtaW5JRFNlcSBnZXRfYWxsX3N1cHBsaWVyYWRtaW5zKCk7CisKKyAgIH07IC8vIEV2ZW50Q2hhbm5lbAorCisgICB0eXBlZGVmIGxvbmcgQ2hhbm5lbElEOworICAgdHlwZWRlZiBzZXF1ZW5jZTxDaGFubmVsSUQ+IENoYW5uZWxJRFNlcTsKKworICAgZXhjZXB0aW9uIENoYW5uZWxOb3RGb3VuZCB7fTsKKworICAgaW50ZXJmYWNlIEV2ZW50Q2hhbm5lbEZhY3RvcnkgeworCisgICAgICBFdmVudENoYW5uZWwgY3JlYXRlX2NoYW5uZWwgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpRb1NQcm9wZXJ0aWVzIGluaXRpYWxfcW9zLAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpBZG1pblByb3BlcnRpZXMgaW5pdGlhbF9hZG1pbiwKKyAgICAgICAgICAgIG91dCBDaGFubmVsSUQgaWQpCisgICAgICAgICByYWlzZXMoQ29zTm90aWZpY2F0aW9uOjpVbnN1cHBvcnRlZFFvUywKKyAgICAgICAgICAgICAgICBDb3NOb3RpZmljYXRpb246OlVuc3VwcG9ydGVkQWRtaW4gKTsKKworICAgICAgQ2hhbm5lbElEU2VxIGdldF9hbGxfY2hhbm5lbHMoKTsKKworICAgICAgRXZlbnRDaGFubmVsIGdldF9ldmVudF9jaGFubmVsICggaW4gQ2hhbm5lbElEIGlkICkKKyAgICAgICAgIHJhaXNlcyAoQ2hhbm5lbE5vdEZvdW5kKTsKKworICAgfTsgLy8gRXZlbnRDaGFubmVsRmFjdG9yeQorICAgCit9OyAvLyBDb3NOb3RpZnlDaGFubmVsQWRtaW4KKworI2VuZGlmIC8qIF9DT1NfTk9USUZZX0NIQU5ORUxfQURNSU5fSURMXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9Db3NOb3RpZnlDb21tLmlkbCBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q29tbS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkZjNkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q29tbS5pZGwKQEAgLTAsMCArMSwxMzUgQEAKKy8qKgorICogVGhpcyBtb2R1bGUgaXMgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQgQ09SQkEgTm90aWZpY2F0aW9uIFNlcnZpY2UKKyAqIDEuMSwgYXMgZGVzY3JpYmVkIGluOgorICoKKyAqIGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9OT1QvMS4xLworICoKKyAqIFRoZSBpZGwgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBmb2xsb3dpbmcgUERGOgorICogZm9ybWFsLzA0LTEwLTEzCisgKi8KKworI2lmbmRlZiBfQ09TX05PVElGWV9DT01NX0lETF8KKyNkZWZpbmUgX0NPU19OT1RJRllfQ09NTV9JRExfCisKKyNpbmNsdWRlICJDb3NOb3RpZmljYXRpb24uaWRsIgorI2luY2x1ZGUgIkNvc0V2ZW50Q29tbS5pZGwiCisKKyNwcmFnbWEgcHJlZml4ICJvbWcub3JnIgorCittb2R1bGUgQ29zTm90aWZ5Q29tbSB7CisKKyAgIGV4Y2VwdGlvbiBJbnZhbGlkRXZlbnRUeXBlIHsgQ29zTm90aWZpY2F0aW9uOjpfRXZlbnRUeXBlIHR5cGU7IH07CisKKyAgIGludGVyZmFjZSBOb3RpZnlQdWJsaXNoIHsKKworICAgICAgdm9pZCBvZmZlcl9jaGFuZ2UgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpFdmVudFR5cGVTZXEgYWRkZWQsCisgICAgICAgICAgICBpbiBDb3NOb3RpZmljYXRpb246OkV2ZW50VHlwZVNlcSByZW1vdmVkICkKKyAgICAgICAgIHJhaXNlcyAoIEludmFsaWRFdmVudFR5cGUgKTsKKworICAgfTsgLy8gTm90aWZ5UHVibGlzaAorCisgICBpbnRlcmZhY2UgTm90aWZ5U3Vic2NyaWJlIHsKKworICAgICAgdm9pZCBzdWJzY3JpcHRpb25fY2hhbmdlKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpFdmVudFR5cGVTZXEgYWRkZWQsCisgICAgICAgICAgICBpbiBDb3NOb3RpZmljYXRpb246OkV2ZW50VHlwZVNlcSByZW1vdmVkICkKKyAgICAgICAgIHJhaXNlcyAoIEludmFsaWRFdmVudFR5cGUgKTsKKworICAgfTsgLy8gTm90aWZ5U3Vic2NyaWJlCisKKyAgIGludGVyZmFjZSBQdXNoQ29uc3VtZXIgOgorICAgICAgTm90aWZ5UHVibGlzaCwKKyAgICAgIENvc0V2ZW50Q29tbTo6UHVzaENvbnN1bWVyIHsKKyAgIH07IC8vIFB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgUHVsbENvbnN1bWVyIDoKKyAgICAgIE5vdGlmeVB1Ymxpc2gsCisgICAgICBDb3NFdmVudENvbW06OlB1bGxDb25zdW1lciB7CisgICB9OyAvLyBQdWxsQ29uc3VtZXIKKworICAgaW50ZXJmYWNlIFB1bGxTdXBwbGllciA6CisgICAgICBOb3RpZnlTdWJzY3JpYmUsCisgICAgICBDb3NFdmVudENvbW06OlB1bGxTdXBwbGllciB7CisgICB9OyAvLyBQdWxsU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFB1c2hTdXBwbGllciA6CisgICAgICBOb3RpZnlTdWJzY3JpYmUsCisgICAgICBDb3NFdmVudENvbW06OlB1c2hTdXBwbGllciB7CisgICB9OworCisgICBpbnRlcmZhY2UgU3RydWN0dXJlZFB1c2hDb25zdW1lciA6IE5vdGlmeVB1Ymxpc2ggeworCisgICAgICB2b2lkIHB1c2hfc3RydWN0dXJlZF9ldmVudCgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6U3RydWN0dXJlZEV2ZW50IG5vdGlmaWNhdGlvbikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENvbW06OkRpc2Nvbm5lY3RlZCk7CisKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9zdHJ1Y3R1cmVkX3B1c2hfY29uc3VtZXIoKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgU3RydWN0dXJlZFB1bGxDb25zdW1lciA6IE5vdGlmeVB1Ymxpc2ggeworICAgICAgCisgICAgICB2b2lkIGRpc2Nvbm5lY3Rfc3RydWN0dXJlZF9wdWxsX2NvbnN1bWVyKCk7CisKKyAgIH07IC8vIFN0cnVjdHVyZWRQdWxsQ29uc3VtZXIKKworICAgaW50ZXJmYWNlIFN0cnVjdHVyZWRQdWxsU3VwcGxpZXIgOiBOb3RpZnlTdWJzY3JpYmUgeworCisgICAgICBDb3NOb3RpZmljYXRpb246OlN0cnVjdHVyZWRFdmVudCBwdWxsX3N0cnVjdHVyZWRfZXZlbnQoKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q29tbTo6RGlzY29ubmVjdGVkKTsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpTdHJ1Y3R1cmVkRXZlbnQgdHJ5X3B1bGxfc3RydWN0dXJlZF9ldmVudCgKKyAgICAgICAgICAgIG91dCBib29sZWFuIGhhc19ldmVudCkKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENvbW06OkRpc2Nvbm5lY3RlZCk7CisKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9zdHJ1Y3R1cmVkX3B1bGxfc3VwcGxpZXIoKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFB1bGxTdXBwbGllcgorCisgICBpbnRlcmZhY2UgU3RydWN0dXJlZFB1c2hTdXBwbGllciA6IE5vdGlmeVN1YnNjcmliZSB7CisgICAgICAKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9zdHJ1Y3R1cmVkX3B1c2hfc3VwcGxpZXIoKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFB1c2hTdXBwbGllcgorCisgICBpbnRlcmZhY2UgU2VxdWVuY2VQdXNoQ29uc3VtZXIgOiBOb3RpZnlQdWJsaXNoIHsKKworICAgICAgdm9pZCBwdXNoX3N0cnVjdHVyZWRfZXZlbnRzKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpFdmVudEJhdGNoIG5vdGlmaWNhdGlvbnMpCisgICAgICAgICByYWlzZXMoQ29zRXZlbnRDb21tOjpEaXNjb25uZWN0ZWQpOworCisgICAgICB2b2lkIGRpc2Nvbm5lY3Rfc2VxdWVuY2VfcHVzaF9jb25zdW1lcigpOworCisgICB9OyAvLyBTZXF1ZW5jZVB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgU2VxdWVuY2VQdWxsQ29uc3VtZXIgOiBOb3RpZnlQdWJsaXNoIHsKKyAgICAgIAorICAgICAgdm9pZCBkaXNjb25uZWN0X3NlcXVlbmNlX3B1bGxfY29uc3VtZXIoKTsKKworICAgfTsgLy8gU2VxdWVuY2VQdWxsQ29uc3VtZXIKKworICAgaW50ZXJmYWNlIFNlcXVlbmNlUHVsbFN1cHBsaWVyIDogTm90aWZ5U3Vic2NyaWJlIHsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpFdmVudEJhdGNoIHB1bGxfc3RydWN0dXJlZF9ldmVudHMoCisgICAgICAgICAgICBpbiBsb25nIG1heF9udW1iZXIgKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q29tbTo6RGlzY29ubmVjdGVkKTsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpFdmVudEJhdGNoIHRyeV9wdWxsX3N0cnVjdHVyZWRfZXZlbnRzKAorICAgICAgICAgICAgaW4gbG9uZyBtYXhfbnVtYmVyLAorICAgICAgICAgICAgb3V0IGJvb2xlYW4gaGFzX2V2ZW50KQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q29tbTo6RGlzY29ubmVjdGVkKTsKKworICAgICAgdm9pZCBkaXNjb25uZWN0X3NlcXVlbmNlX3B1bGxfc3VwcGxpZXIoKTsKKworICAgfTsgLy8gU2VxdWVuY2VQdWxsU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFNlcXVlbmNlUHVzaFN1cHBsaWVyIDogTm90aWZ5U3Vic2NyaWJlIHsKKyAgICAgIAorICAgICAgdm9pZCBkaXNjb25uZWN0X3NlcXVlbmNlX3B1c2hfc3VwcGxpZXIoKTsKKworICAgfTsgLy8gU2VxdWVuY2VQdXNoU3VwcGxpZXIKKworfTsgLy8gQ29zTm90aWZ5Q29tbQorCisjZW5kaWYgLyogX0NPU19OT1RJRllfQ09NTV9JRExfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc05vdGlmeUZpbHRlci5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc05vdGlmeUZpbHRlci5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3Y2MzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5RmlsdGVyLmlkbApAQCAtMCwwICsxLDE4NyBAQAorLyoqCisgKiBUaGlzIG1vZHVsZSBpcyB0YWtlbiBmcm9tIHRoZSBzdGFuZGFyZCBDT1JCQSBOb3RpZmljYXRpb24gU2VydmljZQorICogMS4xLCBhcyBkZXNjcmliZWQgaW46CisgKgorICogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL05PVC8xLjEvCisgKgorICogVGhlIGlkbCB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIGZvbGxvd2luZyBQREY6CisgKiBmb3JtYWwvMDQtMTAtMTMKKyAqLworCisjaWZuZGVmIF9DT1NfTk9USUZZX0ZJTFRFUl9JRExfCisjZGVmaW5lIF9DT1NfTk9USUZZX0ZJTFRFUl9JRExfCisKKyNpbmNsdWRlICJDb3NOb3RpZnlDb21tLmlkbCIKKworI3ByYWdtYSBwcmVmaXggIm9tZy5vcmciCisKK21vZHVsZSBDb3NOb3RpZnlGaWx0ZXIgeworCisgICB0eXBlZGVmIGxvbmcgQ29uc3RyYWludElEOworCisgICBzdHJ1Y3QgQ29uc3RyYWludEV4cCB7CisgICAgICBDb3NOb3RpZmljYXRpb246OkV2ZW50VHlwZVNlcSBldmVudF90eXBlczsKKyAgICAgIHN0cmluZyBjb25zdHJhaW50X2V4cHI7CisgICB9OworCisgICB0eXBlZGVmIHNlcXVlbmNlPENvbnN0cmFpbnRJRD4gQ29uc3RyYWludElEU2VxOworICAgdHlwZWRlZiBzZXF1ZW5jZTxDb25zdHJhaW50RXhwPiBDb25zdHJhaW50RXhwU2VxOworCisgICBzdHJ1Y3QgQ29uc3RyYWludEluZm8geworICAgICAgQ29uc3RyYWludEV4cCBjb25zdHJhaW50X2V4cHJlc3Npb247CisgICAgICBDb25zdHJhaW50SUQgY29uc3RyYWludF9pZDsKKyAgIH07CisKKyAgIHR5cGVkZWYgc2VxdWVuY2U8Q29uc3RyYWludEluZm8+IENvbnN0cmFpbnRJbmZvU2VxOworCisgICBzdHJ1Y3QgTWFwcGluZ0NvbnN0cmFpbnRQYWlyIHsKKyAgICAgIENvbnN0cmFpbnRFeHAgY29uc3RyYWludF9leHByZXNzaW9uOworICAgICAgYW55IHJlc3VsdF90b19zZXQ7CisgICB9OworCisgICB0eXBlZGVmIHNlcXVlbmNlPE1hcHBpbmdDb25zdHJhaW50UGFpcj4gTWFwcGluZ0NvbnN0cmFpbnRQYWlyU2VxOworCisgICBzdHJ1Y3QgTWFwcGluZ0NvbnN0cmFpbnRJbmZvIHsKKyAgICAgIENvbnN0cmFpbnRFeHAgY29uc3RyYWludF9leHByZXNzaW9uOworICAgICAgQ29uc3RyYWludElEIGNvbnN0cmFpbnRfaWQ7CisgICAgICBhbnkgdmFsdWU7CisgICB9OworCisgICB0eXBlZGVmIHNlcXVlbmNlPE1hcHBpbmdDb25zdHJhaW50SW5mbz4gTWFwcGluZ0NvbnN0cmFpbnRJbmZvU2VxOworCisgICB0eXBlZGVmIGxvbmcgQ2FsbGJhY2tJRDsKKyAgIHR5cGVkZWYgc2VxdWVuY2U8Q2FsbGJhY2tJRD4gQ2FsbGJhY2tJRFNlcTsKKworICAgZXhjZXB0aW9uIFVuc3VwcG9ydGVkRmlsdGVyYWJsZURhdGEge307CisgICBleGNlcHRpb24gSW52YWxpZEdyYW1tYXIge307CisgICBleGNlcHRpb24gSW52YWxpZENvbnN0cmFpbnQge0NvbnN0cmFpbnRFeHAgY29uc3RyO307CisgICBleGNlcHRpb24gRHVwbGljYXRlQ29uc3RyYWludElEIHtDb25zdHJhaW50SUQgaWQ7fTsKKyAgIGV4Y2VwdGlvbiBDb25zdHJhaW50Tm90Rm91bmQge0NvbnN0cmFpbnRJRCBpZDt9OworICAgCisgICBleGNlcHRpb24gQ2FsbGJhY2tOb3RGb3VuZCB7fTsKKworICAgZXhjZXB0aW9uIEludmFsaWRWYWx1ZSB7Q29uc3RyYWludEV4cCBjb25zdHI7IGFueSB2YWx1ZTt9OworCisgICBpbnRlcmZhY2UgRmlsdGVyIHsKKworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIHN0cmluZyBjb25zdHJhaW50X2dyYW1tYXI7CisKKyAgICAgIENvbnN0cmFpbnRJbmZvU2VxIGFkZF9jb25zdHJhaW50cyAoCisgICAgICAgICAgICBpbiBDb25zdHJhaW50RXhwU2VxIGNvbnN0cmFpbnRfbGlzdCkKKyAgICAgICAgIHJhaXNlcyAoSW52YWxpZENvbnN0cmFpbnQpOworCisgICAgICB2b2lkIG1vZGlmeV9jb25zdHJhaW50cyAoCisgICAgICAgICAgICBpbiBDb25zdHJhaW50SURTZXEgZGVsX2xpc3QsCisgICAgICAgICAgICBpbiBDb25zdHJhaW50SW5mb1NlcSBtb2RpZnlfbGlzdCkKKyAgICAgICAgIHJhaXNlcyAoSW52YWxpZENvbnN0cmFpbnQsIENvbnN0cmFpbnROb3RGb3VuZCk7CisKKyAgICAgIENvbnN0cmFpbnRJbmZvU2VxIGdldF9jb25zdHJhaW50cygKKyAgICAgICAgICAgIGluIENvbnN0cmFpbnRJRFNlcSBpZF9saXN0KQorICAgICAgICAgcmFpc2VzIChDb25zdHJhaW50Tm90Rm91bmQpOworCisgICAgICBDb25zdHJhaW50SW5mb1NlcSBnZXRfYWxsX2NvbnN0cmFpbnRzKCk7CisKKyAgICAgIHZvaWQgcmVtb3ZlX2FsbF9jb25zdHJhaW50cygpOworCisgICAgICB2b2lkIGRlc3Ryb3koKTsKKworICAgICAgYm9vbGVhbiBtYXRjaCAoIGluIGFueSBmaWx0ZXJhYmxlX2RhdGEgKQorICAgICAgICAgcmFpc2VzIChVbnN1cHBvcnRlZEZpbHRlcmFibGVEYXRhKTsKKworICAgICAgYm9vbGVhbiBtYXRjaF9zdHJ1Y3R1cmVkICgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6U3RydWN0dXJlZEV2ZW50IGZpbHRlcmFibGVfZGF0YSApCisgICAgICAgICByYWlzZXMgKFVuc3VwcG9ydGVkRmlsdGVyYWJsZURhdGEpOworCisgICAgICBib29sZWFuIG1hdGNoX3R5cGVkICgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6UHJvcGVydHlTZXEgZmlsdGVyYWJsZV9kYXRhICkKKyAgICAgICAgIHJhaXNlcyAoVW5zdXBwb3J0ZWRGaWx0ZXJhYmxlRGF0YSk7CisKKyAgICAgIENhbGxiYWNrSUQgYXR0YWNoX2NhbGxiYWNrICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06Ok5vdGlmeVN1YnNjcmliZSBjYWxsYmFjayk7CisKKyAgICAgIHZvaWQgZGV0YWNoX2NhbGxiYWNrICggaW4gQ2FsbGJhY2tJRCBjYWxsYmFjaykKKyAgICAgICAgIHJhaXNlcyAoIENhbGxiYWNrTm90Rm91bmQgKTsKKworICAgICAgQ2FsbGJhY2tJRFNlcSBnZXRfY2FsbGJhY2tzKCk7CisKKyAgIH07IC8vIEZpbHRlcgorCisgICBpbnRlcmZhY2UgTWFwcGluZ0ZpbHRlciB7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBzdHJpbmcgY29uc3RyYWludF9ncmFtbWFyOworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgQ09SQkE6OlR5cGVDb2RlIHZhbHVlX3R5cGU7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBhbnkgZGVmYXVsdF92YWx1ZTsKKworICAgICAgTWFwcGluZ0NvbnN0cmFpbnRJbmZvU2VxIGFkZF9tYXBwaW5nX2NvbnN0cmFpbnRzICgKKyAgICAgICAgICAgIGluIE1hcHBpbmdDb25zdHJhaW50UGFpclNlcSBwYWlyX2xpc3QpCisgICAgICAgICByYWlzZXMgKEludmFsaWRDb25zdHJhaW50LCBJbnZhbGlkVmFsdWUpOworCisgICAgICB2b2lkIG1vZGlmeV9tYXBwaW5nX2NvbnN0cmFpbnRzICgKKyAgICAgICAgICAgIGluIENvbnN0cmFpbnRJRFNlcSBkZWxfbGlzdCwKKyAgICAgICAgICAgIGluIE1hcHBpbmdDb25zdHJhaW50SW5mb1NlcSBtb2RpZnlfbGlzdCkKKyAgICAgICAgIHJhaXNlcyAoSW52YWxpZENvbnN0cmFpbnQsIEludmFsaWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnROb3RGb3VuZCk7CisKKyAgICAgIE1hcHBpbmdDb25zdHJhaW50SW5mb1NlcSBnZXRfbWFwcGluZ19jb25zdHJhaW50cyAoCisgICAgICAgICAgICBpbiBDb25zdHJhaW50SURTZXEgaWRfbGlzdCkKKyAgICAgICAgIHJhaXNlcyAoQ29uc3RyYWludE5vdEZvdW5kKTsKKworICAgICAgTWFwcGluZ0NvbnN0cmFpbnRJbmZvU2VxIGdldF9hbGxfbWFwcGluZ19jb25zdHJhaW50cygpOworCisgICAgICB2b2lkIHJlbW92ZV9hbGxfbWFwcGluZ19jb25zdHJhaW50cygpOworCisgICAgICB2b2lkIGRlc3Ryb3koKTsKKworICAgICAgYm9vbGVhbiBtYXRjaCAoCisgICAgICAgICAgICBpbiBhbnkgZmlsdGVyYWJsZV9kYXRhLAorICAgICAgICAgICAgb3V0IGFueSByZXN1bHRfdG9fc2V0ICkKKyAgICAgICAgIHJhaXNlcyAoVW5zdXBwb3J0ZWRGaWx0ZXJhYmxlRGF0YSk7CisKKyAgICAgIGJvb2xlYW4gbWF0Y2hfc3RydWN0dXJlZCAoCisgICAgICAgICAgICBpbiBDb3NOb3RpZmljYXRpb246OlN0cnVjdHVyZWRFdmVudCBmaWx0ZXJhYmxlX2RhdGEsCisgICAgICAgICAgICBvdXQgYW55IHJlc3VsdF90b19zZXQpCisgICAgICAgICByYWlzZXMgKFVuc3VwcG9ydGVkRmlsdGVyYWJsZURhdGEpOworCisgICAgICBib29sZWFuIG1hdGNoX3R5cGVkICgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6UHJvcGVydHlTZXEgZmlsdGVyYWJsZV9kYXRhLAorICAgICAgICAgICAgb3V0IGFueSByZXN1bHRfdG9fc2V0KQorICAgICAgICAgcmFpc2VzIChVbnN1cHBvcnRlZEZpbHRlcmFibGVEYXRhKTsKKworICAgfTsgLy8gTWFwcGluZ0ZpbHRlcgorCisgICBpbnRlcmZhY2UgRmlsdGVyRmFjdG9yeSB7CisKKyAgICAgIEZpbHRlciBjcmVhdGVfZmlsdGVyICggaW4gc3RyaW5nIGNvbnN0cmFpbnRfZ3JhbW1hcikKKyAgICAgICAgIHJhaXNlcyAoSW52YWxpZEdyYW1tYXIpOworCisgICAgICBNYXBwaW5nRmlsdGVyIGNyZWF0ZV9tYXBwaW5nX2ZpbHRlciAoCisgICAgICAgICAgICBpbiBzdHJpbmcgY29uc3RyYWludF9ncmFtbWFyLAorICAgICAgICAgICAgaW4gYW55IGRlZmF1bHRfdmFsdWUpCisgICAgICAgICByYWlzZXMoSW52YWxpZEdyYW1tYXIpOworCisgICB9OyAvLyBGaWx0ZXJGYWN0b3J5CisKKyAgIHR5cGVkZWYgbG9uZyBGaWx0ZXJJRDsKKyAgIHR5cGVkZWYgc2VxdWVuY2U8RmlsdGVySUQ+IEZpbHRlcklEU2VxOworCisgICBleGNlcHRpb24gRmlsdGVyTm90Rm91bmQge307CisKKyAgIGludGVyZmFjZSBGaWx0ZXJBZG1pbiB7CisKKyAgICAgIEZpbHRlcklEIGFkZF9maWx0ZXIgKCBpbiBGaWx0ZXIgbmV3X2ZpbHRlciApOworCisgICAgICB2b2lkIHJlbW92ZV9maWx0ZXIgKCBpbiBGaWx0ZXJJRCBmaWx0ZXIgKSByYWlzZXMgKCBGaWx0ZXJOb3RGb3VuZCApOworCisgICAgICBGaWx0ZXIgZ2V0X2ZpbHRlciAoIGluIEZpbHRlcklEIGZpbHRlciApIHJhaXNlcyAoIEZpbHRlck5vdEZvdW5kICk7CisKKyAgICAgIEZpbHRlcklEU2VxIGdldF9hbGxfZmlsdGVycygpOworCisgICAgICB2b2lkIHJlbW92ZV9hbGxfZmlsdGVycygpOworCisgICB9OyAvLyBGaWx0ZXJBZG1pbgorCit9OyAvLyBDb3NOb3RpZnlGaWx0ZXIKKworI2VuZGlmIC8qIF9DT1NfTk9USUZZX0ZJTFRFUl9JRExfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5YzkzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvYWJvdXQuaHRtbApAQCAtMCwwICsxLDM5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHBzOi8vZWNsaXBzZS5vcmcvbGVnYWwvZXBsL2xvbmdhYm91dC5odG1sIC0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKworPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+PGVtPk9jdG9iZXIgNCwgMjAxNjwvZW0+PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgiQ29udGVudCIpLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCisJCQorCQk8aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+CisJCTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKKwkJZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCisJCWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciAKKwkJdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KKwkJPHA+PGVtPgorCQk8c3Ryb25nPm9kczUzMC5pZGw8L3N0cm9uZz4gPGJyPjxicj4KKwkJVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFTQU0gT0RTIHN0YW5kYXJkIGFuZCBpcyBub3Qgc3ViamVjdCB0byBtb2RpZmljYXRpb24uIAorCQk8L2VtPjwvcD4KKworCisKKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9pZGwuY29uZmlnIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9pZGwuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzY3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL2lkbC5jb25maWcKQEAgLTAsMCArMSw2IEBACitQa2dQcmVmaXguQ29zRXZlbnRDb21tPW9yZy5vbWcNCitQa2dQcmVmaXguQ29zTm90aWZpY2F0aW9uPW9yZy5vbWcNCitQa2dQcmVmaXguQ29zTm90aWZ5Q29tbT1vcmcub21nDQorUGtnUHJlZml4LkNvc05vdGlmeUZpbHRlcj1vcmcub21nDQorUGtnUHJlZml4LkNvc0V2ZW50Q2hhbm5lbEFkbWluPW9yZy5vbWcNCitQa2dQcmVmaXguQ29zTm90aWZ5Q2hhbm5lbEFkbWluPW9yZy5vbWcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL29kczUzMC5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL29kczUzMC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3MTUwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvb2RzNTMwLmlkbApAQCAtMCwwICsxLDEwODgzIEBACisvLyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICAgICogICAgIEFTQU0gT0RTIDUuMy4wIEludGVyZmFjZSBEZWZpbml0aW9uICAgICAqCisvLyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyAgICBHZW5lcmF0ZWQ6IFR1ZSBOb3YgMjAgMDk6Mjg6MzcgQ0VUIDIwMTIKKy8vCisvLyBNb3JlIGV4cGxhbmF0aW9uIGZvciB0aGUgbWV0aG9kIGdldEluc3RhbmNlc0V4IG9mIHRoZSBpbnRlcmZhY2UKKy8vIEFwcGxFbGVtQWNjZXNzLiAgIE1vcmUgZGV0YWlscyBmb3IgdGhlIG1ldGhvZCBzZXRSZWxhdGlvblR5cGUgb2YgdGhlCisvLyBpbnRlcmZhY2UgQXBwbGljYXRpb25SZWxhdGlvbi4KKy8vCisvLyBNZXRob2QgZ2V0UmVsYXRpb25CeUJhc2VOYW1lIG9mIHRoZSBpbnRlcmZhY2UgQXBwbGljYXRpb25FbGVtZW50IGFkZGVkLiAgCisvLyBNZXRob2QgZ2V0SW52ZXJzZVJlbGF0aW9uTmFtZSBvZiBpbnN0YW5jZSBCYXNlUmVsYXRpb24gYWRkZWQuICAgQmV0dGVyCisvLyBleHBsYW5hdGlvbiBpbiB0aGUgY29tbWVudHMuICBSZW1vdmVkIHVudXNlZCBlcnJvciBjb2RlcyBvZiB0aGUgZXhjZXB0aW9ucy4KKy8vCisvLyAyMDAzLTEyLTMxCisvLyBPRFMgVmVyc2lvbiA1LjAKKy8vCisvLyBBZGQgU2VsT3Bjb2RlIElTX05VTEwgYW5kIElTX05PVF9OVUxMLiAgQWRkIGV4Y2VwdGlvbiBBT19JTlZBTElEX0RBVEFUWVBFCisvLyB0byB0aGUgbWV0aG9kIHNldEVudW1lcmF0aW9uRGVmaW5pdGlvbiBvZiB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRWxlbWVudC4KKy8vICBNZXRob2QgZ2V0RW51bWVyYXRpb25EZWZpbml0aW9uIGFkZGVkIHRvIHRoZSBJbnRlcmZhY2UgQmFzZVJlbGF0aW9uLiAgQWRkCisvLyBjb21tZW50IHRvIG1ldGhvZHMgZ2V0Rm9ybXVsYSBhbmQgc2V0Rm9ybXVsYSBvZiBpbnRlcmZhY2UgQ29sdW1uLgorLy8KKy8vIEFkZCB0aGUgdmFyaWFibGUgQ1JFQVRFX0NPU0VTU0lPTl9BTExPV0VEIGF0IHRoZSBtZXRob2QgbmV3U2Vzc2lvbiBhdCB0aGUKKy8vIGludGVyZmFjZSBBb0ZhY3RvcnkuICAgQWRkIHRoZSBtZXRob2RzIGNyZWF0ZUNvU2Vzc2lvbiBhbmQgZ2V0VXNlciBhdCB0aGUKKy8vIGludGVyZmFjZSBBb1Nlc3Npb24uICBBZGQgdmFsdWVzIG9mIGxvY2FsY29sdW1uIGF0IHRoZSBtZXRob2RzCisvLyBnZXRJbnN0YW5jZXMsIGdldEluc3RhbmNlc0V4dCBhbmQgdXBkYXRlSW5zdGFuY2VzIG9mIHRoZSBpbnRlcmZhY2UKKy8vIEFwcGxFbGVtQWNjZXNzLiAgQ29tbWVudCBvZiBtZXRob2Qgc2V0VmFsdWUgb2YgdGhlIGludGVyZmFjZSBWYWx1ZU1hdHJpeAorLy8gcmV3b3JrZWQuCisvLworLy8gQ29ycmVjdCB0aGUgTWV0aG9kIGdldFJlbGF0aW9uQnlCYXNlTmFtZSBvZiB0aGUgaW50ZXJmYWNlCisvLyBBcHBsaWNhdGlvbkVsZW1lbnQgdG8gdGhlIE1ldGhvZCBnZXRSZWxhdGlvbnNCeUJhc2VOYW1lLCBtaXN0YWtlIGluCisvLyBJbnRlcmZhY2UgZGVmaW5pdGlvbiB0aGVyZSBhcmUgYXQgc29tZSBlbGVtZW50cyByZWxhdGlvbnMgZGVyaXZlZCBmcm9tIHRoZQorLy8gc2FtZSBiYXNlIHJlbGF0aW9uIGFsbG93ZWQuCisvLworLy8gQWRkLCBTVU0gdG8gdGhlIEFnZ3JGdW5jLiAgQ2hhbmdlIGNvbW1lbnQgb2YgbWV0aG9kIGdldEFwcGxpY2F0aW9uU3RydWN0dXJlCisvLyBhbmQgZ2V0QmFzZVN0cnVjdHVyZSBvZiB0aGUgaW50ZXJmYWNlIEFvU2Vzc2lvbiwgdGhlIG1ldGhvZAorLy8gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUgb2YgdGhlIGludGVyZmFjZSBBcHBsaWNhdGlvbkVsZW1lbnQuYW5kIHRoZSBtZXRob2QKKy8vIGdldFJlbGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgQmFzZVN0cnVjdHVyZS4gIEFkZCB2ZXJzaW9uIHN0cmluZyBkZXNjcmlwdGlvbgorLy8gYXQgbWV0aG9kIGdldEludGVyZmFjZVZlcnNpb24gb2YgaW50ZXJmYWNlIEFvRmFjdG9yeS4KKy8vCisvLyBBZGQgdGhlIEVudW1lcmF0aW9uIFZhbHVlTWF0cml4TW9kZS4gIENoYW5nZSB0aGUgY29tbWVudCBvZiB0aGUgTWV0aG9kcworLy8gMTMwMDEsIDEzMDA0LCAxMzAwNiwgMTQwMTgsIDE0MDIyLCAxNjAwMywgMjEwMDIsIDI0MDA3ICBBZGQgdGhlIGV4Y2VwdGlvbgorLy8gQU9fSU5WQUxJRF9WQUxVRU1BVFJJWF9TVFJVQ1RVUkUgZm9yIHRoZSBtZXRob2QgZ2V0VmFsdWVNYXRyaXggb2YgdGhlCisvLyBpbnRlcmZhY2UgTWVhc3VyZW1lbnQgYW5kIEFwcGxFbGVtQWNjZXNzLiAgQWRkIHRoZSBuZXcgbWV0aG9kCisvLyBnZXRWYWx1ZU1hdHJpeEluTW9kZSBvZiB0aGUgaW50ZXJmYWNlcyBNZWFzdXJlbWVudCAoMTYwMDUpLCBTdWJNYXRyaXgKKy8vICgyMTAwNCkgYW5kIEFwcGxFbGVtQWNjZXNzICAgQWRkIHRoZSBtZXRob2RzIGdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24KKy8vICgxMzAxMyksIHNldFNlcXVlbmNlUmVwcmVzZW50YXRpb24gKDEzMDE0KSwgZ2V0R2VuZXJhdGlvblBhcmFtZXRlcnMKKy8vICgxMzAxNSksIHNldEdlbmVyYXRpb25QYXJhbWV0ZXJzICgxMzAxNikgYW5kIGdldFJhd0RhdGFUeXBlICgxMzAxNykgb2YgdGhlCisvLyBpbnRlcmZhY2UgQ29sdW1uLiAgQWRkIHRoZSBtZXRob2QgZ2V0TW9kZSAoMjIwMjIpIG9mIHRoZSBpbnRlcmZhY2UKKy8vIFZhbHVlTWF0cml4LiAgTGl0dGxlIGNoYW5nZXMgaW4gZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZHMsIHNwZWNpZnkgd2hpY2gKKy8vIG9iamVjdCBpcyBtb2RpZmllZCwgd2l0aCB0aGUgbnVtYmVycyA0MDA4LCA0MDA5LCA0MDEwLCA0MDExLCA0MDEyLCA0MDEzLAorLy8gNDAxNCwgNDAxOSwgNTAwMSwgNTAwMiwgNTAyMCwgNTAyMSwgNTAyMiwgNTAyMywgNjAxMCwgNjAxMSwgNjAxMiwgNjAxMywKKy8vIDYwMTQsIDYwMTUsIDYwMTYsIDYwMTgsIDcwMDIsIDcwMDMsIDcwMTQsIDcwMTUsIDEyMDAxLCAxMjAwNiwgMTIwMDcsIDEzMDA1LAorLy8gMTQwMDEsIDE0MDAyLCAxNDAxNCwgMTQwMTYsIDE0MDE3LCAyMjAxNCwgMjIwMTkuICBDb3JyZWN0IHR5cGluZyBlcnJvcnMgaW4KKy8vIG1ldGhvZCAyNDAwNQorLy8KKy8vIENvcnJlY3QgdGhlIGVudW1lcmF0aW9uIFZhbHVlTWF0cml4TW9kZS4gQ29ycmVjdCB0eXBpbmcgZXJyb3JzIGF0IG1ldGhvZAorLy8gMTMwMTQuIEV4dGVuZCBleHBsYW5hdGlvbiBhdCAxMzAxNSBhbmQgMTMwMTYKKy8vCisvLyBUeXBpbmcgY29ycmVjdGlvbnMgaW4gSURMOiAgTWV0aG9kIDI0MDA1IGNvbW1lbnQgY2hhbmdlZC4gQ2hhbmdlIHRoZSB3b3JkCisvLyAnY2FsaWJyYXRlZCcgaW50byAgICAgJ3JlY2FsY3VsYXRlZCcgaW4gbWV0aG9kIDQwMTQgc2V0VW5pdC4KKy8vCisvLyBTZXQgdGhlIG1ldGhvZHMgaGFzVmFsdWVGbGFnIGFuZCB3aXRoVmFsdWVGbGFnIG9mIHRoZSBpbnRlcmZhY2UKKy8vIEFwcGxpY2F0aW9uQXR0cmlidXRlIHRvIGRlcHJlY2F0ZWQuIENoYW5nZSBkZXNjcmlwdGlvbiBvZiBjcmVhdGVBdHRyaWJ1dGUKKy8vIG9mIGludGVyZmFjZSBBcHBsaWNhdGlvbkVsZW1lbnQgYW5kIEVycm9yQ29kZSBBT19NSVNTSU5HX1ZBTFVFLgorLy8KKy8vIEFkZCB0aGUgaW50ZXJmYWNlcyBPRFNEaXJlY3RvcnksIE9EU0ZpbGUgYW5kIE9EU0ZpbGVUcmFuc2ZlciBhbmQKKy8vIEVudW1lcmF0aW9uIEZpbGVPcGVuTW9kZSBmb3IgdGhlIG1hbmFnZWQgZmlsZXMuIEFkZCB0aGUgbWV0aG9kcworLy8gZ2V0T0RTRGlyZWN0b3J5IGluIHRoZSBpbnRlcmZhY2VzIEFwcGxFbGVtQWNjZXNzIGFuZCBJbnN0YW5jZUVsZW1lbnQuCisvLworLy8gQWRkIHRoZSBtZXRob2RzIGdldEVudW1lcmF0aW9uQXR0cmlidXRlcyBhbmQgZ2V0RW51bWVyYXRpb25TdHJ1Y3R1cmUgb2YgdGhlCisvLyBpbnRlcmZhY2UgQW9TZXNzaW9uIHdpdGggdGhlIHJlcXVpcmVkIHN0cnVjdHVyZXMgYW5kIHNlcXVlbmNlcy4KKy8vCisvLyBDb3JyZWN0IHR5cGluZyBlcnJvcidzLgorLy8KKy8vIEFkZCBBZ2dyRnVuYyBESVNUSU5DVCwgU2VsT3Bjb2RlIE5PVExJS0UgYW5kIENJX05PVExJS0UKKy8vCisvLyBSZW1vdmUgT0RTRGlyZWN0b3J5LCBjaGFuZ2UgdGhlIHdheSBPRFNGaWxlIGlzIGNyZWF0ZWQuIENoYW5nZQorLy8gRmlsZU9wZW5Nb2RlLgorLy8KKy8vIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZCBnZXRVbml0IG9mIHRoZSBpbnRlcmZhY2UgQ29sdW1uLiAKKy8vIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGludGVyZmFjZXMgT0RTRmlsZSBhbmQKKy8vIE9EU0ZpbGVUcmFuc2Zlci4gIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGVudW1lcmF0aW9ucworLy8gVmFsdWVNYXRyaXhfTW9kZSBhbmQgRmlsZU9wZW5Nb2RlLiAgQ2hhbmdlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlCisvLyBBcHBsUmVsLgorLy8KKy8vIFJlbW92ZSBJbnRlcmZhY2UgT0RTRmlsZSBhbmQgT0RTRmlsZVRyYW5zZmVyIGFuZCBFbnVtZXJhdGlvbiBGaWxlT3BuZU1vZGUKKy8vIHdpdGggdGhlIG1ldGhvZHMgd2hpY2ggY3JlYXRlcyB0aGUgT0RTRmlsZSBpbnRlcmZhY2UuCisvLworLy8gMjAwOS0wOS0yNQorLy8gQ29ycmVjdCBvZiBzb21lIGludGVyZmFjYWVzIGFuZCBtZXRob2RzIHRoZSBkZXNjcmlwdGlvbi4gICBGaW5hbGl6ZSBmb3IKKy8vIEFTQU0gT0RTIHZlcnNpb24gNS4yCisvLworLy8gQWRkIEZPUl9VU0VSIGF0IGF1dGggcGFyYW1ldGVyIG9mIG1ldGhvZCBuZXdTZXNzaW9uIG9mIGludGVyZmFjZSBBb0ZhY3RvcnkgCisvLyBEZXByZWNhdGVkLCBzb2x2ZWQgYnkgTlZIIEFwcGxpY2F0aW9uIG1vZGVsIGZvciBmb2xsb3dpbmcgbWV0aG9kczoKKy8vIGxpc3RTY2FsaW5nQ29sdW1ucywgZ2V0U2NhbGluZ0NvbHVtbnMsIGxpc3RDb2x1bW5zU2NhbGVkQnksCisvLyBnZXRDb2x1bW5zU2NhbGVkQnkgYW5kIGFkZENvbHVtblNjYWxlZEJ5IG9mIGludGVyZmFjZSBWYWx1ZU1hdHJpeCBhbmQgdGhlCisvLyBtZXRob2RzIGlzU2NhbGluZyBhbmQgc2V0U2NhbGluZyBvZiBpbnRlcmZhY2UgQ29sdW1uCisvLworLy8gQWRkIEFvU2Vzc2lvbi5nZXRJZCgpICBBZGQgQW9GYWN0b3J5Lm5ld1Nlc3Npb25OYW1lVmFsdWUoKSAgQWRkCisvLyBTZWxPcGNvZGUuQkVUV0VFTiAgQWRkIEFnZ3JGdW5jLk9SRCAgQWRkIGNvbW1lbnQgdG8KKy8vIEFwcGxFbGVtQWNjZXNzLmdldEluc3RhbmNlc0V4dCgpCisvLworLy8gQWRkIG1ldGhvZCBnZXRPRFNGaWxlIGF0IHRoZSBpbnRlcmZhY2VzIEFwcGxFbGVtQWNjZXNzIGFuZCBJbnN0YW5jZUVsZW1lbnQuCisvLyAgQWRkIHRoZSBJbnRlcmZhY2VzIE9EU0ZpbGUsIE9EU1JlYWRUcmFuc2ZlciBhbmQgT0RTV3JpdGVUcmFuc2Zlci4gIEFkZAorLy8gRXJyb3JDb2RlIEFPX0ZJTEVfTE9DS0VELiAgQWRkIEFvRmlsZSB0byB0aGUgZGVzY3JpcHRpb24gb2YKKy8vIEFPX0lOVkFMSURfQkFTRVRZUEUKKy8vCisvLyBJbmhlcml0IE9EU0ZpbGUgZnJvbSBJbnN0YW5jZUVsZW1lbnQuIFJlbmFtZSBtZXRob2QgZ2V0T2RzRmlsZSB0bworLy8gdXBjYXN0T2RzRmlsZSBhdCBpbnRlcmZhY2UgSW5zdGFuY2VFbGVtZW50LiBBZGQgbWV0aG9kcyB0YWtlVW5kZXJDb250cm9sCisvLyBhbmQgcmVtb3ZlZnJvbUNvbnRyb2wgdG8gdGhlIGludGVyZmFjZSBPRFNGaWxlLiBNZXRob2Qgc2tpcE9jdGV0cyByZXR1cm5zCisvLyB0aGUgcmVhbCBza2lwcGVkIG51bWJlciBvZiBvY3RldHMuICBSZW5hbWUgQWdnckZ1bmMuT1JEIHRvIEFnZ3JGdW5jLlBPSU5UCisvLworLy8gVXBkYXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBPRFNGaWxlIG1ldGhvZHMgYW5kIHNvbWUgZXJyb3IgY29kZXMuCisvLworLy8gQWRkIHRoZSBtZXRob2QgZ2V0UmVsYXRpb25zIGF0IHRoZSBpbnRlcmZhY2UgQmFzZVN0cnVjdHVyZS4gIE1pbm9yIGNoYW5nZXMKKy8vIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBzb21lIG1ldGhvZHMuICBBZGQgZGVzY3JpcHRpb24gZm9yIHRoZSBleGNlcHRpb25zCisvLyBBX0JBRF9QQVJBTUVURVIgYW5kIEFPX1NZU1RFTV9QUk9CTEVNIGF0IHRoZSBtZXRob2QgZ2V0T2N0ZXRTZXEgb2YgdGhlCisvLyBpbnRlcmZhY2UgT0RTUmVhZFRyYW5zZmVyLgorLy8KKy8vIDIwMTItMTEtMjAKKy8vIEZpbmFsIHJlbGVhc2UgT0RTIDUuMy4wCisvLworLy8KKyNpZm5kZWYgb2RzX2lkbAorI2RlZmluZSBvZHNfaWRsCisKK21vZHVsZSBvcmcgeworCisvKioKKyogQVNBTSBzZXJ2aWNlcy4KKyovCittb2R1bGUgYXNhbSB7CisKKy8qKgorKiBBU0FNIE9EUyBzZXJ2aWNlLgorKi8KK21vZHVsZSBvZHMgeworaW50ZXJmYWNlIEFvRmFjdG9yeTsKK2ludGVyZmFjZSBBb1Nlc3Npb247CitpbnRlcmZhY2UgQXBwbGljYXRpb25BdHRyaWJ1dGU7CitpbnRlcmZhY2UgQXBwbGljYXRpb25FbGVtZW50OworaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb247CitpbnRlcmZhY2UgQXBwbGljYXRpb25TdHJ1Y3R1cmU7CitpbnRlcmZhY2UgQmFzZUF0dHJpYnV0ZTsKK2ludGVyZmFjZSBCYXNlRWxlbWVudDsKK2ludGVyZmFjZSBCYXNlUmVsYXRpb247CitpbnRlcmZhY2UgQmFzZVN0cnVjdHVyZTsKK2ludGVyZmFjZSBCbG9iOworaW50ZXJmYWNlIENvbHVtbjsKK2ludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQ7CitpbnRlcmZhY2UgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3I7CitpbnRlcmZhY2UgTWVhc3VyZW1lbnQ7CitpbnRlcmZhY2UgTmFtZUl0ZXJhdG9yOworaW50ZXJmYWNlIE5hbWVWYWx1ZUl0ZXJhdG9yOworaW50ZXJmYWNlIE5hbWVWYWx1ZVVuaXRJdGVyYXRvcjsKK2ludGVyZmFjZSBTTWF0TGluazsKK2ludGVyZmFjZSBTdWJNYXRyaXg7CitpbnRlcmZhY2UgVmFsdWVNYXRyaXg7CitpbnRlcmZhY2UgTmFtZVZhbHVlVW5pdElkSXRlcmF0b3I7CitpbnRlcmZhY2UgQXBwbEVsZW1BY2Nlc3M7CitpbnRlcmZhY2UgUXVlcnlFdmFsdWF0b3I7CitpbnRlcmZhY2UgUXVlcnk7CitpbnRlcmZhY2UgTmFtZVZhbHVlVW5pdFNlcXVlbmNlSXRlcmF0b3I7CitpbnRlcmZhY2UgRW51bWVyYXRpb25EZWZpbml0aW9uOworaW50ZXJmYWNlIEVsZW1SZXN1bHRTZXRFeHRTZXFJdGVyYXRvcjsKK2ludGVyZmFjZSBPRFNGaWxlOworaW50ZXJmYWNlIE9EU1JlYWRUcmFuc2ZlcjsKK2ludGVyZmFjZSBPRFNXcml0ZVRyYW5zZmVyOworCisvKioKKyogVGhlIEFTQU0gT0RTIGVycm9yIHNldmVyaXR5IGZsYWdzLgorKi8KK2VudW0gU2V2ZXJpdHlGbGFnIHsKKyAgIFNVQ0NFU1MsICAgICAvLyBPay4KKyAgIElORk9STUFUSU9OLCAvLyBJbmZvcm1hdGlvbi4KKyAgIFdBUk5JTkcsICAgICAvLyBXYXJuaW5nLgorICAgRVJST1IgICAgICAgIC8vIEVycm9yLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyByZWxhdGlvbiB0eXBlcy4KKyovCitlbnVtIFJlbGF0aW9uVHlwZSB7CisgICBGQVRIRVJfQ0hJTEQsIC8vIEZhdGhlci1jaGlsZCByZWxhdGlvbi4KKyAgIElORk8sICAgICAgICAgLy8gSW5mbyByZWxhdGlvbi4KKyAgIElOSEVSSVRBTkNFICAgLy8gSW5oZXJpdGFuY2UgcmVsYXRpb24uCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIHJlbGF0aW9uc2hpcHMuCisqLworZW51bSBSZWxhdGlvbnNoaXAgeworICAgRkFUSEVSLCAgICAvLyBGYXRoZXIuCisgICBDSElMRCwgICAgIC8vIENoaWxkLgorICAgSU5GT19UTywgICAvLyBEaXJlY3RlZCBpbmZvcm1hdGlvbmFsIHJlbGF0aW9uc2hpcC4KKyAgIElORk9fRlJPTSwgLy8gRGlyZWN0ZWQgaW5mb3JtYXRpb25hbCByZWxhdGlvbnNoaXAuCisgICBJTkZPX1JFTCwgIC8vIEluZm9ybWF0aW9uYWwgcmVsYXRpb25zaGlwIChubyBkaXJlY3Rpb24pCisgICBTVVBFUlRZUEUsIC8vIEluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcDogc3VwZXJ0eXBlLgorICAgU1VCVFlQRSwgICAvLyBJbmhlcml0YW5jZSByZWxhdGlvbnNoaXA6IHN1YnR5cGUuCisgICBBTExfUkVMICAgIC8vIEFueSBvZiB0aGUgcmVsYXRpb25zaGlwcyBhYm92ZS4KK307CisKKy8qKgorKiBUaGUgQVNBTSBPRFMgZGF0YSB0eXBlcy4KKyogICAgRFRfeHh4ICBCYXNpYyBkYXRhIHR5cGVzLgorKiAgICBEU194eHggIFNlcXVlbmNlIG9mIGJhc2ljIGRhdGEgdHlwZS4KKyogICAgfHwKKyogICAgfCstIFQgPT0gVHlwZSwgUyA9PSBTZXF1ZW5jZXMuCisqICAgICstLSBEID09IERhdGF0eXBlLgorKi8KK2VudW0gRGF0YVR5cGUgeworICAgRFRfVU5LTk9XTiwgICAgICAgICAgIC8vIFVua25vd24gZGF0YXR5cGUuCisgICBEVF9TVFJJTkcsICAgICAgICAgICAgLy8gU3RyaW5nLgorICAgRFRfU0hPUlQsICAgICAgICAgICAgIC8vIFNob3J0IHZhbHVlICgxNiBiaXQpLgorICAgRFRfRkxPQVQsICAgICAgICAgICAgIC8vIEZsb2F0IHZhbHVlICgzMiBiaXQpLgorICAgRFRfQk9PTEVBTiwgICAgICAgICAgIC8vIEJvb2xlYW4gdmFsdWUuCisgICBEVF9CWVRFLCAgICAgICAgICAgICAgLy8gQnl0ZSB2YWx1ZSAoOCBiaXQpLgorICAgRFRfTE9ORywgICAgICAgICAgICAgIC8vIExvbmcgdmFsdWUgKDMyIGJpdCkuCisgICBEVF9ET1VCTEUsICAgICAgICAgICAgLy8gRG91YmxlIHByZWNpc2lvbiBmbG9hdCB2YWx1ZSAoNjQgYml0KS4KKyAgIERUX0xPTkdMT05HLCAgICAgICAgICAvLyBMb25nTG9uZyB2YWx1ZSAoNjQgYml0KS4KKyAgIERUX0lELCAgICAgICAgICAgICAgICAvLyBMb25nTG9uZyB2YWx1ZSAoNjQgYml0KS4gTm90IHVzZWQuIERUX0xPTkdMT05HIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBpbnN0ZWFkLgorICAgRFRfREFURSwgICAgICAgICAgICAgIC8vIERhdGUuIE1lYW5pbmc6IFlZWVlNTUREaGhtbXNzbGxsY2Njbm5uLi4uLiAgIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZWVlZID0geWVhciwgcmVxdWlyZWQuICAgLSBNTSA9IG1vbnRoLCBvcHRpb25hbC4gIAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gREQgPSAgZGF5LCBvcHRpb25hbC4gICAtIGhoID0gIGhvdXIsIG9wdGlvbmFsLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBtbSA9ICBtaW51dGUsIG9wdGlvbmFsLiAgIC0gc3MgPSAgc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsLiAgIC0gbGxsID0gIG1pbGxpc2VjLCBvcHRpb25hbCwgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IE9yYWNsZSB0aW1lc3RhbXAuICAgLSBjY2MgPSAgbWljcm9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCwgbm90IHN1cHBvcnRlZCBieSBPcmFjbGUgdGltZXN0YW1wLiAgIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubm4gPSAgbmFub3NlYywgb3B0aW9uYWwsIG5vdCBzdXBwb3J0ZWQgYnkgT3JhY2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZXN0YW1wLgorICAgRFRfQllURVNUUiwgICAgICAgICAgIC8vIEJ5dGVzdHJlYW0uCisgICBEVF9CTE9CLCAgICAgICAgICAgICAgLy8gQmxvYi4KKyAgIERUX0NPTVBMRVgsICAgICAgICAgICAvLyBDb21wbGV4IHZhbHVlICgzMiBiaXQgZWFjaCBwYXJ0KS4KKyAgIERUX0RDT01QTEVYLCAgICAgICAgICAvLyBDb21wbGV4IHZhbHVlICg2NCBiaXQgZWFjaCBwYXJ0KS4KKyAgIERTX1NUUklORywgICAgICAgICAgICAvLyBTdHJpbmcgc2VxdWVuY2UuCisgICBEU19TSE9SVCwgICAgICAgICAgICAgLy8gU2hvcnQgc2VxdWVuY2UuCisgICBEU19GTE9BVCwgICAgICAgICAgICAgLy8gRmxvYXQgc2VxdWVuY2UuCisgICBEU19CT09MRUFOLCAgICAgICAgICAgLy8gQm9vbGVhbiBzZXF1ZW5lLgorICAgRFNfQllURSwgICAgICAgICAgICAgIC8vIEJ5dGUgc2VxdWVuY2UuCisgICBEU19MT05HLCAgICAgICAgICAgICAgLy8gTG9uZyBzZXF1ZW5jZS4KKyAgIERTX0RPVUJMRSwgICAgICAgICAgICAvLyBEb3VibGUgc2VxdWVuY2UuCisgICBEU19MT05HTE9ORywgICAgICAgICAgLy8gTG9uZ2xvbmcgc2VxdWVuY2UuCisgICBEU19DT01QTEVYLCAgICAgICAgICAgLy8gQ29tcGxleCBzZXF1ZW5jZS4KKyAgIERTX0RDT01QTEVYLCAgICAgICAgICAvLyBEb3VibGUgY29tcGxleCBzZXF1ZW5jZS4KKyAgIERTX0lELCAgICAgICAgICAgICAgICAvLyBMb25nTG9uZyBzZXF1ZW5jZS4gTm90IHVzZWQuIERTX0xPTkdMT05HIGlzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkLgorICAgRFNfREFURSwgICAgICAgICAgICAgIC8vIERhdGUgc2VxdWVuY2UuCisgICBEU19CWVRFU1RSLCAgICAgICAgICAgLy8gQnl0ZXN0cmVhbSBzZXF1ZW5jZS4KKyAgIERUX0VYVEVSTkFMUkVGRVJFTkNFLCAvLyBFeHRlcm5hbCByZWZlcmVuY2UuCisgICBEU19FWFRFUk5BTFJFRkVSRU5DRSwgLy8gU2VxdWVuY2Ugb2YgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgRFRfRU5VTSwgICAgICAgICAgICAgIC8vIFRoZSBlbnVtZXJhdGlvbiBkYXRhdHlwZS4KKyAgIERTX0VOVU0gICAgICAgICAgICAgICAvLyBUaGUgZW51bWVyYXRpb24gc2VxdWVuY2UgZGF0YXR5cGUuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIGJ1aWxkLXVwIGZ1bmN0aW9uIGNvZGVzIGZvciBtZWFzdXJlbWVudCB2aWV3cy4KKyovCitlbnVtIEJ1aWxkVXBGdW5jdGlvbiB7CisgICBCVVBfSk9JTiwgIC8vIEpvaW4gdGhlIGNvbHVtbnMKKyAgIEJVUF9NRVJHRSwgLy8gTWVyZ2UgdGhlIGNvbHVtbnMKKyAgIEJVUF9TT1JUICAgLy8gU29ydCB0aGUgY29sdW1ucworfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBhdHRyaWJ1dGUgdHlwZSBjb2Rlcy4KKyovCitlbnVtIEF0dHJUeXBlIHsKKyAgIEFQUExBVFRSX09OTFksIC8vIFJlcG9ydCBvbmx5IGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMuCisgICBJTlNUQVRUUl9PTkxZLCAvLyBSZXBvcnQgb25seSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgorICAgQUxMICAgICAgICAgICAgLy8gQWxsIGF0dHJpYnV0ZXMuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIHR5cGVzIGZvciBzZXR0aW5nIHZhbHVlcy4KKyovCitlbnVtIFNldFR5cGUgeworICAgQVBQRU5ELCAvLyBBcHBlbmQgZGF0YSB0byB0aGUgdmFsdWUgbWF0cml4LgorICAgSU5TRVJULCAvLyBJbnNlcnQgZGF0YSBpbnRvIHRoZSB2YWx1ZSBtYXRyaXguCisgICBVUERBVEUsIC8vIE1vZGlmeSBleGlzdGluZyBkYXRhIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICBSRU1PVkUgIC8vIFJlbW92ZSB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIGVycm9yIGNvZGVzLgorKi8KK2VudW0gRXJyb3JDb2RlIHsKKyAgIEFPX1VOS05PV05fRVJST1IsCisgICBBT19BQ0NFU1NfREVOSUVELAorICAgQU9fQkFEX09QRVJBVElPTiwKKyAgIEFPX0JBRF9QQVJBTUVURVIsCisgICBBT19DT05ORUNUX0ZBSUxFRCwKKyAgIEFPX0NPTk5FQ1RfUkVGVVNFRCwKKyAgIEFPX0NPTk5FQ1RJT05fTE9TVCwKKyAgIEFPX0RVUExJQ0FURV9CQVNFX0FUVFJJQlVURSwKKyAgIEFPX0RVUExJQ0FURV9OQU1FLAorICAgQU9fRFVQTElDQVRFX1ZBTFVFLAorICAgQU9fSEFTX0lOU1RBTkNFUywKKyAgIEFPX0hBU19SRUZFUkVOQ0VTLAorICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTSwKKyAgIEFPX0lOQ09NUEFUSUJMRV9VTklUUywKKyAgIEFPX0lOVkFMSURfQVNBTV9QQVRILAorICAgQU9fSU5WQUxJRF9BVFRSSUJVVEVfVFlQRSwKKyAgIEFPX0lOVkFMSURfQkFTRV9FTEVNRU5ULAorICAgQU9fSU5WQUxJRF9CQVNFVFlQRSwKKyAgIEFPX0lOVkFMSURfQlVJTERVUF9GVU5DVElPTiwKKyAgIEFPX0lOVkFMSURfQ09MVU1OLAorICAgQU9fSU5WQUxJRF9DT1VOVCwKKyAgIEFPX0lOVkFMSURfREFUQVRZUEUsCisgICBBT19JTlZBTElEX0VMRU1FTlQsCisgICBBT19JTlZBTElEX0xFTkdUSCwKKyAgIEFPX0lOVkFMSURfT1JESU5BTE5VTUJFUiwKKyAgIEFPX0lOVkFMSURfUkVMQVRJT04sCisgICBBT19JTlZBTElEX1JFTEFUSU9OX1JBTkdFLAorICAgQU9fSU5WQUxJRF9SRUxBVElPTl9UWVBFLAorICAgQU9fSU5WQUxJRF9SRUxBVElPTlNISVAsCisgICBBT19JTlZBTElEX1NFVF9UWVBFLAorICAgQU9fSU5WQUxJRF9TTUFUTElOSywKKyAgIEFPX0lOVkFMSURfU1VCTUFUUklYLAorICAgQU9fSVNfQkFTRV9BVFRSSUJVVEUsCisgICBBT19JU19CQVNFX1JFTEFUSU9OLAorICAgQU9fSVNfTUVBU1VSRU1FTlRfTUFUUklYLAorICAgQU9fTUFUSF9FUlJPUiwKKyAgIEFPX01JU1NJTkdfQVBQTElDQVRJT05fRUxFTUVOVCwKKyAgIEFPX01JU1NJTkdfQVRUUklCVVRFLAorICAgQU9fTUlTU0lOR19SRUxBVElPTiwKKyAgIEFPX01JU1NJTkdfVkFMVUUsCisgICBBT19OT19NRU1PUlksCisgICBBT19OT19QQVRIX1RPX0VMRU1FTlQsCisgICBBT19OT1RfRk9VTkQsCisgICBBT19OT1RfSU1QTEVNRU5URUQsCisgICBBT19OT1RfVU5JUVVFLAorICAgQU9fT1BFTl9NT0RFX05PVF9TVVBQT1JURUQsCisgICBBT19TRVNTSU9OX0xJTUlUX1JFQUNIRUQsCisgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUsCisgICBBT19UUkFOU0FDVElPTl9BTFJFQURZX0FDVElWRSwKKyAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUsCisgICBBT19IQVNfQkFTRV9SRUxBVElPTiwKKyAgIEFPX0hBU19CQVNFX0FUVFJJQlVURSwKKyAgIEFPX1VOS05PV05fVU5JVCwKKyAgIEFPX05PX1NDQUxJTkdfQ09MVU1OLAorICAgQU9fUVVFUllfVFlQRV9JTlZBTElELAorICAgQU9fUVVFUllfSU5WQUxJRCwKKyAgIEFPX1FVRVJZX1BST0NFU1NJTkdfRVJST1IsCisgICBBT19RVUVSWV9USU1FT1VUX0VYQ0VFREVELAorICAgQU9fUVVFUllfSU5DT01QTEVURSwKKyAgIEFPX1FVRVJZX0lOVkFMSURfUkVTVUxUVFlQRSwKKyAgIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFLAorICAgQU9fRklMRV9MT0NLRUQsCisgICBBT19TWVNURU1fUFJPQkxFTQorfTsKKworLyoqCisqIFRoZSBzZWxlY3Rpb24gb3BlcmF0b3JzLiAgU2VsT3Bjb2RlIGdpdmVzIHF1ZXJ5IGluc3RydWN0aW9ucyBsaWtlCisqICJlcXVhbCIsICJncmVhdGVyIiBldGMuIFNvIGZhciwgdGhlc2UgYXJndW1lbnRzIHdlcmUgY2FzZSBzZW5zaXRpdmUuCisqIFRoZXJlIHdhcyBhIGRlbWFuZCB0byBhZGQgdGhlc2UgYXJndW1lbnRzIGFsc28gZm9yIGNhc2UgaW5zZW5zaXRpdmUKKyogY29tcGFyaXNvbiBvcGVyYXRpb25zLiBUaGVyZWZvcmUsIHRoZSBTZWxPcGNvZGVzIGZvciBjYXNlIGluc2Vuc2l0aXZpdHkKKyogd2VyZSBhZGRlZC4gVGhlc2UgYXJndW1lbnRzIGhhdmUgdGhlIHByZWZpeCCTQ0lflC4KKyovCitlbnVtIFNlbE9wY29kZSB7CisgICBFUSwgICAgICAgICAgLy8gRXF1YWwKKyAgIE5FUSwgICAgICAgICAvLyBOb3QgZXF1YWwKKyAgIExULCAgICAgICAgICAvLyBMZXNzIHRoZW4KKyAgIEdULCAgICAgICAgICAvLyBHcmVhdGVyIHRoZW4KKyAgIExURSwgICAgICAgICAvLyBMZXNzIHRoZW4gZXF1YWwKKyAgIEdURSwgICAgICAgICAvLyBHcmVhdGVyIHRoZW4gZXF1YWwKKyAgIElOU0VULCAgICAgICAvLyBJbiBzZXQsIHZhbHVlIGNhbiBiZSBhIHNlcXVlbmNlLgorICAgTk9USU5TRVQsICAgIC8vIE5vdCBpbiBzZXQsIHZhbHVlIGNhbiBiZSBhIHNlcXVlbmNlLgorICAgTElLRSwgICAgICAgIC8vIGxpa2UsIHVzZSAgcGF0dGVybiBtYXRjaGluZywgc2VlIFBhdHRlcm4gZm9yIHRoZSB3aWxkY2FyZAorICAgICAgICAgICAgICAgIC8vIGRlZmluaXRpb25zLgorICAgQ0lfRVEsICAgICAgIC8vIEVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9ORVEsICAgICAgLy8gTm90IGVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9MVCwgICAgICAgLy8gTGVzcyB0aGVuLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9HVCwgICAgICAgLy8gR3JlYXRlciB0aGVuLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9MVEUsICAgICAgLy8gTGVzcyB0aGVuIGVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9HVEUsICAgICAgLy8gR3JlYXRlciB0aGVuIGVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9JTlNFVCwgICAgLy8gSW4gc2V0LCB2YWx1ZSBjYW4gYmUgYSBzZXF1ZW5jZS4gY2FzZSBpbnNlbnNpdGl2ZSBmb3IKKyAgICAgICAgICAgICAgICAvLyBEVF9TVFJJTkcuCisgICBDSV9OT1RJTlNFVCwgLy8gTm90IGluIHNldCwgdmFsdWUgY2FuIGJlIGEgc2VxdWVuY2UuIGNhc2UgaW5zZW5zaXRpdmUgZm9yCisgICAgICAgICAgICAgICAgLy8gRFRfU1RSSU5HLgorICAgQ0lfTElLRSwgICAgIC8vIGxpa2UsIHVzZSAgcGF0dGVybiBtYXRjaGluZywgc2VlIFBhdHRlcm4gZm9yIHRoZSB3aWxkY2FyZAorICAgICAgICAgICAgICAgIC8vIGRlZmluaXRpb25zLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBJU19OVUxMLCAgICAgLy8gVmFsdWUgaXMgTlVMTAorICAgSVNfTk9UX05VTEwsIC8vIFZhbHVlIGlzIG5vdCBOVUxMCisgICBOT1RMSUtFLCAgICAgLy8gTm90IExJS0UKKyAgIENJX05PVExJS0UsICAvLyBOb3QgTElLRSwgY2FzZSBpbnNlbnNpdGl2ZSBmb3IgRFRfU1RSSU5HLgorICAgQkVUV0VFTiAgICAgIC8vIEJldHdlZW47IHNlbGVjdHMgYWxsIGluc3RhbmNlcyB3aGVyZSB0aGUgdmFsdWUgb2YgJ2F0dHInCisgICAgICAgICAgICAgICAgLy8gbGllcyBiZXR3ZWVuIHRoZSBmaXJzdCB0d28gdmFsdWVzIGdpdmVuIGluICd2YWx1ZScgKHdpdGgKKyAgICAgICAgICAgICAgICAvLyAnYXR0cicsICd2YWx1ZScgYmVpbmcgZWxlbWVudHMgb2YgdGhlIFNlbFZhbHVlIHN0cnVjdHVyZTsKKyAgICAgICAgICAgICAgICAvLyAndmFsdWUnIG11c3QgYmUgb2YgZGF0YSB0eXBlIFNfKikuCit9OworCisvKioKKyogT3BlcmF0b3IsIGJyYWNrZXQgb3BlbiBhbmQgY2xvc2UuCisqLworZW51bSBTZWxPcGVyYXRvciB7CisgICBBTkQsICAgLy8gQU5EIHRoZSB0d28gY29uZGl0aW9ucy4KKyAgIE9SLCAgICAvLyBPUiB0aGUgdHdvIGNvbmRpdGlvbnMuCisgICBOT1QsICAgLy8gTmVnYXRlIHRoZSBuZXh0IGNvbmRpdGlvbi4KKyAgIE9QRU4sICAvLyBPcGVuIGJyYWNrZXRzLgorICAgQ0xPU0UgIC8vIENsb3NlIGJyYWNrZXRzCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIHR5cGVzIGZvciBzZXR0aW5nIGFjY2VzcyByaWdodHMuCisqLworZW51bSBSaWdodHNTZXQgeworICAgU0VUX1JJR0hULCAgICAvLyBTZXQgdGhlIGdpdmVuIHJpZ2h0cywgb3ZlcndyaXRlIHRoZSBleGlzdGluZyByaWdodHMuCisgICBBRERfUklHSFQsICAgIC8vIEFkZCB0aGUgZ2l2ZW4gcmlnaHRzIHRvIHRoZSBleGlzdGluZyByaWdodHMuCisgICBSRU1PVkVfUklHSFQgIC8vIFJlbW92ZSB0aGUgZ2l2ZW4gcmlnaHRzIGZvcm0gdGhlIGV4aXN0aW5nIHJpZ2h0cy4KK307CisKKy8qKgorKiBTdGF0dXMgb2YgdGhlIHF1ZXJ5IGV4ZWN1dGlvbi4KKyovCitlbnVtIFF1ZXJ5U3RhdHVzIHsKKyAgIENPTVBMRVRFLCAgIC8vIFRoZSBleGVjdXRpb24gaXMgcmVhZHkuCisgICBJTkNPTVBMRVRFICAvLyBUaGUgZXhlY3V0aW9uIGlzIHN0aWxsIHJ1bm5pbmcuCit9OworCisvKioKKyogVGhlIHN1cHBvcnRlZCBhZ2dyZWdhdGUgZnVuY3Rpb25zIG9mIHRoZSBHZXRJbnN0YW5jZXNFeHQuCisqLworZW51bSBBZ2dyRnVuYyB7CisgICBOT05FLCAgICAgLy8gTm8gYWdncmVnYXRlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGF0dHJpYnV0ZS4KKyAgIENPVU5ULCAgICAvLyBDb3VudAorICAgRENPVU5ULCAgIC8vIERpc3RpbmN0IGNvdW50CisgICBNSU4sICAgICAgLy8gTWluOyBvbmx5IGZvciBudW1lcmljYWwgdmFsdWVzCisgICBNQVgsICAgICAgLy8gTWF4OyBvbmx5IGZvciBudW1lcmljYWwgdmFsdWVzCisgICBBVkcsICAgICAgLy8gQXZlcmFnZTsgb25seSBmb3IgbnVtZXJpY2FsIHZhbHVlcworICAgU1REREVWLCAgIC8vIFN0YW5kYXJkIGRldmlhdGlvbjsgb25seSBmb3IgbnVtZXJpY2FsIHZhbHVlcworICAgU1VNLCAgICAgIC8vIFN1bTsgb25seSBmb3IgbnVtZXJpY2FsIHZhbHVlcworICAgRElTVElOQ1QsIC8vIERpc3RpbmN0CisgICBQT0lOVCAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSB2YWx1ZXMsIG9ubHkgdXNlZCBieSB0aGUgYXR0cmlidXRlIHZhbHVlcyBvZgorICAgICAgICAgICAgIC8vIGVsZW1lbnQgQW9Mb2NhbENvbHVtbgorfTsKKworLyoqCisqIFRoZSBzZWxlY3Rpb24gdHlwZS4KKyovCitlbnVtIFNlbFR5cGUgeworICAgU0VMX1ZBTFVFX1RZUEUsICAgIC8vIFNlbGVjdGlvbiB2YWx1ZS4KKyAgIFNFTF9PUEVSQVRPUl9UWVBFICAvLyBTZWxlY3Rpb24gbG9naWNhbCBvcGVyYXRvci4KK307CisKKy8qKgorKiBUaGUgdHlwZSBvZiB0aGUgam9pbi4KKyovCitlbnVtIEpvaW5UeXBlIHsKKyAgIEpUREVGQVVMVCwgLy8gRm9yY2UgaW5uZXIgam9pbi4KKyAgIEpUT1VURVIgICAgLy8gRm9yY2Ugb3V0ZXIgam9pbiBvbiBkZXN0aW5hdGlvbiBBSUQuCit9OworCisvKioKKyogVGhlIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyovCitlbnVtIFZhbHVlTWF0cml4TW9kZSB7CisgICBDQUxDVUxBVEVELCAvLyBUaGUgdmFsdWUgbWF0cml4IHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgdmFsdWVzLiAgIFRoZSB2YWx1ZXMKKyAgICAgICAgICAgICAgIC8vIG9mIGV4cGxpY2l0IGNvbHVtbnMgYXJlIHJldHVybmVkIGFzIHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgIC8vIHBoeXNpY2FsIHN0b3JhZ2UuICAgVGhlIHZhbHVlcyBvZiBpbXBsaWNpdCBjb2x1bW5zIGFyZQorICAgICAgICAgICAgICAgLy8gZXhwYW5kZWQgYW5kIHJldHVybmVkIGV4cGxpY2l0bHkuICBUaGUgdmFsdWVzIG9mIHJhdyBjb2x1bW5zCisgICAgICAgICAgICAgICAvLyBhcmUgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYWxnb3JpdGhtCisgICAgICAgICAgICAgICAvLyAodXNpbmcgdGhlIGNhbGN1bGF0aW9uIGFsZ29yaXRobXMgZ2l2ZW4gYnkgdGhlIHZhbHVlcyBvZiB0aGUKKyAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIHRoZSBiYXNlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgIC8vICdzZXF1ZW5jZV9yZXByZXNlbnRhdGlvbicgYW5kICdnZW5lcmF0aW9uX3BhcmFtZXRlcnMnKSBhbmQKKyAgICAgICAgICAgICAgIC8vIHRoZSByZXN1bHRpbmcgcGh5c2ljYWwgdmFsdWVzIGFyZSByZXR1cm5lZC4gIFdyaXRpbmcgdG8gdGhlCisgICAgICAgICAgICAgICAvLyB2YWx1ZSBtYXRyaXggaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBtb2RlLgorICAgU1RPUkFHRSAgICAgLy8gVGhlIHZhbHVlIG1hdHJpeCByZXR1cm5zIHRoZSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIHBoeXNpY2FsCisgICAgICAgICAgICAgICAvLyBzdG9yYWdlLiAgVGhlIHZhbHVlcyBvZiBleHBsaWNpdCBjb2x1bW5zIGFyZSByZXR1cm5lZCBhcworICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgc3RvcmVkIGluIHRoZSBwaHlzaWNhbCBzdG9yYWdlLiAgVGhlIHZhbHVlcyBvZgorICAgICAgICAgICAgICAgLy8gaW1wbGljaXQgY29sdW1ucyBhcmUgZXhwYW5kZWQgYW5kIHJldHVybmVkIGV4cGxpY2l0bHkuICBUaGUKKyAgICAgICAgICAgICAgIC8vIHZhbHVlcyBvZiByYXcgY29sdW1ucyBhcmUgcmV0dXJuZWQgYXMgdGhleSBhcmUgc3RvcmVkCisgICAgICAgICAgICAgICAvLyAod2l0aG91dCB1c2luZyB0aGUgY2FsY3VsYXRpb24gYWxnb3JpdGhtcyBnaXZlbiBieSB0aGUKKyAgICAgICAgICAgICAgIC8vIHZhbHVlcyBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlcyBkZXJpdmVkIGZyb20gdGhlIGJhc2UKKyAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMgJ3NlcXVlbmNlX3JlcHJlc2VudGF0aW9uJyBhbmQKKyAgICAgICAgICAgICAgIC8vICdnZW5lcmF0aW9uX3BhcmFtZXRlcnMnKS4gIFdyaXRpbmcgdG8gdmFsdWUgbWF0cml4IGlzCisgICAgICAgICAgICAgICAvLyBhbGxvd2VkIGluIHRoaXMgbW9kZS4KK307CisKKy8vIERhdGF0eXBlIGRlZmluaXRpb25zIChUX3h4eCkuCit0eXBlZGVmIHN0cmluZyAgICAgVF9TVFJJTkc7Cit0eXBlZGVmIGJvb2xlYW4gICAgVF9CT09MRUFOOwordHlwZWRlZiBzaG9ydCAgICAgIFRfU0hPUlQ7Cit0eXBlZGVmIGZsb2F0ICAgICAgVF9GTE9BVDsKK3R5cGVkZWYgb2N0ZXQgICAgICBUX0JZVEU7Cit0eXBlZGVmIGxvbmcgICAgICAgVF9MT05HOwordHlwZWRlZiBkb3VibGUgICAgIFRfRE9VQkxFOwordHlwZWRlZiBUX1NUUklORyAgIE5hbWU7Cit0eXBlZGVmIFRfU1RSSU5HICAgUGF0dGVybjsKK3R5cGVkZWYgVF9TVFJJTkcgICBCYXNlVHlwZTsKK3R5cGVkZWYgVF9TVFJJTkcgICBUX0RBVEU7Cit0eXBlZGVmIEJsb2IgICAgICAgVF9CTE9COworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxUX0JZVEU+IFRfQllURVNUUjsKK3R5cGVkZWYgc2VxdWVuY2U8VF9CT09MRUFOPiBTX0JPT0xFQU47Cit0eXBlZGVmIHNlcXVlbmNlPFRfQllURT4gU19CWVRFOwordHlwZWRlZiBzZXF1ZW5jZTxUX0RPVUJMRT4gU19ET1VCTEU7Cit0eXBlZGVmIHNlcXVlbmNlPFRfRkxPQVQ+IFNfRkxPQVQ7Cit0eXBlZGVmIHNlcXVlbmNlPFRfTE9ORz4gU19MT05HOwordHlwZWRlZiBzZXF1ZW5jZTxUX1NIT1JUPiBTX1NIT1JUOwordHlwZWRlZiBzZXF1ZW5jZTxUX1NUUklORz4gU19TVFJJTkc7Cit0eXBlZGVmIHNlcXVlbmNlPEJhc2VUeXBlPiBCYXNlVHlwZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxOYW1lPiBOYW1lU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPENvbHVtbj4gQ29sdW1uU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPFNNYXRMaW5rPiBTTWF0TGlua1NlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTdWJNYXRyaXg+IFN1Yk1hdHJpeFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxUX0RBVEU+IFNfREFURTsKK3R5cGVkZWYgc2VxdWVuY2U8VF9CWVRFU1RSPiBTX0JZVEVTVFI7Cit0eXBlZGVmIHNlcXVlbmNlPFNfU1RSSU5HPiBTU19TVFJJTkc7Cit0eXBlZGVmIHNlcXVlbmNlPFNfU0hPUlQ+IFNTX1NIT1JUOwordHlwZWRlZiBzZXF1ZW5jZTxTX0ZMT0FUPiBTU19GTE9BVDsKK3R5cGVkZWYgc2VxdWVuY2U8U19CT09MRUFOPiBTU19CT09MRUFOOwordHlwZWRlZiBzZXF1ZW5jZTxTX0JZVEU+IFNTX0JZVEU7Cit0eXBlZGVmIHNlcXVlbmNlPFNfTE9ORz4gU1NfTE9ORzsKK3R5cGVkZWYgc2VxdWVuY2U8U19ET1VCTEU+IFNTX0RPVUJMRTsKK3R5cGVkZWYgc2VxdWVuY2U8U19EQVRFPiBTU19EQVRFOwordHlwZWRlZiBzZXF1ZW5jZTxTX0JZVEVTVFI+IFNTX0JZVEVTVFI7Cit0eXBlZGVmIHNlcXVlbmNlPFRfQkxPQj4gU19CTE9COwordHlwZWRlZiBzZXF1ZW5jZTxBcHBsaWNhdGlvbkVsZW1lbnQ+IEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxBcHBsaWNhdGlvblJlbGF0aW9uPiBBcHBsaWNhdGlvblJlbGF0aW9uU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEFwcGxpY2F0aW9uQXR0cmlidXRlPiBBcHBsaWNhdGlvbkF0dHJpYnV0ZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxCYXNlUmVsYXRpb24+IEJhc2VSZWxhdGlvblNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxCYXNlQXR0cmlidXRlPiBCYXNlQXR0cmlidXRlU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEJhc2VFbGVtZW50PiBCYXNlRWxlbWVudFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxJbnN0YW5jZUVsZW1lbnQ+IEluc3RhbmNlRWxlbWVudFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTZWxPcGVyYXRvcj4gU2VsT3BlcmF0b3JTZXF1ZW5jZTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyByZWxhdGlvbiByYW5nZSBzdHJ1Y3R1cmUuCisqLworc3RydWN0IFJlbGF0aW9uUmFuZ2UgeworICAgVF9TSE9SVCBtaW47IC8vIFRoZSBtaW5pbXVtIG51bWJlciBpbiB0aGUgcmFuZ2UuCisgICBUX1NIT1JUIG1heDsgLy8gVGhlIG1heGltdW0gbnVtYmVyIGluIHRoZSByYW5nZS4gLTEgbWVhbnMgTUFOWSB3aXRob3V0IGEKKyAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQgbWF4aW11bSBudW1iZXIuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIDY0IGJpdCBpbnRlZ2VyIHN0cnVjdHVyZS4gIFRoaXMgdHlwZSBpcyByZXByZXNlbnRlZCBpbiB0aGUKKyogZGF0YXR5cGUgZW51bWVyYXRpb24gYnkgRFRfTE9OR0xPTkcuCisqLworc3RydWN0IFRfTE9OR0xPTkcgeworICAgVF9MT05HIGhpZ2g7IC8vIFRoZSBtb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgdGhlIDY0IGJpdCB2YWx1ZS4KKyAgIFRfTE9ORyBsb3c7ICAvLyBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiB0aGUgNjQgYml0IHZhbHVlLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBjb21wbGV4IGRhdGEgc3RydWN0dXJlLiAgVGhpcyB0eXBlIGlzIHJlcHJlc2VudGVkIGluIHRoZQorKiBkYXRhdHlwZSBlbnVtZXJhdGlvbiBieSBEVF9DT01QTEVYLgorKi8KK3N0cnVjdCBUX0NPTVBMRVggeworICAgVF9GTE9BVCByOyAvLyBUaGUgcmVhbCBwYXJ0IG9mIHRoZSBjb21wbGV4IG51bWJlci4KKyAgIFRfRkxPQVQgaTsgLy8gVGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBjb21wbGV4IG51bWJlci4KK307CisKKy8qKgorKiBUaGUgQVNBTSBPRFMgZG91YmxlLXByZWNpc2lvbiBjb21wbGV4IGRhdGEgc3RydWN0dXJlLiBUaGlzIHR5cGUgaXMKKyogcmVwcmVzZW50ZWQgaW4gdGhlIGRhdGF0eXBlIGVudW1lcmF0aW9uIGJ5IERUX0RDT01QTEVYLgorKi8KK3N0cnVjdCBUX0RDT01QTEVYIHsKKyAgIFRfRE9VQkxFIHI7IC8vIFRoZSByZWFsIHBhcnQgb2YgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29tcGxleCBudW1iZXIuCisgICBUX0RPVUJMRSBpOyAvLyBUaGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29tcGxleCBudW1iZXIuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIG5hbWUtdW5pdCB0dXBsZSBzdHJ1Y3R1cmUuCisqLworc3RydWN0IE5hbWVVbml0IHsKKyAgIE5hbWUgICAgIHZhbE5hbWU7IC8vIEF0dHJpYnV0ZSBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUX1NUUklORyB1bml0OyAgICAvLyBDb2x1bW4gdW5pdCBhcyBzdHJpbmcuCit9OworCisvKioKKyogVGhlIGRlc2NyaXB0aW9uIG9mIGFuIHJlZmVyZW5jZSBvYmplY3QsIHRoZSByZWZlcmVuY2Ugb2JqZWN0IGNhbiBiZSBhbgorKiBpbnRlcm5hbCBBU0FNIE9EUyBvYmplY3Qgb3IgYW4gZXh0ZXJuYWwgb2JqZWN0LiBUaGlzIHR5cGUgaXMKKyogcmVwcmVzZW50ZWQgaW4gdGhlIGRhdGF0eXBlIGVudW1lcmF0aW9uIGJ5IERUX0VYVEVSTkFMUkVGRVJFTkNFLgorKi8KK3N0cnVjdCBUX0V4dGVybmFsUmVmZXJlbmNlIHsKKyAgIFRfU1RSSU5HIGRlc2NyaXB0aW9uOyAvLyBEZXNjcmlwdGlvbiBvZiB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgVF9TVFJJTkcgbWltZVR5cGU7ICAgIC8vIE1JTUUtdHlwZSBvZiB0aGUgZXh0ZXJuYWwgb2JqZWN0LgorICAgVF9TVFJJTkcgbG9jYXRpb247ICAgIC8vIExvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuIChhc2FtIHBhdGggb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVUkwpCit9OworCisvKioKKyogVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiAobWV0YWRhdGEpIGRlZmluaXRpb24uIFRoZSBzYW1lCisqIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdCB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQXR0cmlidXRlCisqLworc3RydWN0IEFwcGxBdHRyIHsKKyAgIE5hbWUgICAgICAgYWFOYW1lOyAgICAgICAvLyBUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlIG5hbWUuIFRoZSBzYW1lIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZXR1cm5lZCBieSB0aGUgbWV0aG9kIGdldE5hbWUoKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBsaWNhdGlvbkF0dHJpYnV0ZSBpbnRlcmZhY2UuICAgICBBdCB0aGUgUlBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhQU5hbWUgb2YgdGhlIHN0cnVjdHVyZSBBdHRyU2VxIGFuZCB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFPUF9HZXRBdHRyLgorICAgTmFtZSAgICAgICBiYU5hbWU7ICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBiYXNlIGF0dHJpYnV0ZSwgZW1wdHkgKCIiKSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgaXMgbm90IGRlcml2ZWQgZnJvbSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBhdHRyaWJ1dGUuIFRoZSBzYW1lIG5hbWUgaXMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWV0aG9kcyBnZXROYW1lKCkgb2YgdGhlIEJhc2VBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2UuIFRoZSBiYXNlIGF0dHJpYnV0ZSBpcyBnaXZlbiBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWV0aG9kIGdldEJhc2VBdHRyaWJ1dGUoKSBvZiB0aGUgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGljYXRpb25BdHRyaWJ1dGUuICAgICBBdCB0aGUgUlBDIEFQSSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUgZmllbGQgYUJOYW1lIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0cnVjdHVyZSBBdHRyU2VxIGFuZCB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFPUF9HZXRBdHRyLgorICAgRGF0YVR5cGUgICBkVHlwZTsgICAgICAgIC8vIFRoZSBhdHRyaWJ1dGUgZGF0YSB0eXBlLiBUaGUgc2FtZSBkYXRhIHR5cGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlbiBieSB0aGUgbWV0aG9kIGdldERhdGFUeXBlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBBcHBsaWNhdGlvbkF0dHJpYnV0ZS4gICAgIEF0IHRoZSBSUEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZSBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFEYXRhVHlwZSBvZiB0aGUgc3RydWN0dXJlIEF0dHJTZXEgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgQU9QX0dldEF0dHIuCisgICBUX0xPTkcgICAgIGxlbmd0aDsgICAgICAgLy8gVGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoIG9mIHZhbHVlcy4gVGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggaXMgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZCBnZXRMZW5ndGgoKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcmZhY2UgQXBwbGljYXRpb25BdHRyaWJ1dGUuCisgICBUX0JPT0xFQU4gIGlzT2JsaWdhdG9yeTsgLy8gVGhlIGluZGljYXRvciBmb3IgbWFuZGF0b3J5IGF0dHJpYnV0ZXMsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdE51bGwgaW5kaWNhdG9yIGlzIHNldCBhdCB0aGUgY29sdW1uIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGluIHRoZSBwaHlzaWNhbCBzdG9yYWdlLiAgVGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib29sZWFuIGlzIHJldHVybmVkIGF0IHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpc09ibGlnYXRvcnkoKSBvZiB0aGUgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGljYXRpb25BdHRyaWJ1dGUuCisgICBUX0JPT0xFQU4gIGlzVW5pcXVlOyAgICAgLy8gVGhlIGluZGljYXRvciBmb3IgdW5pcXVlIGF0dHJpYnV0ZXMuIFRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm9vbGVhbiBpcyByZXR1cm5lZCBieSB0aGUgbWV0aG9kIGlzVW5pcXVlKCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQXR0cmlidXRlLgorICAgVF9MT05HTE9ORyB1bml0SWQ7ICAgICAgIC8vIElkIG9mIHRoZSB1bml0IGlmIGdsb2JhbCBkZWZpbmVkLiBUaGUgc2FtZSBJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJldHVybmVkIGJ5IHRoZSBtZXRob2QgZ2V0VW5pdCgpIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBBcHBsaWNhdGlvbkF0dHJpYnV0ZS4gICAgIEF0IHRoZSBSUEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZSBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFVbml0IG9mIHRoZSBzdHJ1Y3R1cmUgQXR0clNlcSBhbmQgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBT1BfR2V0QXR0ci4KK307CisKKy8qKgorKiBUaGUgYXBwbGljYXRpb24gcmVsYXRpb24gaW5mbyBzdHJ1Y3R1cmUuIFRoZSBzYW1lIGluZm9ybWF0aW9uIGlzCisqIGF2YWlsYWJsZSBhdCB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb24uIAorKiAKKyogQSByZWxhdGlvbiBpcyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBBU0FNIE9EUyBlbGVtZW50czsgaXQgbWF5IGJlCisqIG5hdmlnYXRlZCBpbiBib3RoCisqIGRpcmVjdGlvbnMuIFRoZSBnZXQtIGFuZCBzZXQtIG1ldGhvZHMgYXJlIGRlZmluZWQgZnJvbSB0aGUgZmlyc3QKKyogZWxlbWVudCwgdGhlIGdldEludmVyc2UtIGFuZAorKiBzZXRJbnZlcnNlLSBtZXRob2RzIHdvcmsgZnJvbSB0aGUgc2Vjb25kIGVsZW1lbnQuCisqLworc3RydWN0IEFwcGxSZWwgeworICAgVF9MT05HTE9ORyAgICBlbGVtMTsgICAgICAgICAgICAvLyBUaGUgc291cmNlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuIFRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlbiBJZCBpcyB0aGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgcmV0dXJuZWQgZnJvbSB0aGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldEVsZW0xKCkgb2YgdGhlIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBsaWNhdGlvblJlbGF0aW9uLiAgICAgQXQgdGhlIFJQQyBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZSBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhckFpZDEgb2YgdGhlIHN0cnVjdHVyZSBBcHBsUmVsU2VxIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBBT1BfR2V0QXBwbEluZi4KKyAgIFRfTE9OR0xPTkcgICAgZWxlbTI7ICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBhcHBsaWNhdGlvbiBlbGVtZW50IElkLiBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZW4gSWQgaXMgdGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IHJldHVybmVkIGZyb20gdGhlIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRFbGVtMigpIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGljYXRpb25SZWxhdGlvbi4gICAgIEF0IHRoZSBSUEMgQVBJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJBaWQyIG9mIHRoZSBzdHJ1Y3R1cmUgQXBwbFJlbFNlcSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgQU9QX0dldEFwcGxJbmYuCisgICBOYW1lICAgICAgICAgIGFyTmFtZTsgICAgICAgICAgIC8vIFRoZSByZWxhdGlvbiBuYW1lLiBUaGUgbmFtZSBpcyByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgbWV0aG9kIGdldE5hbWUoKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb24uICAgICBBdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGZpZWxkIGFyTmFtZSBvZiB0aGUgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxSZWxTZXEgYW5kIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFPUF9HZXRBcHBsSW5mLgorICAgTmFtZSAgICAgICAgICBpbnZOYW1lOyAgICAgICAgICAvLyBOYW1lIG9mIHRoZSBpbnZlcnNlIHJlbGF0aW9uLiBUaGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZXR1cm4gd2l0aCB0aGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldEludmVyc2VOYW1lKCkgb2YgdGhlIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBsaWNhdGlvblJlbGF0aW9uLiBUaGUgaW52TmFtZSBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGluIHRoZSBwaHlzaWNhbCBzdG9yYWdlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbiBkYXRhYmFzZXMuCisgICBOYW1lICAgICAgICAgIGJyTmFtZTsgICAgICAgICAgIC8vIE5hbWUgb2YgdGhlIGJhc2UgcmVsYXRpb24gZnJvbSB0aGUgZWxlbTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGVsZW0yLiBUaGUgYmFzZSByZWxhdGlvbiBpcyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzdG9yZWQgaW4gdGhlIHBoeXNpY2FsIHN0b3JhZ2UuCisgICBOYW1lICAgICAgICAgIGludkJyTmFtZTsgICAgICAgIC8vIE5hbWUgb2YgdGhlIGludmVyc2UgYmFzZSByZWxhdGlvbiBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtMiB0byB0aGUgZWxlbTEuIFRoZSBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uIGlzIGFsc28gbm90IHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGh5c2ljYWwgc3RvcmFnZS4KKyAgIFJlbGF0aW9uVHlwZSAgYXJSZWxhdGlvblR5cGU7ICAgLy8gVGhlIHR5cGUgb2YgdGhlIHJlbGF0aW9uLiBUeXBlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbiBpcyBub3Qgc3RvcmVkIGluIHRoZSBwaHlzaWNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yYWdlLiBUaGUgcmVsYXRpb24gdHlwZSBpcyByZXR1cm4gYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1ldGhvZCBnZXRSZWxhdGlvblR5cGUoKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb24uCisgICBSZWxhdGlvblJhbmdlIGFyUmVsYXRpb25SYW5nZTsgIC8vIFRoZSByYW5nZSBvZiB0aGUgcmVsYXRpb24uIFJhbmdlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbiBpcyBub3Qgc3RvcmVkIGluIHRoZSBwaHlzaWNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yYWdlLiBUaGUgcmVsYXRpb24gcmFuZ2UgaXMgcmV0dXJuIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXRob2QgZ2V0UmVsYXRpb25SYW5nZSgpIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2UgQXBwbGljYXRpb25SZWxhdGlvbi4KKyAgIFJlbGF0aW9uUmFuZ2UgaW52UmVsYXRpb25SYW5nZTsgLy8gVGhlIGludmVyc2UgcmFuZ2Ugb2YgdGhlIHJlbGF0aW9uLiBSYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgcmVsYXRpb24gaXMgbm90IHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGh5c2ljYWwgc3RvcmFnZS4gVGhlIGludmVyc2UgcmVsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFuZ2UgaXMgcmV0dXJuIGF0IHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0SW52ZXJzZVJlbGF0aW9uUmFuZ2UoKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb24uCit9OworCisvKioKKyogQUlEIC0gTmFtZSBwYWlyLgorKi8KK3N0cnVjdCBBSUROYW1lIHsKKyAgIFRfTE9OR0xPTkcgYWlkOyAgICAvLyBUaGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICBOYW1lICAgICAgIGFhTmFtZTsgLy8gVGhlIGF0dHJpYnV0ZSwgb3IgbWVhc3VyZWQgcXVhbnRpdHkgbmFtZS4KK307CisKKy8qKgorKiBJbnN0YW5jZSBlbGVtZW50IElkLiBUaGUgdW5pcXVlIGRlc2NyaXB0aW9uIG9mIGFuIGluc3RhbmNlIGVsZW1lbnQuCisqLworc3RydWN0IEVsZW1JZCB7CisgICBUX0xPTkdMT05HIGFpZDsgLy8gVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgVF9MT05HTE9ORyBpaWQ7IC8vIFRoZSBJZCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KK307CisKKy8qKgorKiBBSUQgLSBOYW1lIC0gVW5pdElkIHR1cGxlLgorKi8KK3N0cnVjdCBBSUROYW1lVW5pdElkIHsKKyAgIEFJRE5hbWUgICAgYXR0cjsgICAvLyBUaGUgYXR0cmlidXRlICBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudCAoYWlkLAorICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUpLgorICAgVF9MT05HTE9ORyB1bml0SWQ7IC8vIFRoZSB1bml0IG9mIHRoZSBhdHRyaWJ1dGUgb3IgdGhlIGNvbHVtbi4gVGhlIHVuaXRJZAorICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBJZCBvZiBpbnN0YW5jZSBlbGVtZW50IHdpdGggdGhlIGJhc2V0eXBlCisgICAgICAgICAgICAgICAgICAgICAgLy8gQW9Vbml0LgorfTsKKworLyoqCisqIE9yZGVyIGNyaXRlcmlhLgorKi8KK3N0cnVjdCBTZWxPcmRlciB7CisgICBBSUROYW1lICAgYXR0cjsgICAgICAvLyBBdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbi4KKyAgIFRfQk9PTEVBTiBhc2NlbmRpbmc7IC8vIGFzY2VuZGluZyBvcmRlciwgRkFMU0UgbWVhbnMgZGVzY2VuZGluZy4KK307CisKKy8qKgorKiBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBlbnRyeS4KKyovCitzdHJ1Y3QgQUNMIHsKKyAgIFRfTE9OR0xPTkcgdXNlcmdyb3VwSWQ7IC8vIFRoZSB1c2VyZ3JvdXAgSWQuCisgICBUX0xPTkcgICAgIHJpZ2h0czsgICAgICAvLyBUaGUgYWNjZXNzIHJpZ2h0cyBvZiB0aGUgcmVxdWVzdGVkIG9iamVjdC4KK307CisKKy8qKgorKiBBbiBpbml0aWFsIHJpZ2h0LgorKi8KK3N0cnVjdCBJbml0aWFsUmlnaHQgeworICAgVF9MT05HICAgICByaWdodHM7ICAgICAgLy8gVGhlIGluaXRpYWwgYWNjZXNzIHJpZ2h0cyBvZiB0aGUgcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QuCisgICBUX0xPTkdMT05HIHVzZXJncm91cElkOyAvLyBUaGUgdXNlcmdyb3VwIElkIG9mIHRoZSBJbml0aWFsIHJpZ2h0IGxpc3QuCisgICBUX0xPTkdMT05HIHJlZkFpZDsgICAgICAvLyBUaGUgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gZWxlbWVudC4KK307CisKKy8qKgorKiBpdJJzIHF1aXRlIHRoZSBzYW1lIHNlcXVlbmNlIGFzIGluIHRoZSBRdWVyeVN0cnVjdHVyZSBvZiBHZXRJbnN0YW5jZXMKKyogd2l0aCBvbmUgZXhjZXB0aW9uLiBJdCBoYXMgb25lIG5ldyBhdHRyaWJ1dGUgY2FsbGVkIGZ1bmN0aW9uLCB3aGljaCBpcworKiBvZiB0aGUgdHlwZSBBZ2dyRnVuYy4gVGhlcmVieSAgaXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIGFnZ3JlZ2F0ZQorKiBmdW5jdGlvbnMgb24gYXR0cmlidXRlIGxldmVsLCB3aXRob3V0IHRoZSBuZWVkIHRvIHBhcnNlIHRoZSBhdHRyaWJ1dGUKKyogbmFtZSBmb3IgYSBrbm93biBhZ2dyZWdhdGUgZnVuY3Rpb24gbmFtZS4gVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhhdAorKiBhdHRyaWJ1dGUgZnVuY3Rpb24gaXMgTk9ORSwgaXQgc3ltYm9saXplcyB0aGF0IG5vIGFnZ3JlZ2F0ZSBmdW5jdGlvbgorKiBzaG91bGQgYmUgYXBwbGllZCBvbiB0aGF0IGF0dHJpYnV0ZS5JZiBhbiBhZ2dyZWdhdGUgZnVuY3Rpb24gaXMgdXNlZCwKKyogaXQgaXMgYWxzbyByZXF1aXJlZCB0byBkZWZpbmUgYSBHcm91cFNlcXVlbmNlLkl0IGlzIGFsc28gZGVmaW5lZCB0aGF0IGEKKyogkSqSIGFzIGF0dHJpYnV0ZSBuYW1lLCBkZWxpdmVycyBhbGwgYXR0cmlidXRlcyBvZiBhbiBlbGVtZW50LgorKi8KK3N0cnVjdCBTZWxBSUROYW1lVW5pdElkIHsKKyAgIEFJRE5hbWUgICAgYXR0cjsgICAgICAvLyBUaGUgYXR0cmlidXRlICBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudCAoYWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUpLgorICAgVF9MT05HTE9ORyB1bml0SWQ7ICAgIC8vIFRoZSB1bml0IG9mIHRoZSBhdHRyaWJ1dGUgb3QgdGhlIGNvbHVtbi4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pdElkIGlzIHRoZSBJZCBvZiBpbnN0YW5jZSBlbGVtZW50IHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZXR5cGUgQW9Vbml0LgorICAgQWdnckZ1bmMgICBhZ2dyZWdhdGU7IC8vIFRoZSBhZ2dyZWdhdGUgZnVuY3Rpb24uCit9OworCisvKioKKyogQmFzaWNhbGx5LCBqb2lucyBjYW4gb25seSBiZSByZWFsaXplZCBiZXR3ZWVuIGFwcGxpY2F0aW9uIGVsZW1lbnRzIHRoYXQKKyogYXJlIGxpbmtlZCB2aWEgYSByZWZlcmVuY2UgZGVmaW5lZCBpbiB0aGUgbW9kZWwuRnJvbSB0aGUgZGVmaW5pdGlvbiBvZgorKiBhdHRyaWJ1dGVzIG9yIGFwcGxpY2F0aW9uIGVsZW1lbnRzLCB0aGUgcmVmZXJlbmNlcyBmb3IgdGhlIGpvaW5zIGFyZQorKiBkZXRlcm1pbmVkLiBJdCBpcyBhbHNvIHRha2VuIGludG8gYWNjb3VudCB0aGF0IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50cworKiBpbnZvbHZlZCBhcmUgbm90IGxpbmtlZCBkaXJlY3RseS4gSG93ZXZlciwgdGhlcmUgbXVzdCBiZSBhbiB1bmFtYmlndW91cworKiBwYXRoIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnRzLiBUaGUgcGF0aCBtYXkgYWxzbyBpbmNsdWRlIG46bQorKiByZWxhdGlvbnMuIFRoZSB1bmFtYmlndW91c25lc3Mgb2YgcmVsYXRpb25zIGJldHdlZW4gdHdvIGFwcGxpY2F0aW9uCisqIGVsZW1lbnRzIG5vIGxvbmdlciBleGlzdHMgaWYgbW9yZSB0aGFuIG9uZSByZWZlcmVuY2UgaGFzIGJlZW4gZGVmaW5lZAorKiBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50cy4gSW4gdGhpcyBjYXNlLCB0aGVzZSByZWZlcmVuY2VzIG11c3QKKyogaGF2ZSBuYW1lcyBhbmQgbXVzdCBiZSBpbmRpY2F0ZWQgZXhwbGljaXRseSBpbiB0aGUgcmVxdWVzdC5Gb3IgdGhpcworKiBwdXJwb3NlLCB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBzZXF1ZW5jZSBvZiByZWxhdGlvbgorKiBkZWZpbml0aW9ucyAoSm9pbkRlZlNlcXVlbmNlKS4gVGhlIHNlcXVlbmNlIGluIHdoaWNoIHRoZSBhcHBsaWNhdGlvbgorKiBlbGVtZW50cyBhcmUgYWRkcmVzc2VkIGluIHRoZSByZXF1ZXN0IGFsc28gZGV0ZXJtaW5lcyB0aGUgc2VxdWVuY2UgaW4KKyogd2hpY2ggdGhlIHJlZmVyZW5jZXMgYmV0d2VlbiBhcHBsaWNhdGlvbiBlbGVtZW50cyBhcmUgc2VhcmNoZWQuIFRodXMsCisqIGZvciBldmVyeSBuZXcgYXBwbGljYXRpb24gZWxlbWVudCwgdGhlIHNlcnZlciBiZWdpbnMgd2l0aCB0aGUgZmlyc3QKKyogYXBwbGljYXRpb24gZWxlbWVudCBhZGRyZXNzZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyaWVzIHRvIGZpbmQgYQorKiByZWxhdGlvbiBmcm9tIHRoZXJlLiBJZiBubyByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IGFwcGxpY2F0aW9uIGVsZW1lbnQKKyogY2FuIGJlIGZvdW5kLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB3aXRoIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IHRoYXQKKyogY29tZXMgbmV4dCBpbiB0aGUgcmVxdWVzdC4gRnVydGhlcm1vcmUsIHRoZSBleHBsaWNpdCByZWxhdGlvbgorKiBkZWZpbml0aW9ucyAoSm9pbkRlZlNlcXVlbmNlKSBlbmFibGUgYW4gT1VURVIgam9pbiwgaS5lLiB0aGUgcmVzdWx0CisqIGFsc28gaW5jbHVkZXMgdGhvc2UgcmVjb3JkcyBmb3Igd2hpY2ggdGhlIGpvaW4gY291bGQgbm90IGJlCisqIGVzdGFibGlzaGVkLgorKi8KK3N0cnVjdCBKb2luRGVmIHsKKyAgIFRfTE9OR0xPTkcgZnJvbUFJRDsKKyAgIFRfTE9OR0xPTkcgdG9BSUQ7CisgICBOYW1lICAgICAgIHJlZk5hbWU7CisgICBKb2luVHlwZSAgIGpvaW5pbmdUeXBlOworfTsKKworLyoqCisqIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiB3aXRoIHRoZSBpbnN0YW5jZXMgdG8gY3JlYXRlIHRoZSByZWxhdGlvbiB3aXRoCisqIG5ldyBpbnN0YW5jZXMuCisqLworc3RydWN0IEFwcGxpY2F0aW9uUmVsYXRpb25JbnN0YW5jZUVsZW1lbnRTZXEgeworICAgQXBwbGljYXRpb25SZWxhdGlvbiAgICAgYXBwbFJlbDsgICAvLyBUaGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICBJbnN0YW5jZUVsZW1lbnRTZXF1ZW5jZSBpbnN0YW5jZXM7IC8vIFRoZSBsaXN0IHdpdGggaW5zdGFuY2VzLiBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gZWxlbWVudCBvZiB0aGUgaW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBsaXN0IG11c3QgbWF0Y2ggb25lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBlbGVtZW50cyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gcmVsYXRpb24uIEFsbCBpbnN0YW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGxpc3QgbXVzdCBoYXZlIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGVsZW1lbnQuCit9OworCisvKioKKyogVGhlIHN0cnVjdHVyZSB3aXRoIHRoZSBhdHRyaWJ1dGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBlbnVtZXJhdGlvbi4KKyovCitzdHJ1Y3QgRW51bWVyYXRpb25BdHRyaWJ1dGVTdHJ1Y3R1cmUgeworICAgVF9MT05HTE9ORyBhaWQ7ICAgICAgLy8gVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuCisgICBUX1NUUklORyAgIGFhTmFtZTsgICAvLyBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICBUX1NUUklORyAgIGVudW1OYW1lOyAvLyBUaGUgbmFtZSBvZiB0aGUgZW51bWVyYXRpb24KK307CisKKy8qKgorKiBUaGUgc3RydWN0dXJlIHdpdGggdGhlIGl0ZW1zIG9mIHRoZSBlbnVtZXJhdGlvbi4KKyovCitzdHJ1Y3QgRW51bWVyYXRpb25JdGVtU3RydWN0dXJlIHsKKyAgIFRfTE9ORyAgIGluZGV4OyAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGVudWVtcmF0aW9uIGl0ZW0uCisgICBUX1NUUklORyBpdGVtTmFtZTsgLy8gVGhlIG5hbWUgb2YgdGhlIGl0ZW0uCit9OworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxFbnVtZXJhdGlvbkF0dHJpYnV0ZVN0cnVjdHVyZT4gRW51bWVyYXRpb25BdHRyaWJ1dGVTdHJ1Y3R1cmVTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8RW51bWVyYXRpb25JdGVtU3RydWN0dXJlPiBFbnVtZXJhdGlvbkl0ZW1TdHJ1Y3R1cmVTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8VF9DT01QTEVYPiBTX0NPTVBMRVg7Cit0eXBlZGVmIHNlcXVlbmNlPFRfRENPTVBMRVg+IFNfRENPTVBMRVg7Cit0eXBlZGVmIHNlcXVlbmNlPFRfTE9OR0xPTkc+IFNfTE9OR0xPTkc7Cit0eXBlZGVmIHNlcXVlbmNlPFNfTE9OR0xPTkc+IFNTX0xPTkdMT05HOwordHlwZWRlZiBzZXF1ZW5jZTxTX0NPTVBMRVg+IFNTX0NPTVBMRVg7Cit0eXBlZGVmIHNlcXVlbmNlPFNfRENPTVBMRVg+IFNTX0RDT01QTEVYOwordHlwZWRlZiBzZXF1ZW5jZTxUX0V4dGVybmFsUmVmZXJlbmNlPiBTX0V4dGVybmFsUmVmZXJlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTX0V4dGVybmFsUmVmZXJlbmNlPiBTU19FeHRlcm5hbFJlZmVyZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8QXBwbEF0dHI+IEFwcGxBdHRyU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEFwcGxSZWw+IEFwcGxSZWxTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8QUlETmFtZT4gQUlETmFtZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxBSUROYW1lVW5pdElkPiBBSUROYW1lVW5pdElkU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEVsZW1JZD4gRWxlbUlkU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPFNlbE9yZGVyPiBTZWxPcmRlclNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxBQ0w+IEFDTFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxJbml0aWFsUmlnaHQ+IEluaXRpYWxSaWdodFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTZWxBSUROYW1lVW5pdElkPiBTZWxBSUROYW1lVW5pdElkU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEpvaW5EZWY+IEpvaW5EZWZTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8QXBwbGljYXRpb25SZWxhdGlvbkluc3RhbmNlRWxlbWVudFNlcT4gQXBwbGljYXRpb25SZWxhdGlvbkluc3RhbmNlRWxlbWVudFNlcVNlcXVlbmNlOworCisvKioKKyogVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgZGVmaW5pdGlvbi4gVGhlIHNhbWUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCisqIGF0IHRoZSBpbnRlcmZhY2UgQXBwbGljYXRpb25FbGVtZW50LgorKi8KK3N0cnVjdCBBcHBsRWxlbSB7CisgICBUX0xPTkdMT05HICAgICAgIGFpZDsgICAgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLiBUaGUgaWQgaXMgZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyB3aXRoIHRoZSBtZXRob2QgZ2V0SWQoKSBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uRWxlbWVudC4gICAgIEF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgYWlBSWQgb2YgdGhlIHN0cnVjdHVyZSBBcHBsSW5mU2VxIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBBT1BfR2V0QXBwbEluZi4KKyAgIE5hbWUgICAgICAgICAgICAgYmVOYW1lOyAgICAgLy8gVGhlIGJhc2UgZWxlbWVudCBuYW1lLCBhbGwgZWxlbWVudHMgaGF2ZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhc2ljIGVsZW1lbnQuIFRoZSBzYW1lIG5hbWUgaXMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1ldGhvZHMgZ2V0VHlwZSgpIG9mIHRoZSBCYXNlRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2UuIFRoZSBiYXNlIGVsZW1lbnQgaXMgZ2l2ZW4gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWV0aG9kIGdldEJhc2VFbGVtZW50KCkgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBBcHBsaWNhdGlvbkVsZW1lbnQuICAgICBBdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBub3QgZGVsaXZlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgY29ycmVzcG9uZGluZyBJZCBvZiB0aGUgYmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IHdhcyBzdG9yZWQgaW4gdGhlIGZpZWxkIGFpQklkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdHJ1Y3R1cmUgQXBwbEluZlNlcSBhbmQgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQU9QX0dldEFwcGxJbmYuCisgICBOYW1lICAgICAgICAgICAgIGFlTmFtZTsgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuIFRoZSBuYW1lIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVuIGFsc28gd2l0aCB0aGUgbWV0aG9kIGdldE5hbWUoKSBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uRWxlbWVudC4gICAgIEF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgYWlOYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgQXBwbEluZlNlcQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIHJlcXVlc3QgQU9QX0dldEFwcGxJbmYuCisgICBBcHBsQXR0clNlcXVlbmNlIGF0dHJpYnV0ZXM7IC8vIFRoZSBhdHRyaWJ1dGVzIG9mIGFwcGxpY2F0aW9uIGVsZW1lbnQuIFRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIGFyZSBnaXZlbiB3aXRoIHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0QXR0cmlidXRlcygpIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGljYXRpb25FbGVtZW50LiBUaGVyZSBhcmUgbm8gcmVsYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVuIGluIHRoZSB0aGlzIHNlcXVlbmNlLgorfTsKKworLyoqCisqIFRoZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgZW51bWVyYXRpb24gYW5kIHRoZXJlIGl0ZW1zLgorKi8KK3N0cnVjdCBFbnVtZXJhdGlvblN0cnVjdHVyZSB7CisgICBUX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTmFtZTsgLy8gVGhlIG5hbWUgb2YgdGhlIGVudWVyYXRpb24uCisgICBFbnVtZXJhdGlvbkl0ZW1TdHJ1Y3R1cmVTZXF1ZW5jZSBpdGVtczsgICAgLy8gVGhlIGl0ZW1zIG9mIHRoZSBlbnVtZXJhdGlvbi4KK307CisKKy8qKgorKiBUaGUgdW5pb24gZGVmaW5pdGlvbiBmb3IgYWxsIGRhdGF0eXBlcy4KKyovCit1bmlvbiBUU19VbmlvbiBzd2l0Y2ggKERhdGFUeXBlKSB7CisgICBjYXNlIERUX1NUUklORzogICAgICAgICAgICAgICAgICAgICAgVF9TVFJJTkcgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbDsKKyAgIGNhc2UgRFRfU0hPUlQ6ICAgICAgICAgICAgICAgICAgICAgICBUX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWYWw7CisgICBjYXNlIERUX0ZMT0FUOiAgICAgICAgICAgICAgICAgICAgICAgVF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0VmFsOworICAgY2FzZSBEVF9CWVRFOiAgICAgICAgICAgICAgICAgICAgICAgIFRfQllURSAgICAgICAgICAgICAgICAgICAgICAgICBieXRlVmFsOworICAgY2FzZSBEVF9CT09MRUFOOiAgICAgICAgICAgICAgICAgICAgIFRfQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBib29sZWFuVmFsOworICAgY2FzZSBEVF9MT05HOiAgICAgICAgICAgICAgICAgICAgICAgIFRfTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICBsb25nVmFsOworICAgY2FzZSBEVF9ET1VCTEU6ICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVWYWw7CisgICBjYXNlIERUX0xPTkdMT05HOiAgICAgICAgICAgICAgICAgICAgVF9MT05HTE9ORyAgICAgICAgICAgICAgICAgICAgIGxvbmdsb25nVmFsOworICAgY2FzZSBEVF9DT01QTEVYOiAgICAgICAgICAgICAgICAgICAgIFRfQ09NUExFWCAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4VmFsOworICAgY2FzZSBEVF9EQ09NUExFWDogICAgICAgICAgICAgICAgICAgIFRfRENPTVBMRVggICAgICAgICAgICAgICAgICAgICBkY29tcGxleFZhbDsKKyAgIGNhc2UgRFRfREFURTogICAgICAgICAgICAgICAgICAgICAgICBUX0RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVZhbDsKKyAgIGNhc2UgRFRfQllURVNUUjogICAgICAgICAgICAgICAgICAgICBUX0JZVEVTVFIgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0clZhbDsKKyAgIGNhc2UgRFRfQkxPQjogICAgICAgICAgICAgICAgICAgICAgICBUX0JMT0IgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYlZhbDsKKyAgIGNhc2UgRFNfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICBTX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nU2VxOworICAgY2FzZSBEU19TSE9SVDogICAgICAgICAgICAgICAgICAgICAgIFNfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFNlcTsKKyAgIGNhc2UgRFNfRkxPQVQ6ICAgICAgICAgICAgICAgICAgICAgICBTX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRTZXE7CisgICBjYXNlIERTX0JZVEU6ICAgICAgICAgICAgICAgICAgICAgICAgU19CWVRFICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTZXE7CisgICBjYXNlIERTX0JPT0xFQU46ICAgICAgICAgICAgICAgICAgICAgU19CT09MRUFOICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5TZXE7CisgICBjYXNlIERTX0xPTkc6ICAgICAgICAgICAgICAgICAgICAgICAgU19MT05HICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdTZXE7CisgICBjYXNlIERTX0RPVUJMRTogICAgICAgICAgICAgICAgICAgICAgU19ET1VCTEUgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZVNlcTsKKyAgIGNhc2UgRFNfTE9OR0xPTkc6ICAgICAgICAgICAgICAgICAgICBTX0xPTkdMT05HICAgICAgICAgICAgICAgICAgICAgbG9uZ2xvbmdTZXE7CisgICBjYXNlIERTX0NPTVBMRVg6ICAgICAgICAgICAgICAgICAgICAgU19DT01QTEVYICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZXE7CisgICBjYXNlIERTX0RDT01QTEVYOiAgICAgICAgICAgICAgICAgICAgU19EQ09NUExFWCAgICAgICAgICAgICAgICAgICAgIGRjb21wbGV4U2VxOworICAgY2FzZSBEU19EQVRFOiAgICAgICAgICAgICAgICAgICAgICAgIFNfREFURSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlU2VxOworICAgY2FzZSBEU19CWVRFU1RSOiAgICAgICAgICAgICAgICAgICAgIFNfQllURVNUUiAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyU2VxOworICAgY2FzZSBEVF9FWFRFUk5BTFJFRkVSRU5DRTogICAgICAgICAgIFRfRXh0ZXJuYWxSZWZlcmVuY2UgICAgICAgICAgICBleHRSZWZWYWw7CisgICBjYXNlIERTX0VYVEVSTkFMUkVGRVJFTkNFOiAgICAgICAgICAgU19FeHRlcm5hbFJlZmVyZW5jZSAgICAgICAgICAgIGV4dFJlZlNlcTsKKyAgIGNhc2UgRFRfRU5VTTogICAgICAgICAgICAgICAgICAgICAgICBUX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZhbDsKKyAgIGNhc2UgRFNfRU5VTTogICAgICAgICAgICAgICAgICAgICAgICBTX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVNlcTsKK307CisKKy8qKgorKiBEZWZpbmUgYSB1bmlvbiB3aXRoIHNlcXVlbmNlcyBvZiBhIGNlcnRhaW4gdHlwZS4gVXNpbmcgdGhpcyB1bmlvbgorKiBpbnN0ZWFkIG9mIHNlcXVlbmNlIDxUU19Vbmlvbj4gZ2l2ZXMgbXVjaCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisqLwordW5pb24gVFNfVW5pb25TZXEgc3dpdGNoIChEYXRhVHlwZSkgeworICAgY2FzZSBEVF9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgIFNfU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdWYWw7CisgICBjYXNlIERUX1NIT1JUOiAgICAgICAgICAgICAgICAgICAgICAgU19TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmFsOworICAgY2FzZSBEVF9GTE9BVDogICAgICAgICAgICAgICAgICAgICAgIFNfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFZhbDsKKyAgIGNhc2UgRFRfQllURTogICAgICAgICAgICAgICAgICAgICAgICBTX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVZhbDsKKyAgIGNhc2UgRFRfQk9PTEVBTjogICAgICAgICAgICAgICAgICAgICBTX0JPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbDsKKyAgIGNhc2UgRFRfTE9ORzogICAgICAgICAgICAgICAgICAgICAgICBTX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1ZhbDsKKyAgIGNhc2UgRFRfRE9VQkxFOiAgICAgICAgICAgICAgICAgICAgICBTX0RPVUJMRSAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlVmFsOworICAgY2FzZSBEVF9MT05HTE9ORzogICAgICAgICAgICAgICAgICAgIFNfTE9OR0xPTkcgICAgICAgICAgICAgICAgICAgICBsb25nbG9uZ1ZhbDsKKyAgIGNhc2UgRFRfQ09NUExFWDogICAgICAgICAgICAgICAgICAgICBTX0NPTVBMRVggICAgICAgICAgICAgICAgICAgICAgY29tcGxleFZhbDsKKyAgIGNhc2UgRFRfRENPTVBMRVg6ICAgICAgICAgICAgICAgICAgICBTX0RDT01QTEVYICAgICAgICAgICAgICAgICAgICAgZGNvbXBsZXhWYWw7CisgICBjYXNlIERUX0RBVEU6ICAgICAgICAgICAgICAgICAgICAgICAgU19EQVRFICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVWYWw7CisgICBjYXNlIERUX0JZVEVTVFI6ICAgICAgICAgICAgICAgICAgICAgU19CWVRFU1RSICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJWYWw7CisgICBjYXNlIERUX0JMT0I6ICAgICAgICAgICAgICAgICAgICAgICAgU19CTE9CICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2JWYWw7CisgICBjYXNlIERTX1NUUklORzogICAgICAgICAgICAgICAgICAgICAgU1NfU1RSSU5HICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1NlcTsKKyAgIGNhc2UgRFNfU0hPUlQ6ICAgICAgICAgICAgICAgICAgICAgICBTU19TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRTZXE7CisgICBjYXNlIERTX0ZMT0FUOiAgICAgICAgICAgICAgICAgICAgICAgU1NfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0U2VxOworICAgY2FzZSBEU19CWVRFOiAgICAgICAgICAgICAgICAgICAgICAgIFNTX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICBieXRlU2VxOworICAgY2FzZSBEU19CT09MRUFOOiAgICAgICAgICAgICAgICAgICAgIFNTX0JPT0xFQU4gICAgICAgICAgICAgICAgICAgICBib29sZWFuU2VxOworICAgY2FzZSBEU19MT05HOiAgICAgICAgICAgICAgICAgICAgICAgIFNTX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICBsb25nU2VxOworICAgY2FzZSBEU19ET1VCTEU6ICAgICAgICAgICAgICAgICAgICAgIFNTX0RPVUJMRSAgICAgICAgICAgICAgICAgICAgICBkb3VibGVTZXE7CisgICBjYXNlIERTX0xPTkdMT05HOiAgICAgICAgICAgICAgICAgICAgU1NfTE9OR0xPTkcgICAgICAgICAgICAgICAgICAgIGxvbmdsb25nU2VxOworICAgY2FzZSBEU19DT01QTEVYOiAgICAgICAgICAgICAgICAgICAgIFNTX0NPTVBMRVggICAgICAgICAgICAgICAgICAgICBjb21wbGV4U2VxOworICAgY2FzZSBEU19EQ09NUExFWDogICAgICAgICAgICAgICAgICAgIFNTX0RDT01QTEVYICAgICAgICAgICAgICAgICAgICBkY29tcGxleFNlcTsKKyAgIGNhc2UgRFNfREFURTogICAgICAgICAgICAgICAgICAgICAgICBTU19EQVRFICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVNlcTsKKyAgIGNhc2UgRFNfQllURVNUUjogICAgICAgICAgICAgICAgICAgICBTU19CWVRFU1RSICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0clNlcTsKKyAgIGNhc2UgRFRfRVhURVJOQUxSRUZFUkVOQ0U6ICAgICAgICAgICBTX0V4dGVybmFsUmVmZXJlbmNlICAgICAgICAgICAgZXh0UmVmVmFsOworICAgY2FzZSBEU19FWFRFUk5BTFJFRkVSRU5DRTogICAgICAgICAgIFNTX0V4dGVybmFsUmVmZXJlbmNlICAgICAgICAgICBleHRSZWZTZXE7CisgICBjYXNlIERUX0VOVU06ICAgICAgICAgICAgICAgICAgICAgICAgU19MT05HICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1WYWw7CisgICBjYXNlIERTX0VOVU06ICAgICAgICAgICAgICAgICAgICAgICAgU1NfTE9ORyAgICAgICAgICAgICAgICAgICAgICAgIGVudW1TZXE7Cit9OworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxFbnVtZXJhdGlvblN0cnVjdHVyZT4gRW51bWVyYXRpb25TdHJ1Y3R1cmVTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8QXBwbEVsZW0+IEFwcGxFbGVtU2VxdWVuY2U7CisKKy8qKgorKiBUaGUgQVNBTSBPRFMgdmFsdWUgc3RydWN0dXJlLiAgVGhlcmUgaXMgb25lIGZsYWcgZm9yIGVhY2ggdmFsdWUuIElmIHRoZQorKiB1bmlvbiAodSkgY29udGFpbnMgYSBzZXF1ZW5jZSwgdGhlIGZsYWcgaXMgdmFsaWQgZm9yIGFsbCB2YWx1ZXMgaW4gdGhhdAorKiBzZXF1ZW5jZS4KKyogCisqIE1lYW5pbmcgb2YgZmxhZ3M6CisqICAgIEFPX1ZGX1ZBTElEKDB4MDEpICAgICAgVGhlIHZhbHVlIGlzIHZhbGlkLgorKiAgICBBT19WRl9WSVNJQkxFKDB4MDIpICAgIFRoZSB2YWx1ZSBoYXMgdG8gYmUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxpemVkLgorKiAgICBBT19WRl9VTk1PRElGSUVEKDB4MDQpIFRoZSB2YWx1ZSBoYXMgbm90IGJlZW4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZC4KKyogICAgQU9fVkZfREVGSU5FRCgweDA4KSAgICBUaGUgdmFsdWUgaXMgZGVmaW5lZC4gSWYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgaW4gYSB2YWx1ZSBtYXRyaXgKKyogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlIHRoaXMgYml0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHNldC4KKyogICBUaGUgbm9ybWFsIHZhbHVlIG9mIHRoZSBmbGFnIGlzIDE1LgorKi8KK3N0cnVjdCBUU19WYWx1ZSB7CisgICBUU19VbmlvbiB1OyAgICAvLyBUaGUgdmFsdWUgdW5pb24gZm9yIHZhbHVlcyBvZiBhbGwga25vd24gZGF0YXR5cGVzLgorICAgVF9TSE9SVCAgZmxhZzsgLy8gVGhlIHZhbHVlIGZsYWdzLgorfTsKKworLyoqCisqIEEgc3RydWN0dXJlIHdpdGggc2VxdWVuY2VzIG9mIGEgY2VydGFpbiB0eXBlLiBVc2luZyB0aGlzIHVuaW9uIGluc3RlYWQKKyogb2Ygc2VxdWVuY2UgPFRTX1ZhbHVlPiBnaXZlcyBtdWNoIGJldHRlciBwZXJmb3JtYW5jZS4KKyovCitzdHJ1Y3QgVFNfVmFsdWVTZXEgeworICAgVFNfVW5pb25TZXEgdTsgICAgLy8gVGhlIHZhbHVlIHVuaW9uIGZvciB2YWx1ZXMgb2YgYWxsIGtub3duIGRhdGF0eXBlcy4KKyAgIFNfU0hPUlQgICAgIGZsYWc7IC8vIFNlZSBUU19WYWx1ZSBmbGFnLgorfTsKKworLyoqCisqIEFwcGxpY2F0aW9uIHN0cnVjdHVyZSB2YWx1ZXMuIEFsbCB2YWx1ZXMgb2YgdGhlIGVudGlyZSBhcHBsaWNhdGlvbgorKiBzdHJ1Y3R1cmUgYXJlIHN0b3JlZCBpbiB0aGlzIHN0cnVjdHVyZSBhbmQgbG9hZGVkIHRvIHRoZSBDbGllbnQgb24KKyogcmVxdWVzdC4gCisqIAorKiBBdCB0aGUgUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIGRlbGl2ZXJlZCBieSB0aGUgcmVxdWVzdCBBT1BfR2V0QXBwbEluZgorKiBhbmQgQU9QX0dldEF0dHIgZm9yIGVhY2ggYXBwbGljYXRpb24gZWxlbWVudC4KKyovCitzdHJ1Y3QgQXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZSB7CisgICBBcHBsRWxlbVNlcXVlbmNlIGFwcGxFbGVtczsgLy8gVGhlIGxpc3Qgb2YgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICBBcHBsUmVsU2VxdWVuY2UgIGFwcGxSZWxzOyAgLy8gVGhlIGxpc3Qgb2YgcmVsYXRpb25zIGluIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZS4gVGhlIGxpc3Qgb2YgQXBwbFJlbCdzIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluY3QgZW50cmllcyBmb3IgcmVsYXRpb25zIGFuZCB0aGVpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmVyc2VzLiBUaGUgZmllbGQgaW52TmFtZSBjb250YWlucyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0bmVyIHJlbGF0aW9uLiAgQm90aCByZWxhdGlvbiwgdGhlIG5vcm1hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgaW52ZXJzZSByZWxhdGlvbiBhcmUgZ2l2ZW4gaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIG5hbWUtdmFsdWUtdW5pdCB0dXBsZSBzdHJ1Y3R1cmUgd2l0aCBhIHNlcXVlbmNlIG9mIHZhbHVlcy4KKyovCitzdHJ1Y3QgTmFtZVZhbHVlU2VxVW5pdCB7CisgICBOYW1lICAgICAgICB2YWxOYW1lOyAvLyBDb2x1bW4gbmFtZSBvciBtZWFzdXJlZCBxdWFudGl0eSBuYW1lLgorICAgVFNfVmFsdWVTZXEgdmFsdWU7ICAgLy8gQ29sdW1uIHZhbHVlICh2ZWN0b3IpLgorICAgVF9TVFJJTkcgICAgdW5pdDsgICAgLy8gQ29sdW1uIHVuaXQgYXMgc3RyaW5nLgorfTsKKworLyoqCisqIEFJRCAtIE5hbWUgLSBWYWx1ZSAtIFVuaXRJZCBxdWFydGV0LgorKi8KK3N0cnVjdCBBSUROYW1lVmFsdWVVbml0SWQgeworICAgQUlETmFtZSAgICBhdHRyOyAgIC8vIFRoZSBhdHRyaWJ1dGUgIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IChhaWQsCisgICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZSkuCisgICBUX0xPTkdMT05HIHVuaXRJZDsgLy8gVGhlIHVuaXQgb2YgdGhlIGF0dHJpYnV0ZSBvdCB0aGUgY29sdW1uLiBUaGUgdW5pdElkCisgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIElkIG9mIGluc3RhbmNlIGVsZW1lbnQgd2l0aCB0aGUgYmFzZXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBBb1VuaXQuCisgICBUU19WYWx1ZSAgIHZhbHVlczsgLy8gVGhlIGF0dHJpYnV0ZSB2YWx1ZXMgd2l0aCB2YWx1ZSBmbGFncy4KK307CisKKy8qKgorKiBBSUQgLSBOYW1lIC0gVmFsdWUgLSBVbml0SWQgcXVhcnRldC4gTXVsdGlwbGUgdmFsdWVzIGZvciBvbiBhdHRyaWJ1dGUuCisqLworc3RydWN0IEFJRE5hbWVWYWx1ZVNlcVVuaXRJZCB7CisgICBBSUROYW1lICAgICBhdHRyOyAgIC8vIFRoZSBhdHRyaWJ1dGUgIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IChhaWQsCisgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUpLgorICAgVF9MT05HTE9ORyAgdW5pdElkOyAvLyBUaGUgdW5pdCBvZiB0aGUgYXR0cmlidXRlIG90IHRoZSBjb2x1bW4uIFRoZSB1bml0SWQKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIElkIG9mIGluc3RhbmNlIGVsZW1lbnQgd2l0aCB0aGUgYmFzZXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gQW9Vbml0LgorICAgVFNfVmFsdWVTZXEgdmFsdWVzOyAvLyBUaGUgY29sdW1uIHZhbHVlcyB3aXRoIHZhbHVlIGZsYWdzLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlLXVuaXRJZCB0dXBsZSBzdHJ1Y3R1cmUgd2l0aCBhIHNlcXVlbmNlIG9mCisqIHZhbHVlcy4KKyovCitzdHJ1Y3QgTmFtZVZhbHVlU2VxVW5pdElkIHsKKyAgIE5hbWUgICAgICAgIHZhbE5hbWU7IC8vIENvbHVtbiBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUU19WYWx1ZVNlcSB2YWx1ZTsgICAvLyBDb2x1bW4gdmFsdWUgKHZlY3RvcikuCisgICBUX0xPTkdMT05HICB1bml0SWQ7ICAvLyBDb2x1bW4gdW5pdCBhcyBJZC4KK307CisKKy8qKgorKiAgU3RydWN0dXJlIGZvciBuYW1lIHZhbHVlIHF1ZXJ5IG9yIGF0dHJpYnV0ZSBzZWFyY2ggY29uZGl0aW9ucy4KKyovCitzdHJ1Y3QgU2VsVmFsdWUgeworICAgQUlETmFtZVZhbHVlVW5pdElkIGF0dHI7ICAvLyBUaGUgYXR0cmlidXRlIHNwZWNpZmljYXRpb24gd2l0aCB1bml0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZS4KKyAgIFNlbE9wY29kZSAgICAgICAgICBvcGVyOyAgLy8gVGhlIGNvbXBhcmUgb3BlcmF0b3IgYmV0d2VlbiB0aGUgYXR0cmlidXRlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZS4KKyAgIFRTX1ZhbHVlICAgICAgICAgICB2YWx1ZTsgLy8gVmFsdWUgZm9yIHRoZSBjb25kaXRpb24uCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIG5hbWUtdmFsdWUtdW5pdGlkIHR1cGxlIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgaXMKKyogaWRlbnRpY2FsIHdpdGggdGhlIE5hbWVWYWx1ZVVuaXQsIGV4Y2VwdCB0aGUgdW5pdCBpcyBnaXZlbiBhcyBhbiBJZAorKiBpbnNlYWQgb2YgYSBzdHJpbmcuCisqLworc3RydWN0IE5hbWVWYWx1ZVVuaXRJZCB7CisgICBOYW1lICAgICAgIHZhbE5hbWU7IC8vIEF0dHJpYnV0ZSBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUU19WYWx1ZSAgIHZhbHVlOyAgIC8vIEF0dHJpYnV0ZSB2YWx1ZSBvciBjb2x1bW4gdmFsdWUgKHZlY3RvcikuCisgICBUX0xPTkdMT05HIHVuaXRJZDsgIC8vIElkIG9mIGF0dHJpYnV0ZSBvciBjb2x1bW4gdW5pdC4KK307CisKKy8qKgorKiBUaGUgYXR0cmlidXRlIHNlbGVjdGlvbiBzdHJ1Y3R1cmUuCisqLworc3RydWN0IFNlbFZhbHVlRXh0IHsKKyAgIEFJRE5hbWVVbml0SWQgYXR0cjsgIC8vIFRoZSBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbiB3aXRoIHVuaXQgSWQuCisgICBTZWxPcGNvZGUgICAgIG9wZXI7ICAvLyBUaGUgY29tcGFyZSBvcGVyYXRvciBiZXR3ZWVuIHRoZSBhdHRyaWJ1dGUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZS4KKyAgIFRTX1ZhbHVlICAgICAgdmFsdWU7IC8vIFZhbHVlIGZvciB0aGUgY29uZGl0aW9uLgorfTsKKworLyoqCisqIERlZmluZXMgdGhlIHNlcXVlbmNlIG9mIHNlbGVjdGlvbiBhdHRyaWJ1dGVzIHdpdGggdGhlaXIgbG9naWNhbAorKiBvcGVyYXRvcnMuIFRoZSBJZGVhIGlzIHRvIGhhdmUgdGhlIGxvZ2ljYWwgb3BlcmF0b3JzIGFuZCB0aGUgc2VsZWN0aW9uCisqIHZhbHVlcyBpbiBvbmUgc2VxdWVuY2UuIFRoZXJlZm9yZSBubyBpbXBsaWNpdCBydWxlcyBhcmUgbmVjZXNzYXJ5IGhvdworKiBsb2dpY2FsIG9wZXJhdG9ycyBoYXZlIHRvIGJlIGludGVycHJldGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNlbGVjdGlvbgorKiB2YWx1ZS4KKyovCit1bmlvbiBTZWxJdGVtIHN3aXRjaCAoU2VsVHlwZSkgeworICAgY2FzZSBTRUxfVkFMVUVfVFlQRTogICAgICAgICAgICAgICAgIFNlbFZhbHVlRXh0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKKyAgIGNhc2UgU0VMX09QRVJBVE9SX1RZUEU6ICAgICAgICAgICAgICBTZWxPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I7Cit9OworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxOYW1lVmFsdWVTZXFVbml0PiBOYW1lVmFsdWVTZXFVbml0U2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEFJRE5hbWVWYWx1ZVNlcVVuaXRJZD4gQUlETmFtZVZhbHVlU2VxVW5pdElkU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPFNlbFZhbHVlPiBTZWxWYWx1ZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxOYW1lVmFsdWVTZXFVbml0SWQ+IE5hbWVWYWx1ZVNlcVVuaXRJZFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTZWxJdGVtPiBTZWxJdGVtU2VxdWVuY2U7CisKKy8qKgorKiBUaGUgQVNBTSBPRFMgbmFtZS12YWx1ZSBwYWlyIHN0cnVjdHVyZS4KKyovCitzdHJ1Y3QgTmFtZVZhbHVlIHsKKyAgIE5hbWUgICAgIHZhbE5hbWU7IC8vIEF0dHJpYnV0ZSBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUU19WYWx1ZSB2YWx1ZTsgICAvLyBBdHRyaWJ1dGUgdmFsdWUgb3IgY29sdW1uIHZhbHVlICh2ZWN0b3IpLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlLXVuaXQgdHVwbGUgc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSBpcworKiBpZGVudGljYWwgd2l0aCB0aGUgTmFtZVZhbHVlVW5pdElkLCBleGNlcHQgdGhlIHVuaXQgaXMgZ2l2ZW4gYXMgYQorKiBzdHJpbmcgaW5zZWFkIG9mIGFuIElkLgorKi8KK3N0cnVjdCBOYW1lVmFsdWVVbml0IHsKKyAgIE5hbWUgICAgIHZhbE5hbWU7IC8vIEF0dHJpYnV0ZSBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUU19WYWx1ZSB2YWx1ZTsgICAvLyBBdHRyaWJ1dGUgdmFsdWUgb3IgY29sdW1uIHZhbHVlICh2ZWN0b3IpLgorICAgVF9TVFJJTkcgdW5pdDsgICAgLy8gQXR0cmlidXRlIG9yIGNvbHVtbiB1bml0IGFzIHN0cmluZy4KK307CisKKy8qKgorKiBUaGUgcmVzdWx0cyBmb3Igb25lIGF0dHJpYnV0ZS4gVGhlIHJlc3VsdCBzZXQgZm9yIGFsbCBhdHRyaWJ1dGVzIGFyZQorKiBnaXZlbiBpbiB0aGUgc2VxdWVuY2Ugb2YgdGhlIHJlc3VsdCBzZXQuCisqLworc3RydWN0IEF0dHJSZXN1bHRTZXQgeworICAgTmFtZVZhbHVlU2VxVW5pdElkICAgICAgYXR0clZhbHVlczsgLy8gVGhlIGF0dHJpYnV0ZSByZXN1bHQgc2V0IG9mIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudC4gQWxsIHZhbHVlcyBoYXZlIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgKEFJRE5hbWUpIGFuZCB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pdCAoVW5pdElkKS4gT25seSB0aGUgZmlyc3QgcGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHBvc3NpYmxlIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgaW4gdGhpcyByZXN1bHQgc2V0LiBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgb2YgdGhlIHBhcnQgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAnaG93X21hbnknIG9mIHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdnZXRJbnN0YW5jZXMnIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdBcHBsRWxlbUFjY2VzcycuCisgICBOYW1lVmFsdWVVbml0SWRJdGVyYXRvciByZXN0OyAgICAgICAvLyBUaGUgcmVzdCBvZiB0aGUgcmVzdWx0cy4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRvciBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zZWNjdXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hbWVWYWx1ZVNlcVVuaXRJZC1wYWNrYWdlcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBzZXQuCit9OworCisvKioKKyogVGhlIHF1ZXJ5IHN0cnVjdHVyZS4KKyogCisqIEhvdyB0byBidWlsZCBhIHF1ZXJ5LgorKiAKKyogQSBxdWVyeSBpcyBhIHNlYXJjaCBjb25kaXRpb24gZm9yIGluc3RhbmNlcy4gVGhlIGluc3RhbmNlcyBhcmUKKyogc3BlY2lmaWVkIGJ5IHRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMuIFRoZSBzZWFyY2ggY29uZGl0aW9uCisqIHJlcHJlc2VudHMgYW4gYXR0cmlidXRlIHZhbHVlIGNvbmRpdGlvbi4gVGhpcyBtZWFucyB0aGUgYXR0cmlidXRlIHZhbHVlCisqIHNwZWNpZmllcyB0aGUgc2VsZWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBvciBpbnN0YW5jZSBhdHRyaWJ1dGUuIEFuCisqIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgYW5kIHRoZSBuYW1lIG9mIHRoZQorKiBhdHRyaWJ1dGUgKEFJRE5hbWUpLiBUaGUgY29uZGl0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZW51bWVyYXRpb24KKyogU2VsT1BDb2RlLiBUaGUgdmFsdWVzIGFyZSBnaXZlbiBpbiB0aGUgVFNfVmFsdWUgb3IgVFNfVW5pb24gc3RydWN0dXJlLgorKiBJZiB3ZSBsaWtlIGFuIFVuaXQgaW5kZXBlZGVudCBjb25kaXRpb24gd2UgbmVlZGVkIHRvIGRlZmluZSB0aGUgVW5pdCBhdAorKiB0aGUgYXR0cmlidXRlLCB1c2UgQUlETmFtZVVuaXRJZCBpbnN0ZWFkIG9mIEFJRE5hbWUsIHRoZSBzZXJ2ZXIgaGFzIHRvCisqIGNvbnZlcnQgdGhlIHZhbHVlIHRvIHRoZSBwcm9wZXIgYXR0cmlidXRlIHZhbHVlLiBUaGUgYXR0cmlidXRlIHNlYXJjaAorKiBjb25kaXRpb24gY2FuIGJlIGNvbWJpbmVkIGJ5IG9wZXJhdGlvbnMgZGVmaW5lZCBpbiB0aGUgZW51bWVyYXRpb24KKyogU2VsT3BlcmF0b3IuIEEgcXVlcnkgY2FuIGJlIGJ1aWx0IHdpdGggYSBzZXF1ZW5jZSBTZWxWYWx1ZSBhbmQKKyogU2VsT3BlcmF0b3IuCisqIAorKiBIb3cgdG8gcmVhZC93cml0ZSB0aGUgcXVlcnk6CisqIAorKiBlLmcuICBTZWxWYWx1ZTEgQU5EIFNlbFZhbHVlMgorKiAgIAorKiAgICAgICAgICBzZWxWYWx1ZVNlcSAgICA9IFNlbFZhbHVlMSwgU2VsVmFsdWUyCisqICAgICAgICAgIHNlbE9QZXJhdG9yU2VxID0gQU5EICAKKyogCisqIGUuZy4gIChTZWxWYWx1ZTEgQU5EIFNlbFZhbHVlMikgT1IgU2VsVmFsdWUzIAorKiAgICAKKyogICAgICAgICAgc2VsVmFsdWVTZXEgICAgPSBTZWxWYWx1ZTEsIFNlbFZhbHVlMiwgU2VsVmFsdWUzCisqICAgICAgICAgIHNlbE9QZXJhdG9yU2VxID0gT1BFTiwgQU5ELCBDTE9TRSwgT1IKKyogICAgCisqIGUuZy4gIE5PVChTZWxWYWx1ZTEgQU5EIFNlbFZhbHVlMikgT1IgU2VsVmFsdWUzIAorKiAgICAKKyogICAgICAgICAgc2VsVmFsdWVTZXEgICAgPSBTZWxWYWx1ZTEsIFNlbFZhbHVlMiwgU2VsVmFsdWUzCisqICAgICAgICAgIHNlbE9QZXJhdG9yU2VxID0gTk9ULCBPUEVOLCBBTkQsIENMT1NFLCBPUgorKiAgICAKKyogIGUuZy4gIE5PVChTZWxWYWx1ZTEpIEFORCBTZWxWYWx1ZTIgT1IgU2VsVmFsdWUzIAorKiAgICAKKyogICAgICAgICAgc2VsVmFsdWVTZXEgICAgPSBTZWxWYWx1ZTEsIFNlbFZhbHVlMiwgU2VsVmFsdWUzCisqICAgICAgICAgIHNlbE9QZXJhdG9yU2VxID0gTk9ULCBBTkQsIE9SCisqIAorKiBUaGVyZSBpcyBubyBzZWxlY3Rpb24gYWJvdXQgdGhlIE46TSByZWxhdGlvbnMuCisqICAKKyogVGhlcmUgYXJlIG5vIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgKE1BWCwgTUlOLCBDT1VOVCBldGMuKSBkZWZpbmVkIHNvIHdlCisqIG5lZWQgbm8gImdyb3VwIGJ5IiBhbmQgImhhdmluZyIgQ2xhdXNlLiBBbGwgdGhlIHBhcnRzIGRlZmluZWQgaW4gdGhlCisqICJoYXZpbmciLWNsYXVzZSBjYW4gYmUgZGVmaW5lZCBpbiB0aGUgc2VsZWN0IHBhcnQuCisqLworc3RydWN0IFF1ZXJ5U3RydWN0dXJlIHsKKyAgIEFJRE5hbWVVbml0SWRTZXF1ZW5jZSBhbnVTZXE7ICAvLyBUaGUgc2VxdWVuY2Ugb2YgYXR0cmlidXRlcyB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkLiBBIHBhdHRlcm4gaXMgYWNjZXB0ZWQgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBuYW1lLiAgICBBdCB0aGUgUlBDIEFQSSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbElkIGFuZCBudVNlcSBvZiB0aGUgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0VmFsUmVxIGFuZCB0aGUgcmVxdWVzdCBBT1BfR2V0VmFsLiBBdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBSUEMgQVBJIG9ubHkgb25lIGFwcGxpY2F0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZSBzZWxlY3RlZC4KKyAgIFNlbFZhbHVlU2VxdWVuY2UgICAgICBjb25kU2VxOyAvLyBUaGUgcXVlcnkgY29uZGl0aW9uIHNlcXVlbmNlLiAgICAgQXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmllbGQgbnNTZXEgb2YgdGhlIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldFZhbFJlcSBhbmQgdGhlIHJlcXVlc3QgQU9QX0dldFZhbC4KKyAgIFNlbE9wZXJhdG9yU2VxdWVuY2UgICBvcGVyU2VxOyAvLyBUaGUgcXVlcnkgY29uZGl0aW9uIG9wZXJhdG9yIHNlcXVlbmNlLiAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBBdCB0aGUgUlBDIEFQSSB3YXMgdGhlIG9wZXJhdG9yIGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdBTkQnLgorICAgRWxlbUlkICAgICAgICAgICAgICAgIHJlbEluc3Q7IC8vIFRoZSByZWxhdGVkIGluc3RhbmNlLiAoYWlkID09IDAgJiYgaWlkID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCkgbWVhbnMgbm8gcmVsYXRlZCBpbnN0YW5jZSBzcGVjaWZpZWQuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgc3RvcmVkIGluIHRoZSBmaWVsZCBlbGVtSWQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlIEdldFZhbFJlcSBhbmQgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBT1BfR2V0VmFsLgorICAgTmFtZSAgICAgICAgICAgICAgICAgIHJlbE5hbWU7IC8vIE5hbWUgb2YgdGhlIHJlbGF0aW9uLiAgICAgQXQgdGhlIFJQQyBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4gdGhlIGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmTmFtZSBvZiB0aGUgc3RydWN0dXJlIEdldFZhbFJlcSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBBT1BfR2V0VmFsLgorICAgU2VsT3JkZXJTZXF1ZW5jZSAgICAgIG9yZGVyQnk7IC8vIFRoZSBvcmRlciBieSBzZXF1ZW5jZS4gVGhlIG9yZGVyIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBzZXQuICAgICBBdCB0aGUgUlBDIEFQSSBpdCB3YXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2lhYmxlIHRvIHNldCB0aGUgb3JkZXIuCit9OworCisvKioKKyogUmVzdHVsdCBzZXQgb2Ygb25lIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisqLworc3RydWN0IEVsZW1SZXN1bHRTZXRFeHQgeworICAgVF9MT05HTE9ORyAgICAgICAgICAgICAgICAgYWlkOyAgICAvLyBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBJZC4KKyAgIE5hbWVWYWx1ZVNlcVVuaXRJZFNlcXVlbmNlIHZhbHVlczsgLy8gVGhlIGF0dHJpYnV0ZSB2YWx1ZXMgb2YgdGhlIGluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gZWxlbWVudC4KK307CisKKy8qKgorKiBUaGUgZXh0ZW5kZWQgcXVlcnkgc3RydWN0dXJlLgorKi8KK3N0cnVjdCBRdWVyeVN0cnVjdHVyZUV4dCB7CisgICBTZWxBSUROYW1lVW5pdElkU2VxdWVuY2UgYW51U2VxOyAgLy8gVGhlIHNlcXVlbmNlIG9mIGF0dHJpYnV0ZXMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZC4gQSBwYXR0ZXJuIGlzIGFjY2VwdGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhdHRyaWJ1dGUgbmFtZS4gICAgQXQgdGhlIFJQQyBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGRzIGFwcGxJZCBhbmQgbnVTZXEgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlIEdldFZhbFJlcSBhbmQgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBT1BfR2V0VmFsLiBBdCB0aGUgUlBDIEFQSSBvbmx5IG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGVsZW1lbnQgY291bGQgYmUgc2VsZWN0ZWQuCisgICBTZWxJdGVtU2VxdWVuY2UgICAgICAgICAgY29uZFNlcTsgLy8gVGhlIHF1ZXJ5IGNvbmRpdGlvbiBzZXF1ZW5jZS4gICAgIEF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFJQQyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZWQgaW4gdGhlIGZpZWxkIG5zU2VxIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZSBHZXRWYWxSZXEgYW5kIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQU9QX0dldFZhbC4KKyAgIEpvaW5EZWZTZXF1ZW5jZSAgICAgICAgICBqb2luU2VxOyAvLyBEZWZpbmVkIHRoZSBqb2luIGJldHdlZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gZWxlbWVudHMuCisgICBTZWxPcmRlclNlcXVlbmNlICAgICAgICAgb3JkZXJCeTsgLy8gVGhlIG9yZGVyIGJ5IHNlcXVlbmNlLiBUaGUgb3JkZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdWx0IHNldC4gICAgIEF0IHRoZSBSUEMgQVBJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIGl0IHdhcyBub3QgcG9zc2lhYmxlIHRvIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRlci4KKyAgIEFJRE5hbWVTZXF1ZW5jZSAgICAgICAgICBncm91cEJ5OyAvLyBEZWZpbmVzIHRoZSBncm91cGluZyBhdHRyaWJ1dGVzIGZvciBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCwgbmVjZXNzYXJ5IGlmIGFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWxBSUROYW1lVW5pdElkU2VxdWVuY2UuCit9OworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxOYW1lVmFsdWU+IE5hbWVWYWx1ZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxOYW1lVmFsdWVVbml0PiBOYW1lVmFsdWVVbml0U2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEF0dHJSZXN1bHRTZXQ+IEF0dHJSZXN1bHRTZXRTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8RWxlbVJlc3VsdFNldEV4dD4gRWxlbVJlc3VsdFNldEV4dFNlcXVlbmNlOworCisvKioKKyogVGhlIHJlc3VsdCBzZXQgZm9yIG9uZSBlbGVtZW50LiBUaGUgcmVzdWx0IHNldCBmb3IgYWxsIGVsZW1lbnRzIGFyZQorKiBnaXZlbiBpbiB0aGUgc2VxdWVuY2Ugb2YgdGhlIHJlc3VsdCBzZXQuCisqLworc3RydWN0IEVsZW1SZXN1bHRTZXQgeworICAgVF9MT05HTE9ORyAgICAgICAgICAgIGFpZDsgICAgICAgIC8vIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgIEF0dHJSZXN1bHRTZXRTZXF1ZW5jZSBhdHRyVmFsdWVzOyAvLyBUaGUgc2VsZWN0ZWQgYXR0cmlidXRlcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50LiBUaGUgbnVtYmVyIG9mIHZhbHVlcyBpbiBlYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0clJlc3VsdFNldCBhcmUgaWRlbnRpY2FsLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIG9mIG9uZSBlbGVtZW50IGhhcyBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gaW4gdGhlIEF0dHJSZXN1bHRTZXQuCit9OworCisvKioKKyogVGhlIFJlc3VsdCBzZXQgb2YgdGhlIGV4dGVuZGVkIHF1ZXJ5LiBUaGUgaXRlcmF0b3IgaXMgZm9yIGluc3RhbmNlCisqIG9yaWVudGVkIGFjY2Vzcy4KKyovCitzdHJ1Y3QgUmVzdWx0U2V0RXh0IHsKKyAgIEVsZW1SZXN1bHRTZXRFeHRTZXF1ZW5jZSAgICBmaXJzdEVsZW1zOyAvLyBUaGUgc2VxdWVuY2Ugb2YgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG93X21hbnkgcmVzdWx0IGVsZW1lbnRzLgorICAgRWxlbVJlc3VsdFNldEV4dFNlcUl0ZXJhdG9yIHJlc3RFbGVtczsgIC8vIHRoZSBpdGVyYXRvciwgd2hpY2ggYWxsb3dzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBhYm92ZSB0aGUgcmVzdWx0IHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlcyBvZiBvbmUgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIGl0ZXJhdGlvbi4KK307CisKKy8vIFNlcXVlbmNlIGRlZmluaXRpb25zIChTX3h4eCkuCit0eXBlZGVmIHNlcXVlbmNlPEVsZW1SZXN1bHRTZXQ+IEVsZW1SZXN1bHRTZXRTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8UmVzdWx0U2V0RXh0PiBSZXN1bHRTZXRFeHRTZXF1ZW5jZTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBxdWVyeSByZXN1bHQgdHlwZXMuCisqLworaW50ZXJmYWNlIFJlc3VsdFR5cGUgeworICAgY29uc3QgVF9TSE9SVCBJTlNURUxFTV9JVEVSQVRPUl9BU19SRVNVTFQgPSAwOyAvLyBJdGVyYXRvciBvZiBpbnN0YW5jZSBlbGVtZW50cyBhcyByZXN1bHQgb2YgdGhlIHF1ZXJ5ICh0aGUgZGVmYXVsdCkuCisgICBjb25zdCBUX1NIT1JUIFRBQkxFX0lURVJBVE9SX0FTX1JFU1VMVCA9IDE7ICAgIC8vIEl0ZXJhdG9yIGZvciB0YWJsZSBhY2Nlc3MgYXMgcmVzdWx0IHR5cGUgb2YgdGhlIHF1ZXJ5LgorICAgY29uc3QgVF9TSE9SVCBUQUJMRV9BU19SRVNVTFQgPSAyOyAgICAgICAgICAgICAvLyBUYWJsZSBhcyByZXN1bHQgdHlwZSBvZiB0aGUgcXVlcnkuCit9OworCisvKioKKyogVGhlIGxvY2sgbW9kZSBvZiB0aGUgc2VydmVyLiBUaGUgbG9jayBtb2RlIHRlbGxzIHRoZSB3YXkgdGhlIHNlcnZlcgorKiB3aWxsIGxvY2sgdGhlIG9iamVjdHMgYXMgc29vbiBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgc2VydmVyIHdpbGwgYmUKKyogZG9uZS4KKyovCitpbnRlcmZhY2UgTG9ja01vZGUgeworICAgY29uc3QgVF9TSE9SVCBMT0NLX0lOU1RBTkNFRUxFTUVOVCA9IDA7ICAgIC8vIExvY2sgdGhlIGluc3RhbmNlIGVsZW1lbnQuIChEZWZhdWx0IExvY2tNb2RlKQorICAgY29uc3QgVF9TSE9SVCBMT0NLX0FQUExJQ0FUSU9ORUxFTUVOVCA9IDE7IC8vIExvY2sgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQsIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgYXJlIGxvY2tlZC4KKyAgIGNvbnN0IFRfU0hPUlQgTE9DS19DSElMRFJFTiA9IDI7ICAgICAgICAgICAvLyBMb2NrIHRoZSBjaGlsZHJlbiBvZiB0aGUgbG9ja2VkIG9iamVjdC4gVGhpcyBtb2RlIGNhbiBiZSBjb21iaW5lZCB3aXRoIG9uZSBvZiB0aGUgdXBwZXIgdHdvIG1vZGkuCit9OworCisvKioKKyogVGhlIGJpdHMgb2YgdGhlIHNlY3VyaXR5IHJpZ2h0cy4KKyovCitpbnRlcmZhY2UgU2VjdXJpdHlSaWdodHMgeworICAgY29uc3QgVF9MT05HIFNFQ19SRUFEID0gMTsgICAvLyBSZWFkIGFjY2VzcyBpcyBhbGxvd2VkLgorICAgY29uc3QgVF9MT05HIFNFQ19VUERBVEUgPSAyOyAvLyBVcGRhdGUgYWNjZXNzIHRvIGFuIGV4aXN0aW5nIG9iamVjdCBpcyBhbGxvd2VkLgorICAgY29uc3QgVF9MT05HIFNFQ19JTlNFUlQgPSA0OyAvLyBDcmVhdGluZyBuZXcgaW5zdGFuY2VzIGlzIGFsbG93ZWQuCisgICBjb25zdCBUX0xPTkcgU0VDX0RFTEVURSA9IDg7IC8vIERlbGV0ZSBvZiB0aGUgb2JqZWN0IGlzIGFsbG93ZWQuCisgICBjb25zdCBUX0xPTkcgU0VDX0dSQU5UID0gMTY7ICAvLyBBY2Nlc3MgcmlnaHRzIG1heSBiZSBwYXNzZWQgb24uCit9OworCisvKioKKyogVGhlIHNlY3VyaXR5IGxldmVsIG9mIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisqLworaW50ZXJmYWNlIFNlY3VyaXR5TGV2ZWwgeworICAgY29uc3QgVF9MT05HIE5PX1NFQ1VSSVRZID0gMDsgICAgICAgIC8vIE5vIHNlY3VyaXR5IGRlZmluZWQuCisgICBjb25zdCBUX0xPTkcgRUxFTUVOVF9TRUNVUklUWSA9IDE7ICAgLy8gU2VjdXJpdHkgc2NhbGVkIGZvciB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgIGNvbnN0IFRfTE9ORyBJTlNUQU5DRV9TRUNVUklUWSA9IDI7ICAvLyBTZWN1cml0eSBzY2FsZWQgZm9yIGluc3RhbmNlIGVsZW1lbnRzLgorICAgY29uc3QgVF9MT05HIEFUVFJJQlVURV9TRUNVUklUWSA9IDQ7IC8vIFNlY3VyaXR5IHNjYWxlZCBmb3IgYXBwbGlhdGlvbiBhdHRyaWJ1dGVzLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBxdWVyeSBjb25zdGFudHMuCisqLworaW50ZXJmYWNlIFF1ZXJ5Q29uc3RhbnRzIHsKKyAgIGNvbnN0IFRfTE9ORyBNYXhEdXJhdGlvbkRFRkFVTFQgPSAwOyAgICAgLy8gRGVmYXVsdCB2YWx1ZSBvZiBtYXggZHVyYXRpb24gcGFyYW1ldGVyIG9mIHRoZSBxdWVyeSAgKG5vIGxpbWl0YXRpb25zKS4KKyAgIGNvbnN0IFRfU1RSSU5HIE1heER1cmF0aW9uID0gIk1heER1cmF0aW9uIjsgICAgICAgICAgICAvLyBUaGUgQVNBTSBPRFMgbWF4IGR1cmF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcXVlcnkuCisgICBjb25zdCBUX1NUUklORyBRdWVyeVJlc3VsdFR5cGUgPSAiUXVlcnlSZXN1bHRUeXBlIjsgICAgICAgIC8vIFRoZSBBU0FNIE9EUyBxdWVyeSByZXN1bHQgdHlwZSBwYXJhbWV0ZXIuCisgICBjb25zdCBUX0xPTkcgUXVlcnlSZXN1bHRUeXBlREVGQVVMVCA9IFJlc3VsdFR5cGU6OklOU1RFTEVNX0lURVJBVE9SX0FTX1JFU1VMVDsgLy8gRGVmYXVsdCB2YWx1ZSBvZiB0aGUgQVNBTSBPRFMgcXVlcnkgcmVzdWx0IHR5cGUgcGFyYW1ldGVyLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBleGNlcHRpb24gc3RydWN0dXJlLgorKi8KK2V4Y2VwdGlvbiBBb0V4Y2VwdGlvbiB7CisgICBFcnJvckNvZGUgICAgZXJyQ29kZTsKKyAgIFNldmVyaXR5RmxhZyBzZXZGbGFnOworICAgVF9MT05HICAgICAgIG1pbm9yQ29kZTsKKyAgIFRfU1RSSU5HICAgICByZWFzb247Cit9OworCisvKioKKyogVGhlIEFTQU0gZmFjdG9yeSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEFvRmFjdG9yeSB7CisKKyAgIC8qKiAoMjAwMSkKKyAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4gSWYgdGhlIGRlc2NyaXB0aW9uIGlzCisgICAqIG5vdCBhdmFpbGFibGUgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGFuZCBubyBleGNlcHRpb24gaXMKKyAgICogdGhyb3duLiBUaGUgc2VydmVyIGxvYWRzIHRoZSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBiYXNlIGF0dHJpYnV0ZQorICAgKiAiZGVzY3JpcHRpb24iIG9mIHRoZSBpbnN0YW5jZSBvZiBBb0Vudmlyb25tZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4KKyAgICovCisgICBUX1NUUklORyBnZXREZXNjcmlwdGlvbigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMDAyKQorICAgKiBHZXQgdGhlIGludGVyZmFjZSB2ZXJzaW9uIG9mIHRoZSBBU0FNIE9EUyBmYWN0b3J5LiBUaGUgaW50ZXJmYWNlCisgICAqIHZlcnNpb24gaXMgZm9yIGVhY2ggT0RTIHZlcnNpb24gYSBmaXhlZCBzdHJpbmcuIFRoZSBzdHJpbmcgaXMgdGhlCisgICAqIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBhdCB0aGUgc2VydmVyLiAKKyAgICogCisgICAqIFRoZSBmb3JtYXQgb2YgdGhlIHN0cmluZyBpczoKKyAgICogVjxNYWpvciBWZXJzaW9uIE5yPi48TWlub3IgVmVyc2lvbiBOcj4uPFJldmlzaW9uIE5yPgorICAgKiAgIC0gTWFqb3IgVmVyc2lvbiBOciAobnVtZXJpYzogWzAtOV0rKQorICAgKiAgIC0gTWlub3IgVmVyc2lvbiBOciAobnVtZXJpYzogWzAtOV0rKQorICAgKiAgIC0gUmV2aXNpb24gTnIgKG51bWVyaWM6IFswLTldKykKKyAgICogRXhhbXBsZSBvZiB0aGUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGlzICdWNS4xLjAnLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnRlcmZhY2UgdmVyc2lvbiBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4KKyAgICovCisgICBUX1NUUklORyBnZXRJbnRlcmZhY2VWZXJzaW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDMpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4gSWYgdGhlIG5hbWUgaXMgbm90IGF2YWlsYWJsZQorICAgKiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIEFTQU0gT0RTIGZhY3RvcnkuCisgICAqLworICAgVF9TVFJJTkcgZ2V0TmFtZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMDA0KQorICAgKiBHZXQgdGhlIHR5cGUgb2YgdGhlIEFTQU0gT0RTIGZhY3RvcnkuIElmIHRoZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUKKyAgICogYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGFuZCBubyBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgc2VydmVyCisgICAqIGxvYWRzIHRoZSB0eXBlIGZyb20gdGhlIGJhc2UgYXR0cmlidXRlICJBcHBsaWNhdGlvbl9tb2RlbF90eXBlIiBvZgorICAgKiB0aGUgaW5zdGFuY2Ugb2YgQW9FbnZpcm9ubWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdHlwZSBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4KKyAgICovCisgICBUX1NUUklORyBnZXRUeXBlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDUpCisgICAqIEVzdGFibGlzaCBhIG5ldyBzZXNzaW9uIHRvIGFuIEFTQU0gT0RTIHNlcnZlci4gVGhlIHNlcnZlciBub3JtYWxseQorICAgKiBjaGVja3MgdGhlIGFjdGl2aXR5IG9mIHRoZSBzZXNzaW9uIGFuZCB3aWxsIGNsb3NlIHRoZSBzZXNzaW9uIGFmdGVyCisgICAqIGEgdGltZSBwZXJpb2Qgb2YgaW5hY3Rpdml0eS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RfRkFJTEVECisgICAqICAgIEFPX0NPTk5FQ1RfUkVGVVNFRAorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX09QRU5fTU9ERV9OT1RfU1VQUE9SVEVECisgICAqICAgIEFPX1NFU1NJT05fTElNSVRfUkVBQ0hFRAorICAgKgorICAgKiBAcGFyYW0gIGF1dGggIEEgc3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uCisgICAqICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisgICAqICAgICAgICAgICAgICAgICAgVVNFUgorICAgKiAgICAgICAgICAgICAgICAgIFBBU1NXT1JECisgICAqICAgICAgICAgICAgICAgICAgQ1JFQVRFX0NPU0VTU0lPTl9BTExPV0VECisgICAqICAgICAgICAgICAgICAgICAgRk9SX1VTRVIKKyAgICogICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBtYXkgYmUgc3BlY2lmaWVkIGluIGFueSBvcmRlciBhbmQgaGF2ZSB0bworICAgKiAgICAgICAgICAgICAgIGJlIHNlcGFyYXRlZCBieSBjb21tYS4KKyAgICogICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgQ1JFQVRFX0NPU0VTU0lPTl9BTExPV0VECisgICAqICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAoRFRfU1RSSU5HKSBUUlVFIG9yIEZBTFNFCisgICAqICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGZvciBDUkVBVEVfQ09TRVNTSU9OX0FMTE9XRUQgPQorICAgKiAgICAgICAgICAgICAgIEZBTFNFLgorICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgQ1JFQVRFX0NPU0VTU0lPTl9BTExPV0VEIGlzIGEKKyAgICogICAgICAgICAgICAgICByZWFkLW9ubHkgdmFyaWFibGUgaW4gdGhlIHNlc3Npb24uCisgICAqICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIEZPUl9VU0VSIGlzIHRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvcgorICAgKiAgICAgICAgICAgICAgIHdoaWNoIHRoaXMgc2Vzc2lvbiBzaGFsbCBiZSBjcmVhdGVkLiBJZiB0aGlzIHZhbHVlIGlzCisgICAqICAgICAgICAgICAgICAgZ2l2ZW4sIFVTRVIgbXVzdCBiZSBhIHN1cGVydXNlci4gT3RoZXJ3aXNlIHRoZQorICAgKiAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBBT19DT05ORUNUX1JFRlVTRUQgd2lsbCBiZSB0aHJvd24uCisgICAqICAgICAgICAgICAgICAgRXhhbXBsZToKKyAgICogICAgICAgICAgICAgICAiVVNFUj1oYW5zLCBQQVNTV09SRD1zZWNyZXQsIENSRUFURV9DT1NFU1NJT05fQUxMT1dFRAorICAgKiAgICAgICAgICAgICAgID0gVFJVRSIKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5ldyBjcmVhdGVkIEFTQU0gT0RTIHNlc3Npb24uCisgICAqLworICAgQW9TZXNzaW9uIG5ld1Nlc3Npb24oCisgICAgICBpbiBUX1NUUklORyBhdXRoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjAwNikKKyAgICogRXN0YWJsaXNoIGEgbmV3IHNlc3Npb24gdG8gYW4gQVNBTSBPRFMgc2VydmVyLiBUaGUgc2VydmVyIG5vcm1hbGx5CisgICAqIGNoZWNrcyB0aGUgYWN0aXZpdHkgb2YgdGhlIHNlc3Npb24gYW5kIHdpbGwgY2xvc2UgdGhlIHNlc3Npb24gYWZ0ZXIKKyAgICogYSB0aW1lIHBlcmlvZCBvZiBpbmFjdGl2aXR5LiBUaGUgYXV0aGVudGljYXRpb24gaXMgYSBsaXN0IG9mCisgICAqIE5hbWVWYWx1ZSB3aGljaCBpcyBhbiBhcmd1bWVudCBvZiB0aGUgbWV0aG9kLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVF9GQUlMRUQKKyAgICogICAgQU9fQ09OTkVDVF9SRUZVU0VECisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fT1BFTl9NT0RFX05PVF9TVVBQT1JURUQKKyAgICogICAgQU9fU0VTU0lPTl9MSU1JVF9SRUFDSEVECisgICAqCisgICAqIEBwYXJhbSAgYXV0aCAgQSBsaXN0IG9mIE5hbWVWYWx1ZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUKKyAgICogICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiwgdGhlIHBhcmFtZXRlciBpcyBzdG9yZWQgaW4gdGhlIE5hbWUgb2YKKyAgICogICAgICAgICAgICAgICB0aGUgTmFtZVZhbHVlIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGFwcmFtZXRlciBpcyBzdG9yZWQKKyAgICogICAgICAgICAgICAgICBpbiB0aGUgVmFsdWUuIEVhY2ggZW50cnkgaW4gdGhlIGxpc3QgcmVwcmVzZW50IGV4YWN0CisgICAqICAgICAgICAgICAgICAgb25lIHBhcmFtZXRlci4gV2l0aCB0aGlzIGFyZ3VtZW50IHRoZSB2YWx1ZXMgb2YgdGhlCisgICAqICAgICAgICAgICAgICAgcGFyYW1ldGVycyBjYW4gY29udGFpbiBhbHNvIGNvbW1hIGJlY2F1c2UgdGhlc2UgYXJlCisgICAqICAgICAgICAgICAgICAgbm90IHVzZWQgYXMgc2VwYXJhdGVyLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGNyZWF0ZWQgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICovCisgICBBb1Nlc3Npb24gbmV3U2Vzc2lvbk5hbWVWYWx1ZSgKKyAgICAgIGluIE5hbWVWYWx1ZVNlcXVlbmNlIGF1dGgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEFvRmFjdG9yeS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBzZXNzaW9uIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgQW9TZXNzaW9uIHsKKworICAgLyoqICgzMDAxKQorICAgKiBBYm9ydCAocm9sbGJhY2spIGEgdHJhbnNhY3Rpb24uIFRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhlIHRyYW5zYWN0aW9uCisgICAqIGFyZSBsb3N0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBhYm9ydFRyYW5zYWN0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDIpCisgICAqIENsb3NlIHNlc3Npb24gdG8gYW4gQVNBTSBPRFMgc2VydmVyLiBBY3RpdmUgdHJhbnNhY3Rpb25zIGFyZQorICAgKiBjb21taXR0ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgY2xvc2UoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAwMykKKyAgICogQ29tbWl0IGEgdHJhbnNhY3Rpb24uIFRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhlIHRyYW5zYWN0aW9uIGJlY29tZQorICAgKiBwZXJtYW5lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIGNvbW1pdFRyYW5zYWN0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDQpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gbW9kZWwgZnJvbSB0aGUgY3VycmVudCBzZXNzaW9uIGJ5IHJldHVybmluZyBhbgorICAgKiBvYmplY3Qgd2l0aCB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uU3RydWN0dXJlLiBUaGUgY29tcGxldGUKKyAgICogaW5mb3JtYXRpb24gb24gdGhlIGFwcGxpY2F0aW9uIG1vZGVsIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoYXQKKyAgICogaW50ZXJmYWNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXBwbGljYXRpb24gc3RydWN0dXJlLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uU3RydWN0dXJlIGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDUpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gbW9kZWwgYXMgdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIHN0cnVjdHVyZSBhcyB2YWx1ZS4KKyAgICovCisgICBBcHBsaWNhdGlvblN0cnVjdHVyZVZhbHVlIGdldEFwcGxpY2F0aW9uU3RydWN0dXJlVmFsdWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAwNikKKyAgICogR2V0IHRoZSBBU0FNIE9EUyBiYXNlIG1vZGVsIGZyb20gdGhlIGN1cnJlbnQgc2Vzc2lvbiBieSByZXR1cm5pbmcgYW4KKyAgICogb2JqZWN0IHdpdGggdGhlIGludGVyZmFjZSBCYXNlU3RydWN0dXJlLiBUaGUgY29tcGxldGUgaW5mb3JtYXRpb24gb24KKyAgICogdGhlIGJhc2UgbW9kZWwgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhhdCBpbnRlcmZhY2U7IGl0IGluY2x1ZGVzIGFsbAorICAgKiBwb3NzaWJsZSBiYXNlIGVsZW1lbnRzIHdpdGggYWxsIHBvc3NpYmxlIGJhc2UgYXR0cmlidXRlcyBhcworICAgKiBzcGVjaWZpZWQgYnkgQVNBTSBPRFMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmFzZSBzdHJ1Y3R1cmUuCisgICAqLworICAgQmFzZVN0cnVjdHVyZSBnZXRCYXNlU3RydWN0dXJlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDcpCisgICAqIEdldCBjb250ZXh0IHZhcmlhYmxlcyBmcm9tIHRoZSBzZXNzaW9uLiBBIHBhdHRlcm4gc3RyaW5nIGNhbiBiZQorICAgKiBzcGVjaWZpZWQgdG8gc2VsZWN0IGdyb3VwcyBvZiB2YXJpYWJsZXMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhclBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIGNvbnRleHQKKyAgICogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZShzKS4KKyAgICoKKyAgICogQHJldHVybiAgQSBsaXN0IG9mIGNvbnRleHQgdmFyaWFibGVzLgorICAgKi8KKyAgIE5hbWVWYWx1ZUl0ZXJhdG9yIGdldENvbnRleHQoCisgICAgICBpbiBQYXR0ZXJuIHZhclBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDA4KQorICAgKiBHZXQgYSBjb250ZXh0IHZhcmlhYmxlIGJ5IGl0cyBuYW1lIGZyb20gdGhlIHNlc3Npb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhck5hbWUgIFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgY29udGV4dCB2YXJpYWJsZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBjb250ZXh0IHZhcmlhYmxlLgorICAgKi8KKyAgIE5hbWVWYWx1ZSBnZXRDb250ZXh0QnlOYW1lKAorICAgICAgaW4gTmFtZSB2YXJOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAwOSkKKyAgICogTGlzdCB0aGUgbmFtZXMgb2YgY29udGV4dCB2YXJpYWJsZXMgZnJvbSB0aGUgc2Vzc2lvbi4gQSBwYXR0ZXJuCisgICAqIHN0cmluZyBjYW4gYmUgc3BlY2lmaWVkIHRvIHNlbGVjdCBncm91cHMgb2YgdmFyaWFibGVzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB2YXJQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSBjb250ZXh0CisgICAqICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUocykuCisgICAqCisgICAqIEByZXR1cm4gIEEgbGlzdCBvZiBjb250ZXh0IHZhcmlhYmxlIG5hbWVzLgorICAgKi8KKyAgIE5hbWVJdGVyYXRvciBsaXN0Q29udGV4dCgKKyAgICAgIGluIFBhdHRlcm4gdmFyUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTApCisgICAqIFJlbW92ZSBjb250ZXh0IHZhcmlhYmxlcyBmcm9tIHRoZSBzZXNzaW9uLiBBIHBhdHRlcm4gc3RyaW5nIGNhbiBiZQorICAgKiBzcGVjaWZpZWQgdG8gcmVtb3ZlIGdyb3VwcyBvZiB2YXJpYWJsZXMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhclBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIGNvbnRleHQKKyAgICogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZShzKSB0byBiZSByZW1vdmVkLgorICAgKi8KKyAgIHZvaWQgcmVtb3ZlQ29udGV4dCgKKyAgICAgIGluIFBhdHRlcm4gdmFyUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTEpCisgICAqIFNldC9tb2RpZnkgYSBrbm93biBjb250ZXh0IHZhcmlhYmxlIG9yIGFkZCBhIG5ldyBjb250ZXh0IHZhcmlhYmxlIHRvCisgICAqIHRoZSBzZXNzaW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGNvbnRleHRWYXJpYWJsZSAgVGhlIGNvbnRleHQgdmFyaWFibGUuCisgICAqLworICAgdm9pZCBzZXRDb250ZXh0KAorICAgICAgaW4gTmFtZVZhbHVlIGNvbnRleHRWYXJpYWJsZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTIpCisgICAqIFNldC9tb2RpZnkgYSBrbm93biBjb250ZXh0IHZhcmlhYmxlIG9yIGFkZCBhIG5ldyBjb250ZXh0IHZhcmlhYmxlIHRvCisgICAqIHRoZSBzZXNzaW9uLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciB0aGUgZnJlcXVlbnRseSB1c2VkCisgICAqIHN0cmluZyB2YXJpYWJsZSB0eXBlLiBJdCB1c2VzIHNldENvbnRleHQgIGludGVybmFsbHkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdmFyTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdmFyaWFibGUuCisgICAqCisgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSB2YWx1ZSBvZiB0aGUgY29udGV4dCB2YXJpYWJsZS4KKyAgICovCisgICB2b2lkIHNldENvbnRleHRTdHJpbmcoCisgICAgICBpbiBOYW1lIHZhck5hbWUsCisgICAgICBpbiBUX1NUUklORyB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTMpCisgICAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24gb24gdGhlIHBoeXNpY2FsIHN0b3JhZ2Ugc3lzdGVtIChlLmcuIGRhdGFiYXNlCisgICAqIHN5c3RlbSkuIE9ubHkgd2hlbiBhIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQgaXQgaXMgYWxsb3dlZCB0byBjcmVhdGUKKyAgICogb3IgbW9kaWZ5IGluc3RhbmNlcyBvciBtZWFzdXJlbWVudCBkYXRhLiBUaGUgY2hhbmdlcyBnZXQgcGVybWFuZW50CisgICAqIHdpdGggYSBjb21taXQgb2YgdGhlIHRyYW5zYWN0aW9uIG9yIHdpbGwgYmUgbG9zdCB3aXRoIGFuIGFib3J0IG9mCisgICAqIHRoZSB0cmFuc2FjdGlvbi4gSWYgdGhlIHNlc3Npb24gaXMgY2xvc2VkIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlCisgICAqIGNvbW1pdHRlZCBhdXRvbWF0aWNhbGx5LiBJZiBhIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgYWN0aXZlIGFuCisgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX0FMUkVBRFlfQUNUSVZFCisgICAqLworICAgdm9pZCBzdGFydFRyYW5zYWN0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTQpCisgICAqIE1ha2UgdGhlIGNoYW5nZXMgcGVybWFuZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBmbHVzaCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDE1KQorICAgKiBFdmVyeSBuZXcgY3JlYXRlZCBpbnN0YW5jZSB3aWxsIHNldCBpdHMgaW5pdGlhbCByaWdodHMgdG8gPGFjbD4gLgorICAgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIGRlZmF1bHQtbWV0aG9kcyBmb3IgYXBwbHlpbmcgaW5pdGlhbAorICAgKiByaWdodHMuIFRoZSBpbml0aWFsIHJpZ2h0cyBhcmUgb25seSB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaXJsRW50cmllcyAgVGhlIGN1cnJlbnQgaW5pdGlhbCByaWdodHMuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBTZXQgKDEpIG9yIHJlbW92ZSAoMCkgdGhlIGN1cnJlbnQgaW5pdGlhbCByaWdodHMuIFRoZQorICAgKiAgICAgICAgICAgICAgcHJldmlvdXMgaW5pdGlhbCByaWdodHMgZ2V0IGxvc3QuIElmIHRoZSBwYXJhbWV0ZXIgc2V0CisgICAqICAgICAgICAgICAgICBpcyAwIChyZW1vdmUpIHRoZSBwYXJhbWV0ZXIgaXJsRW50cmllcyB3aWxsIGJlIGlnbm9yZWQuCisgICAqLworICAgdm9pZCBzZXRDdXJyZW50SW5pdGlhbFJpZ2h0cygKKyAgICAgIGluIEluaXRpYWxSaWdodFNlcXVlbmNlIGlybEVudHJpZXMsCisgICAgICBpbiBUX0JPT0xFQU4gc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAxNikKKyAgICogR2V0IHRoZSBjdXJyZW50IGxvY2sgbW9kZS4gVGhlIGxvY2sgbW9kZSB0ZWxscyB0aGUgc2VydmVyIHdoaWNoCisgICAqIG9iamVjdHMgdG8gbG9jayBmb3IgdXBjb21pbmcgY2hhbmdlcy4gQXBwbGljYXRpb24gZWxlbWVudHMsIGluc3RhbmNlCisgICAqIGVsZW1lbnRzIG9yIGNoaWxkcmVuIG9mIGVsZW1lbnRzIGNhbiBiZSBsb2NrZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGN1cnJlbnQgbG9jayBtb2RlLiBUaGUgbG9jayBtb2RlIGNvbnN0YW50cyBhcmUgZGVmaW5lZAorICAgKiAgICAgICAgICBpbiB0aGUgaW50ZXJmYWNlIExvY2tNb2RlLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24KKyAgICogICAgICAgICAgbGFuZ3VhZ2UgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mCisgICAqICAgICAgICAgIGVudW1lcmF0aW9ucyB0aHVzIHRoZSBjb25zdGFudCBkZWZpbml0aW9ucyBoYWQgdG8gYmUgZG9uZQorICAgKiAgICAgICAgICBpbiBhbiBpbnRlcmZhY2UuCisgICAqLworICAgVF9TSE9SVCBnZXRMb2NrTW9kZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDE3KQorICAgKiBTZXQgdGhlIG5ldyBsb2NrIG1vZGUuIFRoZSBsb2NrIG1vZGUgdGVsbHMgdGhlIHNlcnZlciB3aGljaCBvYmplY3RzCisgICAqIHRvIGxvY2sgZm9yIHVwY29taW5nIGNoYW5nZXMuIEFwcGxpY2F0aW9uIGVsZW1lbnRzLCBpbnN0YW5jZQorICAgKiBlbGVtZW50cyBvciBjaGlsZHJlbiBvZiBlbGVtZW50cyBjYW4gYmUgbG9ja2VkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBsb2NrTW9kZSAgVGhlIG5ldyBsb2NrIG1vZGUuIFRoZSBsb2NrIG1vZGUgY29uc3RhbnRzIGFyZQorICAgKiAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UgTG9ja01vZGUuIFRoZSBpbnRlcmZhY2UKKyAgICogICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBsYW5ndWFnZSBJREwgZG9lcyBub3QgYWxsb3cgdG8gc2V0IHRoZQorICAgKiAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgZW51bWVyYXRpb25zIHRodXMgdGhlIGNvbnN0YW50CisgICAqICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zIGhhZCB0byBiZSBkb25lIGluIGFuIGludGVyZmFjZS4KKyAgICovCisgICB2b2lkIHNldExvY2tNb2RlKAorICAgICAgaW4gVF9TSE9SVCBsb2NrTW9kZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTgpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBhY2Nlc3Mgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgYWNjZXNzIG9iamVjdC4KKyAgICovCisgICBBcHBsRWxlbUFjY2VzcyBnZXRBcHBsRWxlbUFjY2VzcygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDE5KQorICAgKiBDaGFuZ2UgdGhlIHBhc3N3b3JkIGZvciB1c2VyIGRlZmluZWQgYnkgPHVzZXJuYW1lPiB0byA8bmV3UGFzc3dvcmQ+LgorICAgKiBBIG5vcm1hbCB1c2VyIG11c3Qgc3VwcGx5IGhpcyBjdXJyZW50IHBhc3N3b3JkIDxvbGRQYXNzd29yZD4uIFRoZQorICAgKiBzdXBlciB1c2VyIGNhbiBjaGFuZ2UgdGhlIHBhc3N3b3JkIHdpdGhvdXQgc3VwcGx5aW5nIHRoZSBjdXJyZW50CisgICAqIHBhc3N3b3JkIDxvbGRQYXNzd29yZD4uIElmIG5vIHVzZXJuYW1lIGlzIGdpdmVuIHRoZSBwYXNzd29yZCBvZiB0aGUKKyAgICogdXNlciBvZiB0aGUgY3VycmVudCBzZXNzaW9uIHdpbGwgYmUgY2hhbmdlZC4gVGhlIHBhc3N3b3JkIGlzCisgICAqIG5vcm1hbGx5IGVuY3J5cHRlZCBpbiB0aGUgYXR0cmlidXRlIG9mIHRoZSB1c2VyIGluc3RhbmNlIGVsZW1lbnQuCisgICAqIENyZWF0aW5nIGEgbmV3IHVzZXIgY2FuIGJlIGRvbmUgYnkgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UsCisgICAqIGFmdGVyd2FyZHMgdGhlIHBhc3N3b3JkIG11c3QgYmUgc2V0IGJ5IHRoZSBzdXBlciB1c2VyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fV1JPTkdfUEFTU1dPUkQKKyAgICoKKyAgICogQHBhcmFtICB1c2VybmFtZSAgVGhlIG5hbWUgb2YgdGhlIHVzZXIgZm9yIHdoaWNoIHRoZSBwYXNzd29yZCB3aWxsCisgICAqICAgICAgICAgICAgICAgICAgIGJlIGNoYW5nZWQuIElmIG5vIHVzZXJuYW1lIGlzIGdpdmVuIHRoZSBwYXNzd29yZAorICAgKiAgICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCB1c2VyIHdpbGwgYmUgY2hhbmdlZC4gSWYgdGhlCisgICAqICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCB1c2VyIHRoZSBjdXJyZW50CisgICAqICAgICAgICAgICAgICAgICAgIHVzZXIgbXVzdCBiZSBhIHN1cGVyIHVzZXIuCisgICAqCisgICAqIEBwYXJhbSAgb2xkUGFzc3dvcmQgIFRoZSBjdXJyZW50IHBhc3N3b3JkIG9mIHRoZSB1c2VyLiBBIG5vcm1hbCB1c2VyCisgICAqICAgICAgICAgICAgICAgICAgICAgIG11c3Qgc3VwcGx5IGhpcyBjdXJyZW50IHBhc3N3b3JkLiBUaGUgc3VwZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgdXNlciBjYW4gY2hhbmdlIHRoZSBwYXNzd29yZCB3aXRob3V0IHN1cHBseWluZworICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBwYXNzd29yZC4KKyAgICoKKyAgICogQHBhcmFtICBuZXdQYXNzd29yZCAgVGhlIG5ldyBwYXNzd29yZCBvZiB0aGUgdXNlci4KKyAgICovCisgICB2b2lkIHNldFBhc3N3b3JkKAorICAgICAgaW4gVF9TVFJJTkcgdXNlcm5hbWUsCisgICAgICBpbiBUX1NUUklORyBvbGRQYXNzd29yZCwKKyAgICAgIGluIFRfU1RSSU5HIG5ld1Bhc3N3b3JkKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyMCkKKyAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgKiBzZXNzaW9uIGlzIGlkZW50aWNhbCB3aXRoIGRlc2NyaXB0aW9uIG9mIHRoZSBBU0FNIE9EUyBmYWN0b3J5LiBJZgorICAgKiB0aGUgZGVzY3JpcHRpb24gaXMgbm90IGF2YWlsYWJsZSBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgYW5kIG5vCisgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBzZXJ2ZXIgbG9hZHMgdGhlIGRlc2NyaXB0aW9uIGZyb20gdGhlIGJhc2UKKyAgICogYXR0cmlidXRlICJkZXNjcmlwdGlvbiIgb2YgdGhlIGluc3RhbmNlIG9mIEFvRW52aXJvbm1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAqLworICAgVF9TVFJJTkcgZ2V0RGVzY3JpcHRpb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyMSkKKyAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBBU0FNIE9EUyBzZXNzaW9uLiBUaGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBpcworICAgKiBpZGVudGljYWwgd2l0aCB0aGUgbmFtZSBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4gSWYgdGhlIG5hbWUgaXMgbm90CisgICAqIGF2YWlsYWJsZSBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqIFRoZSBzZXJ2ZXIgbG9hZHMgdGhlIG5hbWUgZnJvbSB0aGUgYmFzZSBhdHRyaWJ1dGUgIm5hbWUiIG9mIHRoZQorICAgKiBpbnN0YW5jZSBvZiBBb0Vudmlyb25tZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAqLworICAgTmFtZSBnZXROYW1lKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMjIpCisgICAqIEdldCB0aGUgdHlwZSBvZiB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4gVGhlIHR5cGUgb2YgdGhlIHNlc3Npb24gaXMKKyAgICogaWRlbnRpY2FsIHdpdGggdGhlIHR5cGUgb2YgdGhlIEFTQU0gT0RTIGZhY3RvcnkuIElmIHRoZSB0eXBlIGlzIG5vdAorICAgKiBhdmFpbGFibGUgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGFuZCBubyBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKiBUaGUgc2VydmVyIGxvYWRzIHRoZSB0eXBlIGZyb20gdGhlIGJhc2UgYXR0cmlidXRlCisgICAqICJBcHBsaWNhdGlvbl9tb2RlbF90eXBlIiBvZiB0aGUgaW5zdGFuY2Ugb2YgQW9FbnZpcm9ubWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqCisgICAqIEByZXR1cm4gIFRoZSB0eXBlIG9mIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgKi8KKyAgIFRfU1RSSU5HIGdldFR5cGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyMykKKyAgICogQ3JlYXRlIGEgUXVlcnlFdmFsdWF0b3Igb2JqZWN0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXcgY3JlYXRlZCBxdWVyeSBldmFsdWF0b3Igb2JqZWN0CisgICAqLworICAgUXVlcnlFdmFsdWF0b3IgY3JlYXRlUXVlcnlFdmFsdWF0b3IoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyNCkKKyAgICogQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBJbnRlcmZhY2UgQmxvYiBvbiB0aGUgc2VydmVyLiBUaGlzCisgICAqIG9iamVjdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkYXRhIHR5cGUKKyAgICogRFRfQkxPQi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlZmVyZW5jZSBvZiB0aGUgYmxvYiBvYmplY3Qgd2hpY2ggaXMgZ2VuZXJhdGVkIGF0IHRoZQorICAgKiAgICAgICAgICBzZXJ2ZXIuCisgICAqLworICAgQmxvYiBjcmVhdGVCbG9iKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMjUpCisgICAqIENyZWF0ZSBhIGNvIHNlc3Npb24uIFRoZSBjbyBzZXNzaW9uIHNlc3Npb24gaXMgdGhlIHNhbWUgc2Vzc2lvbiBhcworICAgKiB0aGUgb3JpZ2luYWwgc2Vzc2lvbiB3YXMgYXQgbG9naW4gdGltZS4KKyAgICogVGhlIGNvIHNlc3Npb24gaGFzIG5vIHJlbGF0aW9uIHRvIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGV4Y2VwdCB0aGF0CisgICAqIHRoZSBzYW1lIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQuCisgICAqIEEgY2xpZW50IGFwcGxpY2F0aW9uIHdpdGggY29tcG9uZW50cyBjYW4gZ2l2ZSBhbGwgY29tcG9uZW50cyBoaXMgb3duCisgICAqIHNlc3Npb24gdG8gdGhlIEFTQU0gT0RTIFNlcnZlci4gU28gdGhlIGNvbXBvbmVudCBjYW4gY2xvc2UgdGhlCisgICAqIHNlc3Npb24gd2hlbiBpdCBpcyByZWFkeSwgdGhlIGNvbXBvbmVudCBjYW4gc3RhcnQgaGlzIG93bgorICAgKiB0cmFuc2FjdGlvbiB3aXRob3V0IGFueSBjb25mbGljdCB3aXRoIG90aGVyIGNvbXBvbmVudHMuIAorICAgKiBPbmx5IHdoZW4gdGhlIHZhcmlhYmxlIENSRUFURV9DT1NFU1NJT05fQUxMT1dFRD1UUlVFIGlzIGdpdmVuIGluIHRoZQorICAgKiAnYXV0aCcgcGFyYW1ldGVyIG9mIHRoZSBtZXRob2QgbmV3U2Vzc2lvbiBhdCB0aGUgaW50ZXJmYWNlIEFvRmFjdG9yeQorICAgKiBhbiBuZXcgc2Vzc2lvbiB3aWxsIGJlIGNyZWF0ZWQgb3RoZXJ3aXNlIHRoZSBleGNlcHRpb24KKyAgICogQU9fQUNDRVNTX0RFTklFRCBpcyB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGNvIHNlc3Npb24uCisgICAqLworICAgQW9TZXNzaW9uIGNyZWF0ZUNvU2Vzc2lvbigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDI2KQorICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBlbGVtZW50IG9mIHRoZSB1c2VyIGxvZ2dlZCBpbiwgdGhpcyBpcyB0aGUKKyAgICogaW5zdGFuY2UgZWxlbWVudCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGRlcml2ZWQgZnJvbSBBb1VzZXIsCisgICAqIHdpdGggdGhlIG5hbWUgZ2l2ZW4gaW4gcyBnaXZlbiBpbiB0aGUgJ2F1dGgnIHBhcmFtZXRlciBvZiB0aGUgbWV0aG9kCisgICAqIG5ld1Nlc3Npb24gYXQgdGhlIGludGVyZmFjZSBBb0ZhY3RvcnkgKHZhcmlhYmxlIFVTRVIpLiAKKyAgICogCisgICAqIFdoZW4gdGhlIGNsaWVudCBzZXR0aW5ncyBvZiB0aGUgdXNlciBhcmUgc3RvcmVkIGluIHRoZSBBU0FNIE9EUworICAgKiBhcHBsaWNhdGlvbiBtb2RlbCwgdGhpcyBtZXRob2RzIGhlbHBzIHRoZSBjbGllbnQgIHRvIGdldCBoaXMKKyAgICogc2V0dGluZ3MuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnN0YW5jZSBlbGVtZW50IG9mIHRoZSBsb2dnZWQgaW4gdXNlci4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnQgZ2V0VXNlcigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDI3KQorICAgKiBHZXQgdGhlIGxpc3Qgd2l0aCB0aGUgYXR0cmlidXRlcyBvZiBhbGwgZWxlbWVudHMgYW5kIHRoZSBlbnVtZXJhdGlvbgorICAgKiBuYW1lIHdoaWNoIGhhcyBhbiBlbnVtZXJhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbGlzdCB3aXRoIGF0dHJpYnV0ZSBhbmQgdGhlcmUgZW51bWVyYXRpb24uCisgICAqLworICAgRW51bWVyYXRpb25BdHRyaWJ1dGVTdHJ1Y3R1cmVTZXF1ZW5jZSBnZXRFbnVtZXJhdGlvbkF0dHJpYnV0ZXMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyOCkKKyAgICogR2V0IGFsbCBlbnVtZXJhdGlvbnMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24gbW9kZWwuIFRoZSBlbnVtZXJhdGlvbnMKKyAgICogYW5kIGFsbCBpdGVtcyBvZiB0aGUgZW51bWVyYXRpb25zIGFyZSByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGVudW1lcmF0aW9uIHdpdGggdGhlcmUgSXRlbXMuCisgICAqLworICAgRW51bWVyYXRpb25TdHJ1Y3R1cmVTZXF1ZW5jZSBnZXRFbnVtZXJhdGlvblN0cnVjdHVyZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDI5KQorICAgKiBSZXR1cm5zIHRoZSBJZCBvZiB0aGUgc2Vzc2lvbiwgdGhlIE9EUyBzZXJ2ZXIgd2lsbCBnaXZlIGVhY2ggc2Vzc2lvbgorICAgKiBhbiB1bmlxdWUgSWQuIFRoZSBPRFMgc2VydmVyIHJldHVybnMgdGhpcyBJZCB0byB0aGUgY2xpZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgSWQgb2YgdGhlIHNlc3Npb24uCisgICAqLworICAgVF9MT05HIGdldElkKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgQW9TZXNzaW9uLgorCisvKioKKyogVGhlIEFTQU0gT0RTIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEFwcGxpY2F0aW9uQXR0cmlidXRlIHsKKworICAgLyoqICg0MDAxKQorICAgKiBHZXQgdGhlIGJhc2UgYXR0cmlidXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmFzZSBhdHRyaWJ1dGUgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4gQSAnbnVsbCcKKyAgICogICAgICAgICAgaXMgcmV0dXJuZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBoYXMgbm8gYmFzZQorICAgKiAgICAgICAgICBhdHRyaWJ1dGUuCisgICAqLworICAgQmFzZUF0dHJpYnV0ZSBnZXRCYXNlQXR0cmlidXRlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMDIpCisgICAqIEdldCB0aGUgZGF0YSB0eXBlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAwMykKKyAgICogR2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG1heGltdW0gYWxsb3dlZCBsZW5ndGggb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICovCisgICBUX0xPTkcgZ2V0TGVuZ3RoKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMDQpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICovCisgICBOYW1lIGdldE5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAwNSkKKyAgICogR2V0IHRoZSB1bml0IElkIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuIFRoZSB1bml0IElkIGlzIG9ubHkKKyAgICogdmFsaWQgZm9yIHRoZSBjdXJyZW50IHNlcnZlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSB1bml0IElkIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgVF9MT05HTE9ORyBnZXRVbml0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMDYpCisgICAqIEdldCB0aGUgb2JsaWdhdG9yeSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgb2JsaWdhdG9yeSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgVF9CT09MRUFOIGlzT2JsaWdhdG9yeSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg0MDA3KQorICAgKiBHZXQgdGhlIHVuaXF1ZSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdW5pcXVlIGZsYWcgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICovCisgICBUX0JPT0xFQU4gaXNVbmlxdWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAwOCkKKyAgICogU2V0IHRoZSBiYXNlIGF0dHJpYnV0ZSBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLiBUaGlzIGFsbG93cyB0aGUKKyAgICogY2xpZW50IHRvIGRlY2xhcmUgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSAobmV3IG9yIGV4aXN0aW5nKQorICAgKiBhZGRpdGlvbmFsIHRvIGEgYmFzZSBhdHRyaWJ1dGUuIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgd2lsbAorICAgKiBiZWNvbWUgdGhlIGRlcml2ZWQgYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBiYXNlIGF0dHJpYnV0ZS4KKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIGJhc2UgYXR0cmlidXRlIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gZWxlbWVudAorICAgKiBvdGhlcndpc2UgdGhlIGV4Y2VwdGlvbiBBT19EVVBMSUNBVEVfQkFTRV9BVFRSSUJVVEUgaXMgdGhyb3duLgorICAgKiAKKyAgICogRm9yIHBlcmZvcm1hbmNlIGFuZCBmbGV4aWJpbGl0eSByZWFzb25zIHRoaXMgc2V0LW1ldGhvZCBzaG91bGQgYmUKKyAgICogdXNlZCBiZWZvcmUgdGhlIG5ldyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgaXMgY29tbWl0dGVkIHRoZSBmaXJzdAorICAgKiB0aW1lLgorICAgKiAKKyAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgY29tbWl0IGl0IHdpbGwgbm90IHRocm93CisgICAqIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKKyAgICogICAgQU9fSU5WQUxJRF9EQVRBVFlQRQorICAgKiAgICBBT19NSVNTSU5HX1ZBTFVFCisgICAqICAgIEFPX05PVF9VTklRVUUuCisgICAqIAorICAgKiBBZnRlciB0aGUgZmlyc3QgY29tbWl0LCB0aGVyZSBtYXkgYmUgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiBhdHRyaWJ1dGUuIFRoZXNlIGluc3RhbmNlcyBtYXkgY2F1c2UgdGhlIGZvbGxvd2luZyBwcm9ibGVtczoKKyAgICogCisgICAqIEFPX0lOVkFMSURfREFUQVRZUEU6IFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIG5vdCB0aGUKKyAgICogc2FtZSBhcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBpbnN0YW50aWF0ZWQgYXR0cmlidXRlcy4KKyAgICogCisgICAqIEFPX01JU1NJTkdfVkFMVUU6IFRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIHNldAorICAgKiBidXQgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGVtcHR5IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2VzLgorICAgKiAKKyAgICogQU9fTk9UX1VOSVFVRTogVGhlIHVuaXF1ZSBmbGFnIG9mIHRoZSBiYXNlIGF0dHJpYnV0ZSBpcyBzZXQgYnV0IHRoZQorICAgKiB2YWx1ZXMgb2YgdGhlIGluc3RhbmNlcyBhcmUgbm90IHVuaXF1ZS4KKyAgICogCisgICAqIFRoZSBsZW5ndGgsIHRoZSBuYW1lIGFuZCB0aGUgdW5pdCBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlIGFyZQorICAgKiBub3QgYWZmZWN0ZWQgYnkgdGhpcyBjYWxsLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fRFVQTElDQVRFX0JBU0VfQVRUUklCVVRFCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9EQVRBVFlQRQorICAgKiAgICBBT19NSVNTSU5HX1ZBTFVFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT1RfVU5JUVVFCisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBiYXNlQXR0ciAgVGhlIGJhc2UgYXR0cmlidXRlLgorICAgKi8KKyAgIHZvaWQgc2V0QmFzZUF0dHJpYnV0ZSgKKyAgICAgIGluIEJhc2VBdHRyaWJ1dGUgYmFzZUF0dHIpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg0MDA5KQorICAgKiBTZXQgdGhlIGRhdGEgdHlwZSBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogSXQgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSBkYXRhIHR5cGUgb2YgYXBwbGljYXRpb24gYXR0cmlidXRlcworICAgKiB0aGF0IHJlcHJlc2VudCBiYXNlIGF0dHJpYnV0ZXMuIEFuIGF0dGVtcHQgdG8gc2V0IHRoZSBkYXRhIHR5cGUgb2YKKyAgICogc3VjaCBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgd2lsbCByZXN1bHQgaW4gdGhlIGV4Y2VwdGlvbgorICAgKiBBT19JU19CQVNFX0FUVFJJQlVURS4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCBpdCB3aWxsIG5vdCB0aHJvdworICAgKiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKKyAgICogICAgQU9fSU5WQUxJRF9EQVRBVFlQRQorICAgKiAKKyAgICogQWZ0ZXIgdGhlIGZpcnN0IGNvbW1pdCwgdGhlcmUgbWF5IGJlIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlLiBUaGVzZSBpbnN0YW5jZXMgbWF5IGNhdXNlIHRoZSBmb2xsb3dpbmcgcHJvYmxlbToKKyAgICogCisgICAqIEFPX0lOVkFMSURfREFUQVRZUEU6IFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIG5vdCB0aGUKKyAgICogc2FtZSBhcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBpbnN0YW50aWF0ZWQgYXR0cmlidXRlcy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0hBU19CQVNFX0FUVFJJQlVURQorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfREFUQVRZUEUKKyAgICogICAgQU9fSVNfQkFTRV9BVFRSSUJVVEUKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYURhdGFUeXBlICBUaGUgZGF0YSB0eXBlLgorICAgKi8KKyAgIHZvaWQgc2V0RGF0YVR5cGUoCisgICAgICBpbiBEYXRhVHlwZSBhYURhdGFUeXBlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAxMCkKKyAgICogU2V0IHRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogSXQgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlcworICAgKiB0aGF0IHJlcHJlc2VudCBiYXNlIGF0dHJpYnV0ZXMuIEFuIGF0dGVtcHQgdG8gc2V0IHRoZSBvYmxpZ2F0b3J5CisgICAqIGZsYWcgb2Ygc3VjaCBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgd2lsbCByZXN1bHQgaW4gdGhlIGV4Y2VwdGlvbgorICAgKiBBT19JU19CQVNFX0FUVFJJQlVURS4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCBpdCB3aWxsIG5vdCB0aHJvdworICAgKiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKKyAgICogICAgQU9fTUlTU0lOR19WQUxVRQorICAgKiAKKyAgICogQWZ0ZXIgdGhlIGZpcnN0IGNvbW1pdCwgdGhlcmUgbWF5IGJlIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlLiBUaGVzZSBpbnN0YW5jZXMgbWF5IGNhdXNlIHRoZSBmb2xsb3dpbmcgcHJvYmxlbToKKyAgICogCisgICAqIEFPX01JU1NJTkdfVkFMVUU6IFRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIHNldAorICAgKiBidXQgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGVtcHR5IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2VzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSEFTX0JBU0VfQVRUUklCVVRFCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSVNfQkFTRV9BVFRSSUJVVEUKKyAgICogICAgQU9fTUlTU0lOR19WQUxVRQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFhSXNPYmxpZ2F0b3J5ICBUaGUgb2JsaWdhdG9yeSBmbGFnLgorICAgKi8KKyAgIHZvaWQgc2V0SXNPYmxpZ2F0b3J5KAorICAgICAgaW4gVF9CT09MRUFOIGFhSXNPYmxpZ2F0b3J5KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAxMSkKKyAgICogU2V0IHRoZSB1bmlxdWUgZmxhZyBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIHNlcnZlciB3aWxsIGNoZWNrIGlmIHRoZSB2YWx1ZXMgb2YgdGhlIGluc3RhbmNlIGF0dHJpYnV0ZXMgYXJlCisgICAqIHVuaXF1ZS4gSWYgdGhpcyBmbGFnIGlzIHNldCBhbmQgdGhlIHZhbHVlcyBvZiBhbiBhdHRyaWJ1dGUgYXJlIG5vdAorICAgKiB1bmlxdWUgd2hlbiB1c2luZyB0aGUgbWV0aG9kIHNldFZhbHVlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uIElmCisgICAqIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBhbHJlYWR5IGV4aXN0IHRoYXQgY29udGFpbgorICAgKiBub24tdW5pcXVlIHZhbHVlcyBhbmQgdGhlIGZsYWcgc2hhbGwgYmUgc2V0IHRoaXMgbWV0aG9kIHRocm93cyBhbgorICAgKiBleGNlcHRpb24uCisgICAqIAorICAgKiBJdCBpcyBub3QgYWxsb3dlZCB0byBzZXQgdGhlIHVuaXF1ZSBmbGFnIG9mIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMKKyAgICogdGhhdCByZXByZXNlbnQgYmFzZSBhdHRyaWJ1dGVzLiBBbiBhdHRlbXB0IHRvIHNldCB0aGUgdW5pcXVlIGZsYWcgb2YKKyAgICogc3VjaCBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgd2lsbCByZXN1bHQgaW4gdGhlIGV4Y2VwdGlvbgorICAgKiBBT19JU19CQVNFX0FUVFJJQlVURS4KKyAgICogCisgICAqIElmIHRoZSB1bmlxdWUgZmxhZyBpcyBzZXQgdG8gVFJVRSB0aGUgb2JsaWdhdG9yeSBmbGFnIGlzIGFsc28gc2V0IHRvCisgICAqIFRSVUUuIFRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgYm90aCBmbGFnIGRvIG5vdCBtYXR0ZXIgaW4gdGhpcyBjYXNlLgorICAgKiBTZXR0aW5nIHRoZSB1bmlxdWUgZmxhZyB0byBGQUxTRSBkb2VzIG5vdCBhZmZlY3QgdGhlIG9ibGlnYXRvcnkKKyAgICogZmxhZy4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCBpdCB3aWxsIG5vdCB0aHJvdworICAgKiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKKyAgICogICAgQU9fTUlTU0lOR19WQUxVRQorICAgKiAgICBBT19OT1RfVU5JUVVFCisgICAqIAorICAgKiBBZnRlciB0aGUgZmlyc3QgY29tbWl0LCB0aGVyZSBtYXkgYmUgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiBhdHRyaWJ1dGUuIFRoZXNlIGluc3RhbmNlcyBtYXkgY2F1c2UgdGhlIGZvbGxvd2luZyBwcm9ibGVtOgorICAgKiAKKyAgICogQU9fTUlTU0lOR19WQUxVRTogVGhlIG9ibGlnYXRvcnkgZmxhZyBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUgaXMgc2V0CisgICAqIGJ1dCB0aGVyZSBhcmUgb25lIG9yIG1vcmUgZW1wdHkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZXMuCisgICAqIAorICAgKiBBT19OT1RfVU5JUVVFOiBUaGUgdW5pcXVlIGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIHNldCBidXQgdGhlCisgICAqIHZhbHVlcyBvZiB0aGUgaW5zdGFuY2VzIGFyZSBub3QgdW5pcXVlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSEFTX0JBU0VfQVRUUklCVVRFCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSVNfQkFTRV9BVFRSSUJVVEUKKyAgICogICAgQU9fTUlTU0lOR19WQUxVRQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9UX1VOSVFVRQorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWFJc1VuaXF1ZSAgVGhlIHVuaXF1ZSBmbGFnLgorICAgKi8KKyAgIHZvaWQgc2V0SXNVbmlxdWUoCisgICAgICBpbiBUX0JPT0xFQU4gYWFJc1VuaXF1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTIpCisgICAqIFNldCB0aGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aCBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLiBUaGUKKyAgICogbWF4aW11bSB2YWx1ZSAgYWNjZXB0ZWQgYnkgdGhlIEFTQU0gT0RTIHNlcnZlciBmb3IgdGhpcyBsZW5ndGgKKyAgICogaW5mb3JtYXRpb24gZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBzdG9yYWdlLiBGb3IgdGhlCisgICAqIHBoeXNpY2FsIHN0b3JhZ2Ugc3BlY2lmaWVkIGluIGNoYXB0ZXIgMyB0aGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aAorICAgKiB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgQUZMRU4gdmFsdWUgaW4gU1ZDQVRUUiwgYW5kIGl0IGlzIHJlc3RyaWN0ZWQKKyAgICogYnkgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHN0cmluZyB0eXBlIGRhdGFiYXNlIGZpZWxkcy4gSWYgYSBsZW5ndGggaXMKKyAgICogc3BlY2lmaWVkIHRoYXQgZXhjZWVkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsCisgICAqIHN0b3JhZ2UgdGhlIHNlcnZlciB3aWxsIHRocm93IHRoZSBleGNlcHRpb24gQU9fSU5WQUxJRF9MRU5HVEguIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uIAorICAgKiAKKyAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBPRFMgZGF0YWJhc2UgZGVzaWduIHRvb2xzLiBOZWdhdGl2ZSBsZW5ndGgKKyAgICogdmFsdWVzIGFyZSBub3QgYWxsb3dlZC4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIG9ubHkgYSBoaW50IHRvIGEgZGF0YWJhc2Ugc2VydmVyIGluIHRoZSBkZXNpZ24KKyAgICogcGhhc2Ugd2hpY2ggc2l6ZSB0aGUgZGF0YSBlbnRyaWVzIG1heSBoYXZlLiBUaGUgbGVuZ3RoIGlzIG9ubHkKKyAgICogcmVsZXZhbnQgZm9yIGlzIGlnbm9yZWQgZm9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIHdpdGggdGhlIGRhdGEgdHlwZQorICAgKiBvdGhlciBkYXRhdHlwZXMgdGhhbiBEVF9TVFJJTkcsIERTX1NUUklORywgRFRfREFURSwgRFNfREFURSwgYWxsCisgICAqIGNvbXBvbmVudHMgb2YgRFRfRVhURVJOQUxSRUZFUkVOQ0UgYW5kIG9mIERTX0VYVEVSTkFMUkVGRVJFTkNFLCBhbmQKKyAgICogdGhlIGhlYWRlciBwb3J0aW9uIG9mIERUX0JMT0IuCisgICAqIAorICAgKiBGb3IgcGVyZm9ybWFuY2UgYW5kIGZsZXhpYmlsaXR5IHJlYXNvbnMgdGhpcyBzZXQtbWV0aG9kIHNob3VsZCBiZQorICAgKiB1c2VkIGJlZm9yZSB0aGUgbmV3IGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpcyBjb21taXR0ZWQgdGhlIGZpcnN0CisgICAqIHRpbWUuCisgICAqIAorICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBjb21taXQgaXQgd2lsbCBub3QgdGhyb3cKKyAgICogdGhlIGZvbGxvd2luZyBleGNlcHRpb246CisgICAqICAgIEFPX0hBU19JTlNUQU5DRVMKKyAgICogCisgICAqIEFmdGVyIHRoZSBmaXJzdCBjb21taXQsIHRoZXJlIG1heSBiZSBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAqIGF0dHJpYnV0ZS4gVGhlc2UgaW5zdGFuY2VzIG1heSBjYXVzZSB0aGUgZXhjZXB0aW9uIEFPX0hBU19JTlNUQU5DRVMKKyAgICogaWYgdGhlIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlIGFyZSBub3QgZW1wdHkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfSU5TVEFOQ0VTCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9MRU5HVEgKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYUxlbmd0aCAgVGhlIG1heGltdW0gYXR0cmlidXRlIGxlbmd0aC4KKyAgICovCisgICB2b2lkIHNldExlbmd0aCgKKyAgICAgIGluIFRfTE9ORyBhYUxlbmd0aCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTMpCisgICAqIFNldCB0aGUgbmFtZSBvZiBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZS4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIFRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0KKyAgICogbmFtZSBsZW5ndGggb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgc3RvcmFnZS4gQ3VycmVudCBzZXJ2ZXIKKyAgICogaW1wbGVtZW50YXRpb25zIHR5cGljYWxseSByZXN0cmljdCBpdCB0byAzMCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fRFVQTElDQVRFX05BTUUKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFhTmFtZSAgVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBuYW1lLgorICAgKi8KKyAgIHZvaWQgc2V0TmFtZSgKKyAgICAgIGluIE5hbWUgYWFOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAxNCkKKyAgICogU2V0IHRoZSB1bml0IElkIG9mIGFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlIG91dHNpZGUgYQorICAgKiB0cmFuc2FjdGlvbiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSB1bml0IElkIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBjdXJyZW50IHNlcnZlci4gSWYgaW5zdGFuY2VzIG9mCisgICAqIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgZXhpc3QsIHRoZSByZXNwZWN0aXZlIHZhbHVlcyBhcmUKKyAgICogYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gdGhlIG5ldyB1bml0LiBJZiB0aGVyZSBpcyBubyBrbm93bgorICAgKiBjb252ZXJzaW9uIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqIAorICAgKiBUaGUgYXV0b21hdGljIGNvbnZlcnNpb24gY2FuIGJlIGF2b2lkZWQgaWYgdGhlIHVuaXQgaXMgc2V0IHRvIHplcm8uCisgICAqIEFmdGVyIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG11c3QgYmUgY29tbWl0dGVkLiBJbiB0aGUgbmV4dCBzdGVwIHRoZQorICAgKiBuZXcgdW5pdCBtYXkgYmUgc2V0IGluIGFub3RoZXIgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgYXV0b21hdGljIGNvbnZlcnNpb24gaXMgZG9uZSBvbmx5IGZvciB0aGUgZm9sbG93aW5nIGRhdGEKKyAgICogdHlwZXM6CisgICAqICAgIERUX0JZVEUKKyAgICogICAgRFRfQ09NUExFWAorICAgKiAgICBEVF9EQ09NUExFWAorICAgKiAgICBEVF9ET1VCTEUKKyAgICogICAgRFRfRkxPQVQKKyAgICogICAgRFRfTE9ORworICAgKiAgICBEVF9MT05HTE9ORworICAgKiAgICBEVF9TSE9SVAorICAgKiBhcyB3ZWxsIGFzIGZvciB0aGUgY29ycmVzcG9uZGluZyBzZXF1ZW5jZSBkYXRhIHR5cGVzLiBGb3IgY29tcGxleAorICAgKiBkYXRhIHR5cGVzIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydCBhcmUgY29udmVydGVkIHNlcGFyYXRlbHkuCisgICAqIAorICAgKiBJZiB0aGUgdW5pdCBvZiBhbiBhdHRyaWJ1dGUgaXMgc2V0IHRoZSB1bml0IGlzIGNvbnN0YW50LiBJZiB0aGUKKyAgICogdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBoYXMgYW5vdGhlciB1bml0IHRoZSB2YWx1ZSBpcyByZWNhbGN1bGF0ZWQgdG8KKyAgICogdGhlIHVuaXQgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4gSWYgdGhlcmUgaXMgbm8gdW5pdCBhdCB0aGUKKyAgICogYXBwbGljYXRpb24gYXR0cmlidXRlIHRoZSB1bml0IGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgc3RvcmVkIGFuZAorICAgKiByZXBvcnRlZCBvbiByZXF1ZXN0IGF0IHRoZSBpbnN0YW5jZS4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCBpdCB3aWxsIG5vdCB0aHJvdworICAgKiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CisgICAqICAgIEFPX0lOQ09NUEFUSUJMRV9VTklUUworICAgKiAgICBBT19NQVRIX0VSUk9SCisgICAqIAorICAgKiBBZnRlciB0aGUgZmlyc3QgY29tbWl0LCB0aGVyZSBtYXkgYmUgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiBhdHRyaWJ1dGUuIFRoZXNlIGluc3RhbmNlcyBtYXkgY2F1c2UgdGhlIGZvbGxvd2luZyBwcm9ibGVtczoKKyAgICogCisgICAqIEFPX0lOQ09NUEFUSUJMRV9VTklUUzogTm8gY29udmVyc2lvbiBydWxlcyBpcyBrbm93biB0byBjb252ZXJ0IHRoZQorICAgKiB1bml0LgorICAgKiAKKyAgICogQU9fTUFUSF9FUlJPUjogQ29udmVydGluZyB0aGUgdmFsdWVzIHRvIHRoZSBuZXcgdW5pdCByZXN1bHRzIGluIGRhdGEKKyAgICogb3ZlcmZsb3cgb3IgdW5kZXJmbG93IG9yIGEgZGl2aXNpb24gYnkgemVybyBpcyBkZXRlY3RlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5DT01QQVRJQkxFX1VOSVRTCisgICAqICAgIEFPX01BVEhfRVJST1IKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVU5LTk9XTl9VTklUCisgICAqCisgICAqIEBwYXJhbSAgYWFVbml0ICBUaGUgdW5pdCBJZC4KKyAgICovCisgICB2b2lkIHNldFVuaXQoCisgICAgICBpbiBUX0xPTkdMT05HIGFhVW5pdCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTUpCisgICAqIFRoZSBnaXZlbiB1c2VyIGdyb3VwIHRoZSByaWdodHMgc2hvdWxkIGJlIHNldCBmb3IuIDxyaWdodHM+IGRlZmluZXMKKyAgICogdGhlIHJpZ2h0cyB0byBzZXQgb3IgdG8gY2xlYXIuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvCisgICAqICdzZXQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBzZXQgYWxsIG90aGVycyBhcmUgY2xlYXJlZC4gSWYgdGhlCisgICAqIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ2FkZCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIGFkZGVkIHRvCisgICAqIHRoZSBleGlzdGluZyByaWdodHMuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdyZW1vdmUnLCB0aGUKKyAgICogcmlnaHRzIGluIDxyaWdodHM+IGFyZSByZW1vdmVkIGZyb20gdGhlIGV4aXN0aW5nIHJpZ2h0cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cCAgVGhlIHVzZXIgZ3JvdXAgZm9yIHdoaWNoIHRoZSByaWdodHMgd2lsbCBiZQorICAgKiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQuCisgICAqCisgICAqIEBwYXJhbSAgcmlnaHRzICBUaGUgbmV3IHJpZ2h0IGZvciB0aGUgdXNlciBncm91cC4gVGhlIHJpZ2h0cworICAgKiAgICAgICAgICAgICAgICAgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UKKyAgICogICAgICAgICAgICAgICAgIFNlY3VyaXR5UmlnaHRzLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UKKyAgICogICAgICAgICAgICAgICAgIElETCBkb2VzIG5vdCBhbGxvdyB0byBzZXQgdGhlIHZhbHVlcyBvZiBlbnVtZXJhdGlvbnMKKyAgICogICAgICAgICAgICAgICAgIHRodXMgdGhlIGNvbnN0YW50IGRlZmluaXRpb25zIGhhZCB0byBiZSBkb25lIGluIGFuCisgICAqICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyByaWdodC4KKyAgICovCisgICB2b2lkIHNldFJpZ2h0cygKKyAgICAgIGluIEluc3RhbmNlRWxlbWVudCB1c2VyZ3JvdXAsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTYpCisgICAqIFJldHJpZXZlIGFjY2VzcyBjb250cm9sIGxpc3QgaW5mb3JtYXRpb24gb2YgdGhlIGdpdmVuIG9iamVjdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFjY2VzcyBjb250cm9sIGxpc3QgZW50cmllcyBvZiB0aGUgZ2l2ZW4gYXBwbGljYXRpb24KKyAgICogICAgICAgICAgZWxlbWVudC4KKyAgICovCisgICBBQ0xTZXF1ZW5jZSBnZXRSaWdodHMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAxNykKKyAgICogUmV0dXJuIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVsb25ncy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICovCisgICBBcHBsaWNhdGlvbkVsZW1lbnQgZ2V0QXBwbGljYXRpb25FbGVtZW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTgpCisgICAqIEdldCB0aGUgYXV0byBnZW5lcmF0ZSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXV0byBnZW5lcmF0ZSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgVF9CT09MRUFOIGlzQXV0b2dlbmVyYXRlZCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg0MDE5KQorICAgKiBTZXQgdGhlIGF1dG8gZ2VuZXJhdGUgZmxhZyBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLgorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBGb3IgcGVyZm9ybWFuY2UgYW5kIGZsZXhpYmlsaXR5IHJlYXNvbnMgdGhpcyBzZXQtbWV0aG9kIHNob3VsZCBiZQorICAgKiB1c2VkIGJlZm9yZSB0aGUgbmV3IGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpcyBjb21taXR0ZWQgdGhlIGZpcnN0CisgICAqIHRpbWUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfQkFTRV9BVFRSSUJVVEUKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JU19CQVNFX0FUVFJJQlVURQorICAgKiAgICBBT19NSVNTSU5HX1ZBTFVFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaXNBdXRvZ2VuZXJhdGVkICBUaGUgYXV0byBnZW5lcmF0ZSBmbGFnLgorICAgKi8KKyAgIHZvaWQgc2V0SXNBdXRvZ2VuZXJhdGVkKAorICAgICAgaW4gVF9CT09MRUFOIGlzQXV0b2dlbmVyYXRlZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMjApCisgICAqIEdldCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bWVyYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19JTlZBTElEX0RBVEFUWVBFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBBU0FNIE9EUyBlbnVtZXJhdGlvbi4KKyAgICovCisgICBFbnVtZXJhdGlvbkRlZmluaXRpb24gZ2V0RW51bWVyYXRpb25EZWZpbml0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMjEpCisgICAqIFNldCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bWVyYXRpb24uIFRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZQorICAgKiBhcHBsaWNhdGlvbiBtb2RlbCwgb25seSB0aGUgc3VwZXIgdXNlciBjYW4gdXNlIHRoaXMgbWV0aG9kLgorICAgKiAKKyAgICogVGhlIEFvRXhjZXB0aW9uIEFPX0lOVkFMSURfREFUQVRZUEUgaXMgdGhyb3duIHdoZW4gdGhlIGRhdGEgdHlwZSBvZgorICAgKiB0aGUgYXR0cmlidXRlIGlzIG5vdCBEVF9FTlVNLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fSU5WQUxJRF9EQVRBVFlQRQorICAgKgorICAgKiBAcGFyYW0gIGVudW1EZWYgIFRoZSBuZXcgZW51bWVyYXRpb24gZGVmaW5pdGlvbi4KKyAgICovCisgICB2b2lkIHNldEVudW1lcmF0aW9uRGVmaW5pdGlvbigKKyAgICAgIGluIEVudW1lcmF0aW9uRGVmaW5pdGlvbiBlbnVtRGVmKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAyMikKKyAgICogSGFzIHRoZSBhdHRyaWJ1dGUgYW4gdW5pdC4gSWYgdGhpcyBmbGFnIGlzIHNldCwgYWxsIHRoZSBhdHRyaWJ1dGVzCisgICAqIG9mIHRoZSBpbnN0YW5jZXMgZGVyaXZlZCBmcm9tIHRoaXMgYXR0cmlidXRlIHdpbGwgaGFzIGFuIHVuaXQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBmbGFnIGlmIHRoZSBhdHRyaWJ1dGUgaGFzIGFuIHVuaXQuCisgICAqLworICAgVF9CT09MRUFOIGhhc1VuaXQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAyMykKKyAgICogU2V0IHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBiZWNvbWVzIGFuIHVuaXQgb3Igbm90LiBBIGNhbGwgdG8gdGhlCisgICAqIG1ldGhvZCBzZXRVbml0KCkgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgd2l0aFVuaXQoVFJVRSkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB3aXRoVW5pdCAgVGhlIGZsYWcgaWYgdGhlIGF0dHJpYnV0ZSBiZWNvbWVzIGFuIHVuaXQuCisgICAqLworICAgdm9pZCB3aXRoVW5pdCgKKyAgICAgIGluIFRfQk9PTEVBTiB3aXRoVW5pdCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMjQpCisgICAqIERlcHJlY2F0ZWQsIG5vdCB1c2VkIGFueSBtb3JlIHNpbmNlIEFTQU0gT0RTIDUuMi4gCisgICAqIEhhcyB0aGUgYXR0cmlidXRlIGEgdmFsdWUgZmxhZy4gSWYgdGhpcyBmbGFnIGlzIHNldCwgYWxsIHRoZQorICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZXMgZGVyaXZlZCBmcm9tIHRoaXMgYXR0cmlidXRlIHdpbGwgaGFzIGEKKyAgICogdmFsdWUgZmxhZy4gSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQgdGhlIGZsYWcgaW4gdGhlIFRTX1ZhbHVlCisgICAqIHN0cnVjdHVyZSBjYW4gYmUgaWdub3JlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGZsYWcgaWYgdGhlIGF0dHJpYnV0ZSBoYXMgYSB2YWx1ZSBmbGFnLgorICAgKi8KKyAgIFRfQk9PTEVBTiBoYXNWYWx1ZUZsYWcoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAyNSkKKyAgICogRGVwcmVjYXRlZCwgbm90IHVzZWQgYW55IG1vcmUgc2luY2UgQVNBTSBPRFMgNS4yLiAKKyAgICogU2V0IHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBiZWNvbWVzIGEgdmFsdWUgZmxhZyBvciBub3QuIElmIHRoaXMgZmxhZworICAgKiBpc24ndCBzZXQgdGhlIGZsYWcgb2YgdGhlIFRTX1ZhbHVlIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgc2VydmVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgd2l0aFZhbHVlRmxhZyAgVGhlIGZsYWcgaWYgdGhlIGF0dHJpYnV0ZSBiZWNvbWVzIGEgdmFsdWUKKyAgICogICAgICAgICAgICAgICAgICAgICAgICBmbGFnLgorICAgKi8KKyAgIHZvaWQgd2l0aFZhbHVlRmxhZygKKyAgICAgIGluIFRfQk9PTEVBTiB3aXRoVmFsdWVGbGFnKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBBcHBsaWNhdGlvbkF0dHJpYnV0ZS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBhcHBsaWNhdGlvbiBlbGVtZW50IGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgQXBwbGljYXRpb25FbGVtZW50IHsKKworICAgLyoqICg1MDAxKQorICAgKiBDcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIG9uIHRoZSBzZXJ2ZXIuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIHByb3BlcnRpZXMgb2YgdGhlIG5ldyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgbWF5IGJlIGNoYW5nZWQgdmlhCisgICAqIHRoZSBzZXQtbWV0aG9kcyBvZiB0aGUgQXBwbGljYXRpb25BdHRyaWJ1dGUgaW50ZXJmYWNlLgorICAgKiAKKyAgICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgaXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IGFsbCByZXF1aXJlZAorICAgKiBwcm9wZXJ0aWVzIG9mIGFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBiZWZvcmUgaXQgaXMgY29tbWl0dGVkIHRoZQorICAgKiBmaXJzdCB0aW1lLiBUaGlzIGF2b2lkcyBkYXRhYmFzZSBjcm9zcy1jaGVja3MgZm9yIGVhY2ggYXR0cmlidXRlLgorICAgKiAKKyAgICogVGhlIGRlZmF1bHQgcHJvcGVydGllcyBvZiBhIG5ldyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgYXJlOgorICAgKiAgICBCYXNlQXR0cmlidXRlICAgTlVMTAorICAgKiAgICBEYXRhVHlwZSAgICAgICAgRFRfVU5LTk9XTgorICAgKiAgICBJc09ibGlnYXRvcnkgICAgMAorICAgKiAgICBJc1VuaXF1ZSAgICAgICAgMAorICAgKiAgICBMZW5ndGggICAgICAgICAgMAorICAgKiAgICBOYW1lICAgICAgICAgICAgIkFVVE9HRU4iCisgICAqICAgIFVuaXQgICAgICAgICAgICBOVUxMCisgICAqIAorICAgKiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgdGhlIHZhbHVlcworICAgKiBvZiB0aGUgZXhpc3RpbmcgaW5zdGFuY2VzIG9mIHRoZSBuZXcgYXR0cmlidXRlIGFyZSBzZXQgdG8KKyAgICogdW5kZWZpbmVkLgorICAgKiAKKyAgICogVGhlIGV4Y2VwdGlvbiBBT19EVVBMSUNBVEVfTkFNRSBuYW1lIG9jY3VycyBpZiB0aGVyZSBpcyBhbHJlYWR5CisgICAqIGFub3RoZXIgYXBwbGljYXRpb24gYXR0cmlidXRlIHdpdGggdGhlIG5hbWUgIkFVVE9HRU4iLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9OQU1FCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICovCisgICBBcHBsaWNhdGlvbkF0dHJpYnV0ZSBjcmVhdGVBdHRyaWJ1dGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAwMikKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG91dHNpZGUgYSB0cmFuc2FjdGlvbiBidXQgaXQgaXMKKyAgICogcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBpbnN0YW5jZSBnZXRzIHBlcm1hbmVudCB3aGVuIHRoZSAgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLiAgQWxsCisgICAqIGF0dHJpYnV0ZXMgY29ubmVjdGVkIHRvIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGFyZSBhdXRvbWF0aWNhbGx5CisgICAqIGNyZWF0ZWQgYW5kIGNvbm5lY3RlZCB0byB0aGUgaW5zdGFuY2UuIFRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMKKyAgICogY2FuIGJlIHNldCBieSB0aGUgbWV0aG9kIHNldFZhbHVlIG9mIHRoZSBpbnRlcmZhY2UgSW5zdGFuY2VFbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaWVOYW1lICBUaGUgaW5zdGFuY2UgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5ldyBpbnN0YW5jZS4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnQgY3JlYXRlSW5zdGFuY2UoCisgICAgICBpbiBOYW1lIGllTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDUwMDMpCisgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHJlbGF0ZWQgYXBwbGljYXRpb24gZWxlbWVudHMgY29ubmVjdGVkIHRvIHRoaXMKKyAgICogYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZWxhdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnRzLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlIGdldEFsbFJlbGF0ZWRFbGVtZW50cygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDA0KQorICAgKiBHZXQgYSBsaXN0IG9mIGFsbCBhcHBsaWNhdGlvbiByZWxhdGlvbnMgY29ubmVjdGVkIHRvIHRoaXMKKyAgICogYXBwbGljYXRpb24gZWxlbWVudC4gVGhlIGludmVyc2UgcmVsYXRpb24gb2YgcmVsYXRpb25zIGNvbm5lY3RlZCB0bworICAgKiBvdGhlciBhcHBsaWNhdGlvbiBlbGVtZW50cyBwb2ludGluZyB0byB0aGUgZ2l2ZW4gYXBwbGljYXRpb24KKyAgICogZWxlbWVudHMgYXJlIG5vdCByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbnMgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgQXBwbGljYXRpb25SZWxhdGlvblNlcXVlbmNlIGdldEFsbFJlbGF0aW9ucygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDA1KQorICAgKiBHZXQgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50IHdoaWNoIGlzCisgICAqIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGUgYmFzZSBuYW1lCisgICAqIGlzIGNhc2UgaW5zZW5zaXRpdmUgYW5kIG1heSBub3QgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLiAKKyAgICogCisgICAqIE5vdGU6IFRoZSBiYXNlIG1vZGVsIGlzIGNhc2UgYmxpbmQsICBlLmcuIElkLCBJRCBhbmQgaWQgaXMgYWxsIHRoZQorICAgKiBzYW1lIGJhc2UgYXR0cmlidXRlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJhTmFtZSAgVGhlIGJhc2UgYXR0cmlidXRlIG5hbWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgQXBwbGljYXRpb25BdHRyaWJ1dGUgZ2V0QXR0cmlidXRlQnlCYXNlTmFtZSgKKyAgICAgIGluIE5hbWUgYmFOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAwNikKKyAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb2YgYW4gYXBwbGljYXRpb24gZWxlbWVudCB3aGljaCBoYXMKKyAgICogdGhlIGdpdmVuIG5hbWUuIFRoZSBuYW1lIGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgbm90IGNvbnRhaW4KKyAgICogd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICogCisgICAqIE5vdGU6IFRoZSBhcHBsaWNhdGlvbiBtb2RlbCBpcyBjYXNlIHNlbnNpdGl2ZSwgZS5nLiBJZCBhbmQgSUQgYXJlCisgICAqIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzLCBkb24ndCB1c2UgdGhpcyBtaXNsZWFkaW5nCisgICAqIGF0dHJpYnV0ZSBuYW1lLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFhTmFtZSAgVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBuYW1lLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uQXR0cmlidXRlIGdldEF0dHJpYnV0ZUJ5TmFtZSgKKyAgICAgIGluIE5hbWUgYWFOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAwNykKKyAgICogR2V0IGEgbGlzdCBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlcyBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKiBUaGUgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgYXJlIG5vdCByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlCisgICAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMuCisgICAqLworICAgQXBwbGljYXRpb25BdHRyaWJ1dGVTZXF1ZW5jZSBnZXRBdHRyaWJ1dGVzKAorICAgICAgaW4gUGF0dGVybiBhYVBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDA4KQorICAgKiBHZXQgdGhlIGJhc2UgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGJhc2UgZWxlbWVudC4KKyAgICovCisgICBCYXNlRWxlbWVudCBnZXRCYXNlRWxlbWVudCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDA5KQorICAgKiBHZXQgdGhlIElkIG9mIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgVF9MT05HTE9ORyBnZXRJZCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDEwKQorICAgKiBHZXQgdGhlIGluc3RhbmNlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBJZC4gSWYgdGhlIElkIG9mIHRoZQorICAgKiBpbnN0YW5jZSBpcyBub3QgdW5pcXVlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaWVJZCAgVGhlIGluc3RhbmNlIGVsZW1lbnQgSWQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnN0YW5jZSBlbGVtZW50LgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudCBnZXRJbnN0YW5jZUJ5SWQoCisgICAgICBpbiBUX0xPTkdMT05HIGllSWQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDExKQorICAgKiBHZXQgdGhlIGluc3RhbmNlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBuYW1lLiBJZiB0aGUgbmFtZSBvZgorICAgKiB0aGUgaW5zdGFuY2UgaXMgbm90IHVuaXF1ZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKiAKKyAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW5zdGFuY2UgZWxlbWVudHMgd2l0aCB1bmlxdWUKKyAgICogbmFtZXMuIElmIHRoZXJlIGFyZSBkdXBsaWNhdGUgbmFtZXMgZm9yIGluc3RhbmNlIHVzZSB0aGUgbWV0aG9kCisgICAqIGdldEluc3RhbmNlcyBpbnN0ZWFkIGFuZCBzcGVjaWZ5IHRoZSByZXF1ZXN0ZWQgbmFtZSBhcyBwYXR0ZXJuCisgICAqIHBhcmFtZXRlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9OQU1FCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBpZU5hbWUgIFRoZSBpbnN0YW5jZSBlbGVtZW50IG5hbWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnN0YW5jZSBlbGVtZW50LgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudCBnZXRJbnN0YW5jZUJ5TmFtZSgKKyAgICAgIGluIE5hbWUgaWVOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxMikKKyAgICogR2V0IHRoZSBpbnN0YW5jZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIGlzIGNhc2UKKyAgICogc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGllUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgaW5zdGFuY2UKKyAgICogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGluc3RhbmNlIGVsZW1lbnRzLgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudEl0ZXJhdG9yIGdldEluc3RhbmNlcygKKyAgICAgIGluIFBhdHRlcm4gaWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxMykKKyAgICogR2V0IHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICovCisgICBOYW1lIGdldE5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxNCkKKyAgICogR2V0IHJlbGF0ZWQgYXBwbGljYXRpb24gZWxlbWVudHMgY29ubmVjdGVkIHZpYSB0aGUgc3BlY2lmaWVkCisgICAqIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTlNISVAKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZVJlbGF0aW9uc2hpcCAgVGhlIHJlcXVlc3RlZCByZWxhdGlvbnNoaXAuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZWxhdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnRzLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlIGdldFJlbGF0ZWRFbGVtZW50c0J5UmVsYXRpb25zaGlwKAorICAgICAgaW4gUmVsYXRpb25zaGlwIGFlUmVsYXRpb25zaGlwKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxNSkKKyAgICogR2V0IGFwcGxpY2F0aW9uIHJlbGF0aW9ucyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgY29ubmVjdGVkIGZyb20gdGhpcworICAgKiBhcHBsaWNhdGlvbiBlbGVtZW50LiBUaGUgaW52ZXJzZSByZWxhdGlvbnMgYXJlIG5vdCByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTl9UWVBFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWVSZWxhdGlvblR5cGUgIFRoZSByZXF1ZXN0ZWQgcmVsYXRpb24gdHlwZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9ucy4KKyAgICovCisgICBBcHBsaWNhdGlvblJlbGF0aW9uU2VxdWVuY2UgZ2V0UmVsYXRpb25zQnlUeXBlKAorICAgICAgaW4gUmVsYXRpb25UeXBlIGFlUmVsYXRpb25UeXBlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxNikKKyAgICogR2V0IHRoZSBuYW1lcyBvZiBhbGwgcmVsYXRlZCBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgcmVsYXRlZCBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdEFsbFJlbGF0ZWRFbGVtZW50cygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDE3KQorICAgKiBHZXQgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBuYW1lcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICogVGhlcmUgYXJlIG5vIGF0dHJpYnV0ZSBuYW1lcyByZXR1cm5lZCBpbiB0aGUgcmVzdWx0IGxpc3QgdGhhdAorICAgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlCisgICAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzLgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBsaXN0QXR0cmlidXRlcygKKyAgICAgIGluIFBhdHRlcm4gYWFQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxOCkKKyAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgaW5zdGFuY2VzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSBwYXR0ZXJuLiBUaGUKKyAgICogcGF0dGVybiBpcyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlCisgICAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSBpbnN0YW5jZXMuCisgICAqLworICAgTmFtZUl0ZXJhdG9yIGxpc3RJbnN0YW5jZXMoCisgICAgICBpbiBQYXR0ZXJuIGFhUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDUwMTkpCisgICAqIEdldCB0aGUgbmFtZXMgb2YgcmVsYXRlZCBhcHBsaWNhdGlvbiBlbGVtZW50cyBjb25uZWN0ZWQgdmlhIHRoZQorICAgKiBzcGVjaWZpZWQgcmVsYXRpb25zaGlwLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1JFTEFUSU9OU0hJUAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFlUmVsYXRpb25zaGlwICBUaGUgcmVxdWVzdGVkIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSByZWxhdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnRzLgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBsaXN0UmVsYXRlZEVsZW1lbnRzQnlSZWxhdGlvbnNoaXAoCisgICAgICBpbiBSZWxhdGlvbnNoaXAgYWVSZWxhdGlvbnNoaXApCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDIwKQorICAgKiBSZW1vdmUgYW4gYXBwbGljYXRpb24gYXR0cmlidXRlIGZyb20gYW4gYXBwbGljYXRpb24gZWxlbWVudC4gSWYKKyAgICogdGhlcmUgYXJlIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudCB0aGUgYXR0cmlidXRlIG9mIHRoZQorICAgKiBleGlzdGluZyBpbnN0YW5jZXMgY2hhbmdlIGZyb20gYXBwbGljYXRpb24gdG8gaW5zdGFuY2UgYXR0cmlidXRlcy4KKyAgICogCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXBwbEF0dHIgIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgdG8gcmVtb3ZlLgorICAgKi8KKyAgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKAorICAgICAgaW4gQXBwbGljYXRpb25BdHRyaWJ1dGUgYXBwbEF0dHIpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDIxKQorICAgKiBSZW1vdmUgYW4gaW5zdGFuY2UgZnJvbSB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIHJlbW92ZSBhbiBpbnN0YW5jZSBvdXRzaWRlIGEgdHJhbnNhY3Rpb24gYnV0IGl0IGlzCisgICAqIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgaW5zdGFuY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2ZXIgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMKKyAgICogY29tbWl0dGVkLiBJZiB0aGUgcmVjdXJzaXZlIGZsYWcgaXMgc2V0IGFsbCBjaGlsZHJlbiBvZiB0aGUgaW5zdGFuY2UKKyAgICogYXJlIGFsc28gZGVsZXRlZC4gUmVtb3ZpbmcgaW5zdGFuY2VzIGlzIGFsbG93ZWQgb25seSBpZiB0aGVyZSBhcmUgbm8KKyAgICogcmVmZXJlbmNlcyhyZWxhdGlvbnMpIHRvIHRoaXMgaW5zdGFuY2UuIElmIHRoZSByZWN1cnNpdmUgZmxhZyBpcyBzZXQKKyAgICogYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZSBjaGlsZHJlbiBpcyBub3QgYWxsb3dlZCBhbmQgd2lsbCBjYXVzZSBhbgorICAgKiBleGNlcHRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfUkVGRVJFTkNFUworICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaWVJZCAgVGhlIGluc3RhbmNlIElkLgorICAgKgorICAgKiBAcGFyYW0gIHJlY3Vyc2l2ZSAgVGhlIHJlY3Vyc2l2ZSBmbGFnLgorICAgKi8KKyAgIHZvaWQgcmVtb3ZlSW5zdGFuY2UoCisgICAgICBpbiBUX0xPTkdMT05HIGllSWQsCisgICAgICBpbiBUX0JPT0xFQU4gcmVjdXJzaXZlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyMikKKyAgICogU2V0IHRoZSBiYXNlIGVsZW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIGFzc2lnbm1lbnQgdG8gdGhlIGN1cnJlbnQgYmFzZSBlbGVtZW50IGlzIG92ZXJ3cml0dGVuLiBJZiB0aGVyZQorICAgKiBhcmUgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9yIHJlZmVyZW5jZXMgdG8gdGhlCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0hBU19JTlNUQU5DRVMKKyAgICogICAgQU9fSEFTX1JFRkVSRU5DRVMKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmFzZUVsZW0gIFRoZSBiYXNlIGVsZW1lbnQuCisgICAqLworICAgdm9pZCBzZXRCYXNlRWxlbWVudCgKKyAgICAgIGluIEJhc2VFbGVtZW50IGJhc2VFbGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyMykKKyAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKiAgCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG91dHNpZGUgYQorICAgKiB0cmFuc2FjdGlvbiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG11c3QgYmUgdW5pcXVlLgorICAgKiAKKyAgICogVGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gZWxlbWVudCBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbmFtZQorICAgKiBsZW5ndGggb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgc3RvcmFnZS4gQ3VycmVudCBzZXJ2ZXIKKyAgICogaW1wbGVtZW50YXRpb25zIHJlc3RyaWN0IGl0IHRvIDMwIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19EVVBMSUNBVEVfTkFNRQorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZU5hbWUgIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuCisgICAqLworICAgdm9pZCBzZXROYW1lKAorICAgICAgaW4gTmFtZSBhZU5hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDI0KQorICAgKiBUaGUgZ2l2ZW4gdXNlciBncm91cCB0aGUgcmlnaHRzIHNob3VsZCBiZSBzZXQgZm9yLiA8cmlnaHRzPiBkZWZpbmVzCisgICAqIHRoZSByaWdodHMgdG8gc2V0IG9yIHRvIGNsZWFyLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0bworICAgKiAnc2V0JywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgc2V0IGFsbCBvdGhlcnMgYXJlIGNsZWFyZWQuIElmIHRoZQorICAgKiBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdhZGQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBhZGRlZCB0bworICAgKiB0aGUgZXhpc3RpbmcgcmlnaHRzLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0byAncmVtb3ZlJywgdGhlCisgICAqIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBleGlzdGluZyByaWdodHMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB1c2VyZ3JvdXAgIFRoZSB1c2VyIGdyb3VwIGZvciB3aGljaCB0aGUgcmlnaHRzIHdpbGwgYmUKKyAgICogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkLgorICAgKgorICAgKiBAcGFyYW0gIHJpZ2h0cyAgVGhlIG5ldyByaWdodCBmb3IgdGhlIHVzZXIgZ3JvdXAuIFRoZSByaWdodHMKKyAgICogICAgICAgICAgICAgICAgIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlCisgICAqICAgICAgICAgICAgICAgICBTZWN1cml0eVJpZ2h0cy4gVGhlIGludGVyZmFjZSBkZWZpbml0aW9uIGxhbmd1YWdlCisgICAqICAgICAgICAgICAgICAgICBJREwgZG9lcyBub3QgYWxsb3cgdG8gc2V0IHRoZSB2YWx1ZXMgb2YgZW51bWVyYXRpb25zCisgICAqICAgICAgICAgICAgICAgICB0aHVzIHRoZSBjb25zdGFudCBkZWZpbml0aW9ucyBoYWQgdG8gYmUgZG9uZSBpbiBhbgorICAgKiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgKgorICAgKiBAcGFyYW0gIHNldCAgV2hhdCB0byBkbyB3aXRoIHRoZSBuZXcgcmlnaHQuCisgICAqLworICAgdm9pZCBzZXRSaWdodHMoCisgICAgICBpbiBJbnN0YW5jZUVsZW1lbnQgdXNlcmdyb3VwLAorICAgICAgaW4gVF9MT05HIHJpZ2h0cywKKyAgICAgIGluIFJpZ2h0c1NldCBzZXQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDI1KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIG9mIHRoZSBnaXZlbiBvYmplY3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGVudHJpZXMgb2YgdGhlIGdpdmVuIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgIGVsZW1lbnQuCisgICAqLworICAgQUNMU2VxdWVuY2UgZ2V0UmlnaHRzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDUwMjYpCisgICAqIFJldHJpZXZlIGFjY2VzcyBjb250cm9sIGxpc3QgaW5mb3JtYXRpb24gZm9yIHRoZSBpbml0aWFsIHJpZ2h0cyBvZgorICAgKiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBlbnRyaWVzIHdpdGggdGhlIGluaXRpYWwgcmlnaHRzIG9mCisgICAqICAgICAgICAgIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKi8KKyAgIEluaXRpYWxSaWdodFNlcXVlbmNlIGdldEluaXRpYWxSaWdodHMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyNykKKyAgICogVGhlIGdpdmVuIHVzZXIgZ3JvdXAgdGhlIGluaXRpYWwgcmlnaHRzIHNob3VsZCBiZSBzZXQgZm9yLiA8cmlnaHRzPgorICAgKiBkZWZpbmVzIHRoZSByaWdodHMgdG8gc2V0IG9yIHRvIGNsZWFyLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldAorICAgKiB0byAnc2V0JywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgc2V0IGFsbCBvdGhlcnMgYXJlIGNsZWFyZWQuIElmCisgICAqIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdhZGQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZQorICAgKiBhZGRlZCB0byB0aGUgZXhpc3RpbmcgcmlnaHRzLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0bworICAgKiAncmVtb3ZlJywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBleGlzdGluZworICAgKiByaWdodHMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB1c2VyZ3JvdXAgIFRoZSB1c2VyIGdyb3VwIGZvciB3aGljaCB0aGUgaW5pdGlhbCByaWdodHMgd2lsbAorICAgKiAgICAgICAgICAgICAgICAgICAgYmUgbW9kaWZpZWQuCisgICAqCisgICAqIEBwYXJhbSAgcmlnaHRzICBUaGUgbmV3IGluaXRpYWwgcmlnaHRzIGZvciB0aGUgdXNlciBncm91cC4gVGhlCisgICAqICAgICAgICAgICAgICAgICByaWdodHMgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UKKyAgICogICAgICAgICAgICAgICAgIFNlY3VyaXR5UmlnaHRzLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UKKyAgICogICAgICAgICAgICAgICAgIElETCBkb2VzIG5vdCBhbGxvdyB0byBzZXQgdGhlIHZhbHVlcyBvZiBlbnVtZXJhdGlvbnMKKyAgICogICAgICAgICAgICAgICAgIHRodXMgdGhlIGNvbnN0YW50IGRlZmluaXRpb25zIGhhZCB0byBiZSBkb25lIGluIGFuCisgICAqICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAqCisgICAqIEBwYXJhbSAgcmVmQWlkICBUaGUgSWQgb2YgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gZWxlbWVudCBmb3Igd2hpY2gKKyAgICogICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIHJpZ2h0cyB3aWxsIGJlIHVzZWQuIElmIG5vIHJlZkFpZCBpcyBzZXQKKyAgICogICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIHJpZ2h0cyB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggbmV3CisgICAqICAgICAgICAgICAgICAgICBpbnN0YW5jZSBlbGVtZW50IGluZGVwZW5kZW50IG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiAgICAgICAgICAgICAgICAgZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFdoYXQgdG8gZG8gd2l0aCB0aGUgbmV3IGluaXRpYWwgcmlnaHRzLgorICAgKi8KKyAgIHZvaWQgc2V0SW5pdGlhbFJpZ2h0cygKKyAgICAgIGluIEluc3RhbmNlRWxlbWVudCB1c2VyZ3JvdXAsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gVF9MT05HTE9ORyByZWZBaWQsCisgICAgICBpbiBSaWdodHNTZXQgc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyOCkKKyAgICogU2V0IGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gZWxlbWVudCwgd2hpY2ggcmVsYXRpb24gd2lsbCBiZSB1c2VkCisgICAqIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCByaWdodHMgZm9yIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZXMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhcHBsUmVsICBUaGUgYXBwbGljYXRpb24gcmVsYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIHRvCisgICAqICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lIHRoZSBpbml0aWFsIHJpZ2h0cy4gVGhlIHJlbGF0aW9uIHJhbmdlIG9mCisgICAqICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIG11c3QgYmUgWzE6MV0gb3RoZXJ3aXNlCisgICAqICAgICAgICAgICAgICAgICAgdGhlIHNlcnZlciBjYW4gbm90IGZpbmQgYW4gdW5pcXVlIGluc3RhbmNlIGVsZW1lbnQKKyAgICogICAgICAgICAgICAgICAgICB0byByZXRyaWV2ZSB0aGUgaW5pdGlhbCByaWdodHMuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBTZXQgb3IgcmVtb3ZlIHRoZSByZWxhdGlvbiBmb3IgdGhlIGluaXRpYWwgcmlnaHRzLiBJZgorICAgKiAgICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSB0aGUgcmVsYXRpb24gd2lsbCBiZSBzZXQKKyAgICogICAgICAgICAgICAgIG90aGVyd2lzZSByZW1vdmVkLgorICAgKi8KKyAgIHZvaWQgc2V0SW5pdGlhbFJpZ2h0UmVsYXRpb24oCisgICAgICBpbiBBcHBsaWNhdGlvblJlbGF0aW9uIGFwcGxSZWwsCisgICAgICBpbiBUX0JPT0xFQU4gc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyOSkKKyAgICogR2V0IGFsbCByZWxhdGlvbnMgd2hpY2ggYXJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGluc3RhbmNlcyB0byBjcmVhdGUKKyAgICogdGhlIGluaXRpYWwgcmlnaHRzIG9mIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZSBlbGVtZW50LiBJZiB0aGVyZSBhcmUKKyAgICogbW9yZSB0aGVuIG9uZSBhcHBsaWNhdGlvbiByZWxhdGlvbiB0aGUgaW5pdGlhbCByaWdodHMgb2YgZWFjaAorICAgKiByZWxhdGVkIGluc3RhbmNlIGFyZSAnb3JlZCcgdG8gdGhlIGxpc3Qgb2YgdGhlIGluaXRpYWwgcmlnaHRzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2VxdWVuY2Ugd2l0aCB0aGUgYXBwbGljYXRpb24gcmVsYXRpb25zIHdoaWNoIHdpbGwgYmUKKyAgICogICAgICAgICAgdXNlZCB0byBjcmVhdGUgdGhlIGluaXRpYWwgcmlnaHRzIG9mIHRoZSBuZXcgY3JlYXRlZAorICAgKiAgICAgICAgICBpbnN0YW5jZSBlbGVtZW50LgorICAgKi8KKyAgIEFwcGxpY2F0aW9uUmVsYXRpb25TZXF1ZW5jZSBnZXRJbml0aWFsUmlnaHRSZWxhdGlvbnMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAzMCkKKyAgICogR2V0IHRoZSBzZWN1cml0eSBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4gVGhlIHNlY3VyaXR5CisgICAqIGxldmVsIHRlbGxzIGlmIHRoZXJlIGlzIGEgc2VjdXJpdHkgY2hlY2sgZm9yIGJvdGggYXBwbGljYXRpb24KKyAgICogZWxlbWVudCBhbmQgaW5zdGFuY2UgZWxlbWVudHMgb3Igb25seSBmb3IgdGhlIGFwcGxpY2F0aW9uCisgICAqIGF0dHJpYnV0ZXMsIHRoZSBpbnN0YW5jZSBlbGVtZW50cyBvciBub25lIGF0IGFsbC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGN1cnJlbnQgc2VjdXJpdHkgbGV2ZWwuIFRoZSBzZWN1cml0eSBsZXZlbCBjb25zdGFudHMKKyAgICogICAgICAgICAgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSBTZWN1cml0eUxldmVsLiBUaGUgaW50ZXJmYWNlCisgICAqICAgICAgICAgIGRlZmluaXRpb24gbGFuZ3VhZ2UgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mCisgICAqICAgICAgICAgIGVudW1lcmF0aW9ucyB0aHVzIHRoZSBjb25zdGFudCBkZWZpbml0aW9ucyBoYWQgdG8gYmUgZG9uZQorICAgKiAgICAgICAgICBpbiBhbiBpbnRlcmZhY2UuCisgICAqLworICAgVF9MT05HIGdldFNlY3VyaXR5TGV2ZWwoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAzMSkKKyAgICogU2V0IHRoZSBzZWN1cml0eSBsZXZlbCBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGVsZW1lbnQuIElmIHRoZQorICAgKiBzZWN1cml0eSBsZXZlbCBpcyBhZGRlZCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgYWNjZXNzCisgICAqIGNvbnRyb2wgbGlzdCBlbnRyaWVzIG9mIHRoZSBleGlzdGluZyBvYmplY3RzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgc2VjTGV2ZWwgIFRoZSBuZXcgc2VjdXJpdHkgbGV2ZWwuIFRoZSBzZWN1cml0eSBsZXZlbAorICAgKiAgICAgICAgICAgICAgICAgICBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZQorICAgKiAgICAgICAgICAgICAgICAgICBTZWN1cml0eUxldmVsLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UKKyAgICogICAgICAgICAgICAgICAgICAgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mCisgICAqICAgICAgICAgICAgICAgICAgIGVudW1lcmF0aW9ucyB0aHVzIHRoZSBjb25zdGFudCBkZWZpbml0aW9ucyBoYWQgdG8KKyAgICogICAgICAgICAgICAgICAgICAgYmUgZG9uZSBpbiBhbiBpbnRlcmZhY2UuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyBzZWN1cml0eSBsZXZlbC4KKyAgICovCisgICB2b2lkIHNldFNlY3VyaXR5TGV2ZWwoCisgICAgICBpbiBUX0xPTkcgc2VjTGV2ZWwsCisgICAgICBpbiBSaWdodHNTZXQgc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAzMikKKyAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBtb2RlbCB0byB3aGljaCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBiZWxvbmdzCisgICAqIGJ5IHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uU3RydWN0dXJlLiBUaGUKKyAgICogYXBwbGljYXRpb24gbW9kZWwgcHJvdmlkZWQgaXMgdGhlIHNhbWUgYXMgdGhhdCBwcm92aWRlZCBmcm9tIHRoZQorICAgKiBtZXRob2QgZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUgb2YgdGhlIEludGVyZmFjZSBBb1Nlc3Npb24uIFRoaXMKKyAgICogbWV0aG9kIGd1YXJhbnRlZXMgdGhhdCB0aGUgY2xpZW50IHNvZnR3YXJlIGlzIGFibGUgdG8gcmV0dXJuIHRvIHRoZQorICAgKiBzZXNzaW9uIGluIGNhc2UgdGhlIHNlc3Npb24gb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhcHBsaWNhdGlvbiBzdHJ1Y3R1cmUgdG8gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQKKyAgICogICAgICAgICAgYmVsb25ncy4KKyAgICovCisgICBBcHBsaWNhdGlvblN0cnVjdHVyZSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDMzKQorICAgKiBDcmVhdGUgYSBsaXN0IHdpdGggaW5zdGFuY2VzLiBUaGUgYXR0cmlidXRlIGFyZSBnaXZlbiB3aXRoIHRoZSBuYW1lCisgICAqIG9mIHRoZSBzZXF1ZW5jZS4gVGhlIHZhbHVlcyBvZiB0aGUgYXR0cmlidXRlcyBhcmUgZ2l2ZW4gaW4gdGhlIHZhbHVlCisgICAqIHNlcXVlbmNlLiBUaGUgaW5kZXggaW4gdGhlIGRpZmZlcmVudCB2YWx1ZSBzZXF1ZW5jZXMgbWF0Y2ggZm9yIG9uZQorICAgKiBpbnN0YW5jZSBlbGVtZW50LiBUaGUgaW5kZXggaW4gdGhlIGluc3RhbmNlIGVsZW1lbnQgc2VxdWVuY2Ugb2YgdGhlCisgICAqIHJlbGF0ZWQgaW5zdGFuY2VzIG1hdGNoIGZvciB0aGUgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBpbmRleCBpbiB0aGUKKyAgICogdmFsdWUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fSU5WQUxJRF9SRVFVRVNUCisgICAqCisgICAqIEBwYXJhbSAgYXR0cmlidXRlcyAgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBjcmVhdGVkIGluc3RhbmNlcy4KKyAgICoKKyAgICogQHBhcmFtICByZWxhdGVkSW5zdGFuY2VzICBUaGUgbGlzdCB3aXRoIHJlbGF0ZWQgaW5zdGFuY2VzIGZvcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBhcHBsaWNhdGlvbiByZWxhdGlvbnMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBsaXN0IHdpdGggdGhlIG5ldyBjcmVhdGVkIGluc3RhbmNlcy4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnRTZXF1ZW5jZSBjcmVhdGVJbnN0YW5jZXMoCisgICAgICBpbiBOYW1lVmFsdWVTZXFVbml0U2VxdWVuY2UgYXR0cmlidXRlcywKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb25JbnN0YW5jZUVsZW1lbnRTZXFTZXF1ZW5jZSByZWxhdGVkSW5zdGFuY2VzKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAzNCkKKyAgICogUmV0dXJuIHRoZSBiYXNpYyBhcHBsaWNhdGlvbiByZWxhdGlvbnMgZGVyaXZlZCBmcm9tIHRoZSBiYXNlCisgICAqIHJlbGF0aW9uIHdpdGggdGhlIGdpdmVuIHJlbGF0aW9uIG5hbWUuCisgICAqIFRha2UgY2FyZSBhdCBtb3N0IGVsZW1lbnRzIG9ubHkgb25lIGFwcGxpY2F0aW9uIHJlbGF0aW9uIGNhbiBiZQorICAgKiBkZXJpdmVkIGZyb20gYSBiYXNlIHJlbGF0aW9uLCB0aGVyZSBhcmUgc29tZSB3ZWxsIGRlZmluZWQKKyAgICogZXhjZXB0aW9ucywgc28gdGhlIG1ldGhvZCBjYW4gcmV0dXJuIG1vcmUgdGhlbiBvbmUgYXBwbGljYXRpb24KKyAgICogcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJhc2VSZWxOYW1lICBUaGUgbmFtZSBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIHNlcXVlbmNlLCBpZiBubyByZWxhdGlvbiBpcyBmb3VuZAorICAgKiAgICAgICAgICBhbiBlbXB0eSBzZXF1ZW5jZSBpcyByZXR1cm5lZC4KKyAgICovCisgICBBcHBsaWNhdGlvblJlbGF0aW9uU2VxdWVuY2UgZ2V0UmVsYXRpb25zQnlCYXNlTmFtZSgKKyAgICAgIGluIE5hbWUgYmFzZVJlbE5hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEFwcGxpY2F0aW9uRWxlbWVudC4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBhcHBsaWNhdGlvbiByZWxhdGlvbiBpbnRlcmZhY2UuCisqIAorKiBBIHJlbGF0aW9uIGlzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdHdvIEFTQU0gT0RTIGVsZW1lbnRzOyBpdCBtYXkgYmUKKyogbmF2aWdhdGVkIGluIGJvdGgKKyogZGlyZWN0aW9ucy4gVGhlIGdldC0gYW5kIHNldC0gbWV0aG9kcyBhcmUgZGVmaW5lZCBmcm9tIHRoZSBmaXJzdAorKiBlbGVtZW50LCB0aGUgZ2V0SW52ZXJzZS0gYW5kCisqIHNldEludmVyc2UtIG1ldGhvZHMgd29yayBmcm9tIHRoZSBzZWNvbmQgZWxlbWVudC4KKyovCitpbnRlcmZhY2UgQXBwbGljYXRpb25SZWxhdGlvbiB7CisKKyAgIC8qKiAoNjAwMSkKKyAgICogR2V0IHRoZSBiYXNlIHJlbGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBiYXNlIHJlbGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4gQSAnbnVsbCcgaXMKKyAgICogICAgICAgICAgcmV0dXJuZWQgaWYgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIGhhcyBubyBiYXNlIHJlbGF0aW9uLgorICAgKi8KKyAgIEJhc2VSZWxhdGlvbiBnZXRCYXNlUmVsYXRpb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAwMikKKyAgICogR2V0IHRoZSBmaXJzdCBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBmaXJzdCBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICovCisgICBBcHBsaWNhdGlvbkVsZW1lbnQgZ2V0RWxlbTEoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAwMykKKyAgICogR2V0IHRoZSBzZWNvbmQgYXBwbGljYXRpb24gZWxlbWVudCBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2Vjb25kIGFwcGxpY2F0aW9uIGVsZW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudCBnZXRFbGVtMigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDA0KQorICAgKiBHZXQgdGhlIGludmVyc2UgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGludmVyc2UgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIFJlbGF0aW9uUmFuZ2UgZ2V0SW52ZXJzZVJlbGF0aW9uUmFuZ2UoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAwNSkKKyAgICogR2V0IHRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgaW52ZXJzZSByZWxhdGlvbnNoaXAgb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIFJlbGF0aW9uc2hpcCBnZXRJbnZlcnNlUmVsYXRpb25zaGlwKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDYwMDYpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqLworICAgTmFtZSBnZXRSZWxhdGlvbk5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAwNykKKyAgICogR2V0IHRoZSByZWxhdGlvbiByYW5nZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIFJlbGF0aW9uUmFuZ2UgZ2V0UmVsYXRpb25SYW5nZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDA4KQorICAgKiBHZXQgdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb25zaGlwIG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICovCisgICBSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDYwMDkpCisgICAqIEdldCB0aGUgcmVsYXRpb24gdHlwZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb24gdHlwZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25UeXBlIGdldFJlbGF0aW9uVHlwZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDEwKQorICAgKiBTZXQgdGhlIGJhc2UgcmVsYXRpb24gb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgcmVsYXRpb24gdHlwZSBhbmQgcmVsYXRpb24gcmFuZ2UgaXMgY29waWVkIGZyb20gdGhlIGJhc2UKKyAgICogcmVsYXRpb24uIFRoZSBwcmV2aW91cyB2YWx1ZXMgZ2V0IGxvc3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT04KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJhc2VSZWwgIFRoZSBiYXNlIHJlbGF0aW9uLgorICAgKi8KKyAgIHZvaWQgc2V0QmFzZVJlbGF0aW9uKAorICAgICAgaW4gQmFzZVJlbGF0aW9uIGJhc2VSZWwpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDExKQorICAgKiBTZXQgdGhlIGZpcnN0IGFwcGxpY2F0aW9uIGVsZW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfRUxFTUVOVAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXBwbEVsZW0gIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKi8KKyAgIHZvaWQgc2V0RWxlbTEoCisgICAgICBpbiBBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbEVsZW0pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDEyKQorICAgKiBTZXQgdGhlIHNlY29uZCBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24gb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0VMRU1FTlQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFwcGxFbGVtICBUaGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICovCisgICB2b2lkIHNldEVsZW0yKAorICAgICAgaW4gQXBwbGljYXRpb25FbGVtZW50IGFwcGxFbGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAxMykKKyAgICogU2V0IHRoZSByZWxhdGlvbiByYW5nZSBvZiBhbiBhcHBsaWNhdGlvbiByZWxhdGlvbi4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24gb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogSXQgaXMgb25seSBhbGxvd2VkIHRvIHNldCB0aGUgcmVsYXRpb24gdHlwZSBpZiBubyBiYXNlIHJlbGF0aW9uIGlzCisgICAqIGRlZmluZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfQkFTRV9SRUxBVElPTgorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT05fUkFOR0UKKyAgICogICAgQU9fSVNfQkFTRV9SRUxBVElPTgorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFyUmVsYXRpb25SYW5nZSAgVGhlIGludmVyc2UgcmVsYXRpb24gcmFuZ2UuCisgICAqLworICAgdm9pZCBzZXRJbnZlcnNlUmVsYXRpb25SYW5nZSgKKyAgICAgIGluIFJlbGF0aW9uUmFuZ2UgYXJSZWxhdGlvblJhbmdlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAxNCkKKyAgICogU2V0IHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIG91dHNpZGUgYQorICAgKiB0cmFuc2FjdGlvbiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0KKyAgICogbmFtZSBsZW5ndGggb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgc3RvcmFnZS4gQ3VycmVudCBzZXJ2ZXIKKyAgICogdHlwaWNhbGx5IGltcGxlbWVudGF0aW9ucyByZXN0cmljdCBpdCB0byAzMCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFyTmFtZSAgVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIG5hbWUuCisgICAqLworICAgdm9pZCBzZXRSZWxhdGlvbk5hbWUoCisgICAgICBpbiBOYW1lIGFyTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDYwMTUpCisgICAqIFNldCB0aGUgcmVsYXRpb24gcmFuZ2Ugb2YgYW4gYXBwbGljYXRpb24gcmVsYXRpb24uIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIG91dHNpZGUgYQorICAgKiB0cmFuc2FjdGlvbiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIEl0IGlzIG9ubHkgYWxsb3dlZCB0byBzZXQgdGhlIHJlbGF0aW9uIHR5cGUgaWYgbm8gYmFzZSByZWxhdGlvbiBpcworICAgKiBkZWZpbmVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSEFTX0JBU0VfUkVMQVRJT04KKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1JFTEFUSU9OX1JBTkdFCisgICAqICAgIEFPX0lTX0JBU0VfUkVMQVRJT04KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFyUmVsYXRpb25SYW5nZSAgVGhlIHJlbGF0aW9uIHJhbmdlLgorICAgKi8KKyAgIHZvaWQgc2V0UmVsYXRpb25SYW5nZSgKKyAgICAgIGluIFJlbGF0aW9uUmFuZ2UgYXJSZWxhdGlvblJhbmdlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAxNikKKyAgICogU2V0IHRoZSByZWxhdGlvbiB0eXBlIG9mIGFuIGFwcGxpY2F0aW9uIHJlbGF0aW9uLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgcmVsYXRpb25zaGlwIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gdGhlIHJlbGF0aW9uIHR5cGUgaXMgc2V0LgorICAgKiBJdCBpcyBvbmx5IGFsbG93ZWQgdG8gc2V0IHRoZSByZWxhdGlvbiB0eXBlIGlmIG5vIGJhc2UgcmVsYXRpb24gaXMKKyAgICogZGVmaW5lZC4KKyAgICogCisgICAqIEl0IGlzIG9ubHkgYWxsb3dlZCB0byBtb2RpZnkgYSByZWxhdGlvbiB0eXBlIHdoZW4gbm8gYmFzZSByZWxhdGlvbgorICAgKiBpcyBnaXZlbiwgb3RoZXJ3aXNlIHRoZSBleGNlcHRpb24gQU9fSEFTX0JBU0VfUkVMQVRJT04gaXMgdGhyb3duLgorICAgKiAKKyAgICogSXQgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSByZWxhdGlvbiB0eXBlIEZBVEhFUl9DSElMRCwgdGhlc2UKKyAgICogcmVsYXRpb24gdHlwZSBpcyByZXNlcnZlZCBmb3IgdGhlIGJhc2UgbW9kZWwuIFRoZSB0d28gcmVsYXRpb24gdHlwZXMKKyAgICogd2hpY2ggY2FuIGJlIHNldCBhcmUgIElORk8gb3IgSU5IRVJJVEFOQ0UuIAorICAgKiAKKyAgICogVGhlIHJlbGF0aW9uc2hpcCBpcyBzZXQgYXV0b21hdGljIHdoZW4gdGhlIHJlbGF0aW9uIHR5cGUgaXMgc2V0LCB0aGUKKyAgICogbWF4aW11bSBvZiB0aGUgcmVsYXRpb24gcmFuZ2UgZGV0ZXJtaW5lcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4KKyAgICogdGhlIGVsZW1lbnRzIG9mIHRoZSByZWxhdGlvbi4KKyAgICogCisgICAqIFIuVHlwZSAgICAgIHwgbWF4IFIuUmFuZ2UgfCBtYXggaW52LiBSLlJhbmdlIHwgUmVsYXRpb25zaGlwICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgCisgICAqIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tICAgICAgICAgCisgICAqICAgICAgICAgICAgICAKKyAgICogSU5GTyAgICAgICAgfCAxICAgICAgICAgICB8IDEgICAgICAgICAgICAgICAgfCBleGNlcHRpb24sCisgICAqIEFPX0lOVkFMSURfUkVMQVRJT05fVFlQRSAKKyAgICogLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0gICAgICAgICAKKyAgICogICAgICAgIAorICAgKiBJTkZPICAgICAgICB8IDEgICAgICAgICAgIHwgTUFOWSAgICAgICAgICAgICB8IElORk9fVE8gICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgIAorICAgKiAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgCisgICAqIElORk8gICAgICAgIHwgTUFOWSAgICAgICAgfCAxICAgICAgICAgICAgICAgIHwgSU5GT19GUk9NICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgCisgICAqIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tICAgICAgICAgCisgICAqICAgICAgICAgICAgICAKKyAgICogSU5GTyAgICAgICAgfCBNQU5ZICAgICAgICB8IE1BTlkgICAgICAgICAgICAgfCBJTkZPICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAKKyAgICogLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0gICAgICAgICAKKyAgICogICAgICAgICAgICAgIAorICAgKiBJTkhFUklUQU5DRSB8IDEgICAgICAgICAgIHwgMSAgICAgICAgICAgICAgICB8IGV4Y2VwdGlvbiwKKyAgICogQU9fSU5WQUxJRF9SRUxBVElPTl9UWVBFIAorICAgKiAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgCisgICAqIElOSEVSSVRBTkNFIHwgMSAgICAgICAgICAgfCBNQU5ZICAgICAgICAgICAgIHwgU1VQRVJUWVBFICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgCisgICAqIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tICAgICAgICAgCisgICAqICAgICAgICAgICAgICAKKyAgICogSU5IRVJJVEFOQ0UgfCBNQU5ZICAgICAgICB8IDEgICAgICAgICAgICAgICAgfCBTVUJUWVBFICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAKKyAgICogLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0gICAgICAgICAKKyAgICogICAgICAgICAgICAgIAorICAgKiBJTkhFUklUQU5DRSB8IE1BTlkgICAgICAgIHwgTUFOWSAgICAgICAgICAgICB8IGV4Y2VwdGlvbiwKKyAgICogQU9fSU5WQUxJRF9SRUxBVElPTl9UWVBFCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfQkFTRV9SRUxBVElPTgorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT05fVFlQRQorICAgKiAgICBBT19JU19CQVNFX1JFTEFUSU9OCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhclJlbGF0aW9uVHlwZSAgVGhlIHJlbGF0aW9uIHR5cGUuCisgICAqLworICAgdm9pZCBzZXRSZWxhdGlvblR5cGUoCisgICAgICBpbiBSZWxhdGlvblR5cGUgYXJSZWxhdGlvblR5cGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDE3KQorICAgKiBHZXQgdGhlIGludmVyc2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uIFRoZSBpbnZlcnNlIG5hbWUKKyAgICogb2YgYW4gYXBwbGljYXRpb24gcmVsYXRpb24gaXMgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHNlZW4gZnJvbSB0aGUKKyAgICogb3RoZXIgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnZlcnNlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIE5hbWUgZ2V0SW52ZXJzZVJlbGF0aW9uTmFtZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDE4KQorICAgKiBTZXQgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24gb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXJJbnZOYW1lICBUaGUgaW52ZXJzZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBuYW1lLgorICAgKi8KKyAgIHZvaWQgc2V0SW52ZXJzZVJlbGF0aW9uTmFtZSgKKyAgICAgIGluIE5hbWUgYXJJbnZOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBBcHBsaWNhdGlvblJlbGF0aW9uLgorCisvKioKKyogVGhlIEFTQU0gT0RTIGFwcGxpY2F0aW9uIHN0cnVjdHVyZSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEFwcGxpY2F0aW9uU3RydWN0dXJlIHsKKworICAgLyoqICg3MDAxKQorICAgKiBDaGVjayB0aGUgYXBwbGljYXRpb24gbW9kZWwgZm9yIEFTQU0gT0RTIGNvbmZvcm1pdHkuIFRoZSBmaXJzdCBlcnJvcgorICAgKiBmb3VuZCBpcyByZXBvcnRlZCBieSBhbiBleGNlcHRpb24uIFRoZSBmb2xsb3dpbmcgY2hlY2tzIGFyZQorICAgKiBwZXJmb3JtZWQ6CisgICAqIAorICAgKiAgLSBFYWNoIGFwcGxpY2F0aW9uIGVsZW1lbnQgbXVzdCBiZSBkZXJpdmVkIGZyb20gYSB2YWxpZCBiYXNlCisgICAqIGVsZW1lbnQuCisgICAqICAtIEFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpcyBkZXJpdmVkIGZyb20gb25lIGJhc2UgYXR0cmlidXRlLiBJdAorICAgKiBpcyBub3QgYWxsb3dlZCB0byBkZXJpdmUgbW9yZSB0aGUgb25lIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBmcm9tIHRoZQorICAgKiBzYW1lIGJhc2UgYXR0cmlidXRlLiBJdCBpcyBhbGxvd2VkIHRoYXQgYXBwbGljYXRpb24gYXR0cmlidXRlcyBhcmUKKyAgICogbm90IGRlcml2ZWQgZnJvbSBhbnkgYmFzZSBhdHRyaWJ1dGUuCisgICAqICAtIEFsbCBhcHBsaWNhdGlvbiBlbGVtZW50cyBtdXN0IGhhdmUgYXQgbGVhc3QgdGhlIG1hbmRhdG9yeQorICAgKiBhdHRyaWJ1dGVzLgorICAgKiAgLSBFYWNoIGFwcGxpY2F0aW9uIGVsZW1lbnRzIG11c3QgYmUgaWRlbnRpZmllZCBieSBhIHVuaXF1ZSBBc2FtCisgICAqIHBhdGguIE5vICJmbG9hdGluZyIgYXBwbGljYXRpb24gZWxlbWVudHMgYXJlIGFsbG93ZWQuCisgICAqICAtIEFsbCByZWxhdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGJhc2UgbW9kZWwgbXVzdCBiZSBwcmVzZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9CQVNFX0FUVFJJQlVURQorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT04KKyAgICogICAgQU9fTUlTU0lOR19BVFRSSUJVVEUKKyAgICogICAgQU9fTUlTU0lOR19SRUxBVElPTgorICAgKiAgICBBT19NSVNTSU5HX0FQUExJQ0FUSU9OX0VMRU1FTlQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX1BBVEhfVE9fRUxFTUVOVAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBjaGVjaygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDAyKQorICAgKiBDcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gZWxlbWVudCBpbiB0aGUgYXBwbGljYXRpb24gbW9kZWwuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIG1vZGVsIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBpbmZvcm1hdGlvbiB3aGV0aGVyIG9yIG5vdCB0aGUgbmV3IGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgYSB0b3AKKyAgICogbGV2ZWwgZWxlbWVudCBpcyB0YWtlbiBmcm9tIHRoZSBzcGVjaWZpZWQgYmFzZSBlbGVtZW50LiBUaGUgSWQgb2YKKyAgICogdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgc2V0IGF1dG9tYXRpY2FsbHkuIFRoZSBtYW5kYXRvcnkgYmFzZQorICAgKiBhdHRyaWJ1dGVzIGFyZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuIE9wdGlvbmFsIGF0dHJpYnV0ZXMgaGF2ZSB0byBiZQorICAgKiBjcmVhdGVkIGJ5IHRoZSBjYWxsaW5nIHByb2dyYW0uIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgaW50ZXJmYWNlCisgICAqIG1ldGhvZHMgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBhdHRyaWJ1dGVzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmFzZUVsZW0gIFRoZSBiYXNlIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgYXBwbGljYXRpb24KKyAgICogICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyBkZXJpdmVkLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgQXBwbGljYXRpb25FbGVtZW50IGNyZWF0ZUVsZW1lbnQoCisgICAgICBpbiBCYXNlRWxlbWVudCBiYXNlRWxlbSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMDMpCisgICAqIENyZWF0ZSBhIG5ldyByZWxhdGlvbi4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gbW9kZWwgb3V0c2lkZSBhIHRyYW5zYWN0aW9uCisgICAqIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIHJlbGF0aW9uIGlzIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIG1vZGVsLiBUaGUgYXBwbGljYXRpb24KKyAgICogcmVsYXRpb24gaW50ZXJmYWNlIG1ldGhvZHMgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSByZWxhdGlvbi4KKyAgICogCisgICAqIFRoZSBkZWZhdWx0IHByb3BlcnRpZXMgb2YgYSBuZXcgYXBwbGljYXRpb24gcmVsYXRpb24gYXJlOgorICAgKiAgICBCYXNlUmVsYXRpb24gICBOVUxMCisgICAqICAgIEVsZW1lbnQxICAgICAgIE5VTEwKKyAgICogICAgRWxlbWVudDIgICAgICAgTlVMTAorICAgKiAgICBSYW5nZSAgICAgICAgICAtMiwgLTIKKyAgICogICAgTmFtZSAgICAgICAgICAgTlVMTAorICAgKiAgICBUeXBlICAgICAgICAgICBJTkZPCisgICAqIFdoZW4gZWxlbWVudCAxIG9yIGVsZW1lbnQgMiBpcyBzZXQgYmVmb3JlIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbgorICAgKiBpcyBzcGVjaWZpZWQsIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBpcyBzZXQgdG8KKyAgICogIkFVVE9HRU4iLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAwNCkKKyAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IHdpdGggdGhlIHJlcXVlc3RlZCBJZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZUlkICBUaGUgSWQgb2YgdGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgQXBwbGljYXRpb25FbGVtZW50IGdldEVsZW1lbnRCeUlkKAorICAgICAgaW4gVF9MT05HTE9ORyBhZUlkKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAwNSkKKyAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IHdpdGggdGhlIHJlcXVlc3RlZCBuYW1lLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFlTmFtZSAgVGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgQXBwbGljYXRpb25FbGVtZW50IGdldEVsZW1lbnRCeU5hbWUoCisgICAgICBpbiBOYW1lIGFlTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMDYpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZQorICAgKiBwYXR0ZXJuIGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFlUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgcmVxdWVzdGVkCisgICAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICovCisgICBBcHBsaWNhdGlvbkVsZW1lbnRTZXF1ZW5jZSBnZXRFbGVtZW50cygKKyAgICAgIGluIFBhdHRlcm4gYWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAwNykKKyAgICogR2V0IHRoZSBuYW1lcyBvZiBhcHBsaWNhdGlvbiBlbGVtZW50cyB0aGF0IGFyZSBkZXJpdmVkIGZyb20gdGhlCisgICAqIHNwZWNpZmllZCBiYXNlIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQkFTRVRZUEUKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZVR5cGUgIFRoZSByZXF1ZXN0ZWQgYmFzZSBlbGVtZW50IHR5cGUuIFRoZSBiYXNlIGVsZW1lbnQKKyAgICogICAgICAgICAgICAgICAgIHR5cGUgY2FuIGJlIGEgcGF0dGVybi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWVzLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlIGdldEVsZW1lbnRzQnlCYXNlVHlwZSgKKyAgICAgIGluIEJhc2VUeXBlIGFlVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMDgpCisgICAqIEdldCB0aGUgaW5zdGFuY2UgZWxlbWVudCBzcGVjaWZpZWQgYnkgdGhlIEFTQU0gcGF0aC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9BU0FNX1BBVEgKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhc2FtUGF0aCAgVGhlIEFTQU0gcGF0aCBvZiB0aGUgcmVxdWVzdGVkIGluc3RhbmNlIGVsZW1lbnQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2UgZWxlbWVudC4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnQgZ2V0SW5zdGFuY2VCeUFzYW1QYXRoKAorICAgICAgaW4gTmFtZSBhc2FtUGF0aCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMDkpCisgICAqIFJldHVybnMgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHR3byBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhcHBsRWxlbTEgIFRoZSBmaXJzdCBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIGFwcGxFbGVtMiAgVGhlIHNlY29uZCBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb25zIGJldHdlZW4gdGhlIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICovCisgICBBcHBsaWNhdGlvblJlbGF0aW9uU2VxdWVuY2UgZ2V0UmVsYXRpb25zKAorICAgICAgaW4gQXBwbGljYXRpb25FbGVtZW50IGFwcGxFbGVtMSwKKyAgICAgIGluIEFwcGxpY2F0aW9uRWxlbWVudCBhcHBsRWxlbTIpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDEwKQorICAgKiBHZXQgdGhlIHRvcCBsZXZlbCBhcHBsaWNhdGlvbiBlbGVtZW50cyB3aGljaCBhcmUgaW5oZXJpdGVkIGZyb20gdGhlCisgICAqIGJhc2UgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIGJhc2UgdHlwZS4gSWYgdGhlIGdpdmVuIGJhc2UgdHlwZSBpcworICAgKiBubyB0b3AgbGV2ZWwgYmFzZSBlbGVtZW50IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEEgdG9wIGxldmVsCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgYW4gYXBwbGljYXRpb24gZWxlbWVudCB3aXRob3V0IGEgZmF0aGVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWVUeXBlICBUaGUgcmVxdWVzdGVkIGJhc2UgdHlwZS4gVGhlIGJhc2UgZWxlbWVudCB0eXBlIGNhbgorICAgKiAgICAgICAgICAgICAgICAgYmUgYSBwYXR0ZXJuLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdG9wIGxldmVsIGFwcGxpY2F0aW9uIGVsZW1lbnRzLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlIGdldFRvcExldmVsRWxlbWVudHMoCisgICAgICBpbiBCYXNlVHlwZSBhZVR5cGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDExKQorICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50cyB0aGF0ICBtYXRjaCB0aGUgcGF0dGVybi4KKyAgICogVGhlIHBhdHRlcm4gaXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWVQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSByZXF1ZXN0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGJhc2UgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RFbGVtZW50cygKKyAgICAgIGluIFBhdHRlcm4gYWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAxMikKKyAgICogR2V0IHRoZSBuYW1lcyBvZiBhcHBsaWNhdGlvbiBlbGVtZW50cyB0aGF0IGFyZSAgZGVyaXZlZCBmcm9tIHRoZQorICAgKiBnaXZlbiBiYXNlIHR5cGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQkFTRVRZUEUKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZVR5cGUgIFRoZSByZXF1ZXN0ZWQgYmFzZSB0eXBlLiBUaGUgYmFzZSBlbGVtZW50IHR5cGUgY2FuCisgICAqICAgICAgICAgICAgICAgICBiZSBhIHBhdHRlcm4uCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RFbGVtZW50c0J5QmFzZVR5cGUoCisgICAgICBpbiBCYXNlVHlwZSBhZVR5cGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDEzKQorICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSB0b3AgbGV2ZWwgYXBwbGljYXRpb24gZWxlbWVudHMgdGhhdCBhcmUgZGVyaXZlZAorICAgKiBmcm9tIHRoZSBnaXZlbiBiYXNlIHR5cGUuIElmIHRoZSBnaXZlbiBiYXNlIHR5cGUgaXMgbm90IGEgdG9wIGxldmVsCisgICAqIGJhc2UgZWxlbWVudCBhbiBleGNlcHRpb24gaXMgdGhyb3duLiBBIHRvcCBsZXZlbCBhcHBsaWNhdGlvbiBlbGVtZW50CisgICAqIGlzIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQgd2l0aG91dCBhIGZhdGhlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9CQVNFVFlQRQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFlVHlwZSAgVGhlIHJlcXVlc3RlZCBiYXNlIHR5cGUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RUb3BMZXZlbEVsZW1lbnRzKAorICAgICAgaW4gQmFzZVR5cGUgYWVUeXBlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAxNCkKKyAgICogUmVtb3ZlIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQgZnJvbSB0aGUgYXBwbGljYXRpb24gbW9kZWwuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIG1vZGVsIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqICAgLSBPbmx5IGFsbG93ZWQ6CisgICAqICAgICAgIC0gaWYgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgZW1wdHkKKyAgICogICAgICAgICAoaGFzIG5vIGluc3RhbmNlcykuCisgICAqICAgICAgIC0gbm8gcmVsYXRpb25zIHdpdGggb3RoZXIgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfSU5TVEFOQ0VTCisgICAqICAgIEFPX0hBU19SRUZFUkVOQ0VTCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhcHBsRWxlbSAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICovCisgICB2b2lkIHJlbW92ZUVsZW1lbnQoCisgICAgICBpbiBBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbEVsZW0pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDE1KQorICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFuIGFwcGxpY2F0aW9uIHJlbGF0aW9uIGZyb20gdGhlIG1vZGVsLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBtb2RlbCBvdXRzaWRlIGEgdHJhbnNhY3Rpb24KKyAgICogYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgZWxlbWVudHMgb2YgdGhlIHJlbGF0aW9uIGFyZSBzdGlsbCBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiBtb2RlbC4gSWYgdGhlcmUgYXJlIGluc3RhbmNlcyBvZiB0aGUgcmVsYXRpb24gdGhleSBhcmUgYWxzbyByZW1vdmVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSEFTX0lOU1RBTkNFUworICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXBwbFJlbCAgVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIHRvIGJlIHJlbW92ZWQuCisgICAqLworICAgdm9pZCByZW1vdmVSZWxhdGlvbigKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbFJlbCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMTYpCisgICAqIEdldCB0aGUgaW5zdGFuY2UgZWxlbWVudHMgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50IGlkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0FTQU1fUEFUSAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGllSWRzICBUaGUgc2VxdWVuY2Ugd2l0aCB0aGUgZWxlbWVudCBpZC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBlbGVtZW50IHNlcXVlbmNlLgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudFNlcXVlbmNlIGdldEluc3RhbmNlc0J5SWQoCisgICAgICBpbiBFbGVtSWRTZXF1ZW5jZSBpZUlkcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMTcpCisgICAqIEdldCB0aGUgY3VycmVudCBjbGllbnQgc2Vzc2lvbiBpbiB3aGljaCB0aGUgYXBwbGljYXRpb24gbW9kZWwgaXMKKyAgICogY3JlYXRlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGN1cnJlbnQgY2xpZW50IHNlc3Npb24uCisgICAqLworICAgQW9TZXNzaW9uIGdldFNlc3Npb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAxOCkKKyAgICogQ3JlYXRlIGEgbmV3IGVudW1lcmF0aW9uIGRlZmluaXRpb24uIFRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZQorICAgKiBhcHBsaWNhdGlvbiBtb2RlbCBhbmQgaXMgb25seSBhbGxvd2VkIGZvciB0aGUgc3VwZXIgdXNlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqCisgICAqIEBwYXJhbSAgZW51bU5hbWUgIE5hbWUgb2YgdGhlIGVudW1lcmF0aW9uCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXcgY3JlYXRlZCBlbnVtZXJhdGlvbgorICAgKi8KKyAgIEVudW1lcmF0aW9uRGVmaW5pdGlvbiBjcmVhdGVFbnVtZXJhdGlvbkRlZmluaXRpb24oCisgICAgICBpbiBUX1NUUklORyBlbnVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMTkpCisgICAqIFJlbW92ZSB0aGUgZW51bWVyYXRpb24gZGVmaW5pdGlvbi4gVGhlIHNlcnZlciBjaGVja3MgaWYgdGhlCisgICAqIGVudW1lcmF0aW9uIGlzIHN0aWxsIGluIHVzZSBieSBvbmUgb2YgdGhlIGF0dHJpYnV0ZXMuIFRoaXMgbWV0aG9kCisgICAqIG1vZGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBtb2RlbCBhbmQgaXMgb25seSBhbGxvd2VkIGZvciB0aGUgc3VwZXIKKyAgICogdXNlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqCisgICAqIEBwYXJhbSAgZW51bU5hbWUgIE5hbWUgb2YgdGhlIGVudW1lcmF0aW9uIHRvIHJlbW92ZS4KKyAgICovCisgICB2b2lkIHJlbW92ZUVudW1lcmF0aW9uRGVmaW5pdGlvbigKKyAgICAgIGluIFRfU1RSSU5HIGVudW1OYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAyMCkKKyAgICogR2V0IHRoZSBsaXN0IG9mIGFsbCBlbnVtZXJhdGlvbiBuYW1lcy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgTGlzdCB3aXRoIGFsbCBlbnVtZXJhdGlvbiBuYW1lcy4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdEVudW1lcmF0aW9ucygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDIxKQorICAgKiBHZXQgdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGVudW1OYW1lICBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZW51bWVyYXRpb24uCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBlbnVtZXJhdGlvbiBkZWZpbml0aW9uLgorICAgKi8KKyAgIEVudW1lcmF0aW9uRGVmaW5pdGlvbiBnZXRFbnVtZXJhdGlvbkRlZmluaXRpb24oCisgICAgICBpbiBUX1NUUklORyBlbnVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMjIpCisgICAqIENyZWF0ZSB0aGUgcmVsYXRpb24gYmV0d2VlbiBhIGxpc3Qgb2YgaW5zdGFuY2VzLiBUaGUgbnVtYmVyIG9mCisgICAqIGluc3RhbmNlcyBpbiBib3RoIGxpc3QgbXVzdCBiZSBpZGVudGljYWwuIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9mCisgICAqIHRoZSBpbnN0YW5jZXMgaW4gZWFjaCBsaXN0IG11c3QgYmUgaWRlbnRpY2FsLiBUaGUgYXBwbGljYXRpb24KKyAgICogZWxlbWVudHMgbXVzdCBtYXRjaCB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAqIHJlbGF0aW9uLiBUaGUgaW5kZXggaW4gdGhlIGxpc3Qgb2YgdGhlIGluc3RhbmNlcyBkZWZpbmVzIHJlbGF0ZWQKKyAgICogaW5zdGFuY2VzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0lOVkFMSURfUkVRVUVTVAorICAgKgorICAgKiBAcGFyYW0gIGFwcGxSZWwgIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICBlbGVtTGlzdDEgIFRoZSBsaXN0IHdpdGggdGhlIGluc3RhbmNlcyBvZiBvbmUgYXBwbGljYXRpb24KKyAgICogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSByZWxhdGlvbiB3aWxsIGJlIGNyZWF0ZWQuCisgICAqCisgICAqIEBwYXJhbSAgZWxlbUxpc3QyICBUaGUgbGlzdCB3aXRoIHRoZSByZWxhdGVkIGluc3RhbmNlcy4KKyAgICovCisgICB2b2lkIGNyZWF0ZUluc3RhbmNlUmVsYXRpb25zKAorICAgICAgaW4gQXBwbGljYXRpb25SZWxhdGlvbiBhcHBsUmVsLAorICAgICAgaW4gSW5zdGFuY2VFbGVtZW50U2VxdWVuY2UgZWxlbUxpc3QxLAorICAgICAgaW4gSW5zdGFuY2VFbGVtZW50U2VxdWVuY2UgZWxlbUxpc3QyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBBcHBsaWNhdGlvblN0cnVjdHVyZS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBiYXNlIGF0dHJpYnV0ZSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEJhc2VBdHRyaWJ1dGUgeworCisgICAvKiogKDgwMDEpCisgICAqIEdldCB0aGUgZGF0YSB0eXBlIG9mIHRoZSBiYXNlIGF0dHJpYnV0ZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJhc2UgYXR0cmlidXRlLgorICAgKi8KKyAgIERhdGFUeXBlIGdldERhdGFUeXBlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDgwMDIpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUuCisgICAqLworICAgTmFtZSBnZXROYW1lKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDgwMDMpCisgICAqIEdldCB0aGUgb2JsaWdhdG9yeSBmbGFnIG9mIHRoZSBiYXNlIGF0dHJpYnV0ZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlLgorICAgKi8KKyAgIFRfQk9PTEVBTiBpc09ibGlnYXRvcnkoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoODAwNCkKKyAgICogR2V0IHRoZSB1bmlxdWUgZmxhZyBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdW5pcXVlIGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlLgorICAgKi8KKyAgIFRfQk9PTEVBTiBpc1VuaXF1ZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg4MDA1KQorICAgKiBSZXR1cm4gdGhlIGJhc2UgZWxlbWVudCB0byB3aGljaCB0aGUgYXR0cmlidXRlIGJlbG9uZ3MuLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmFzZSBlbGVtZW50IG9mIHRoZSBhdHRyaWJ1dGUuCisgICAqLworICAgQmFzZUVsZW1lbnQgZ2V0QmFzZUVsZW1lbnQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoODAwNikKKyAgICogR2V0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19JTlZBTElEX0RBVEFUWVBFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBBU0FNIE9EUyBlbnVtZXJhdGlvbi4KKyAgICovCisgICBFbnVtZXJhdGlvbkRlZmluaXRpb24gZ2V0RW51bWVyYXRpb25EZWZpbml0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgQmFzZUF0dHJpYnV0ZS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBiYXNlIGVsZW1lbnQgaW50ZXJmYWNlLgorKi8KK2ludGVyZmFjZSBCYXNlRWxlbWVudCB7CisKKyAgIC8qKiAoOTAwMSkKKyAgICogR2V0IGFsbCBrbm93biByZWxhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIEFsbCBrbm93biByZWxhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICovCisgICBCYXNlUmVsYXRpb25TZXF1ZW5jZSBnZXRBbGxSZWxhdGlvbnMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoOTAwMikKKyAgICogR2V0IGF0dHJpYnV0ZXMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBiYVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHJlcXVlc3RlZAorICAgKiAgICAgICAgICAgICAgICAgICAgYmFzZSBhdHRyaWJ1dGVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICovCisgICBCYXNlQXR0cmlidXRlU2VxdWVuY2UgZ2V0QXR0cmlidXRlcygKKyAgICAgIGluIFBhdHRlcm4gYmFQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoOTAwMykKKyAgICogR2V0IHRoZSByZWxhdGVkIGVsZW1lbnRzIG9mIGEgYmFzZSBlbGVtZW50IGRlZmluZWQgYnkgdGhlCisgICAqIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTlNISVAKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBiclJlbGF0aW9uc2hpcCAgVGhlIHJlcXVlc3RlZCByZWxhdGlvbnNoaXAuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZWxhdGVkIGVsZW1lbnRzIG9mIGEgYmFzZSBlbGVtZW50LgorICAgKi8KKyAgIEJhc2VFbGVtZW50U2VxdWVuY2UgZ2V0UmVsYXRlZEVsZW1lbnRzQnlSZWxhdGlvbnNoaXAoCisgICAgICBpbiBSZWxhdGlvbnNoaXAgYnJSZWxhdGlvbnNoaXApCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg5MDA0KQorICAgKiBHZXQgdGhlIGJhc2UgZWxlbWVudCdzIHJlbGF0aW9ucyBvZiB0aGUgcmVxdWVzdGVkIHJlbGF0aW9uIHR5cGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT05fVFlQRQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJyUmVsYXRpb25UeXBlICBUaGUgcmVxdWVzdGVkIHJlbGF0aW9uIHR5cGUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBiYXNlIGVsZW1lbnQncyByZWxhdGlvbnMgb2YgdGhlIHJlcXVlc3RlZCB0eXBlLgorICAgKi8KKyAgIEJhc2VSZWxhdGlvblNlcXVlbmNlIGdldFJlbGF0aW9uc0J5VHlwZSgKKyAgICAgIGluIFJlbGF0aW9uVHlwZSBiclJlbGF0aW9uVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDkwMDUpCisgICAqIEdldCB0aGUgdHlwZSBvZiB0aGUgYmFzZSBlbGVtZW50LiBUaGUgdHlwZSBvZiB0aGUgYmFzZSBlbGVtZW50IGlzCisgICAqIGlkZW50aWNhbCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBiYXNlIGVsZW1lbnQuIFRoZSB0eXBlIG9mIHRoZSBiYXNlCisgICAqIGVsZW1lbnQgaXMgYSBzdHJpbmcuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdHlwZSBvZiB0aGUgYmFzZSBlbGVtZW50LgorICAgKi8KKyAgIEJhc2VUeXBlIGdldFR5cGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoOTAwNikKKyAgICogR2V0IHdoZXRoZXIgb3Igbm90IHRoZSBiYXNlIGVsZW1lbnQgaXMgYSB0b3AgbGV2ZWwgZWxlbWVudC4gVG9wCisgICAqIGxldmVsIGVsZW1lbnRzIGFyZSBlbGVtZW50cyB3aXRob3V0IGEgZmF0aGVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgQm9vbGVhbiB3aGV0aGVyIG9yIG5vdCB0aGUgYmFzZSBlbGVtZW50IGlzIGEgdG9wIGxldmVsCisgICAqICAgICAgICAgIGVsZW1lbnQuCisgICAqLworICAgVF9CT09MRUFOIGlzVG9wTGV2ZWwoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoOTAwNykKKyAgICogR2V0IGF0dHJpYnV0ZSBuYW1lcyBvZiB0aGUgYmFzZSBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJhUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgcmVxdWVzdGVkCisgICAqICAgICAgICAgICAgICAgICAgICBiYXNlIGF0dHJpYnV0ZSBuYW1lcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUgbmFtZXMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdEF0dHJpYnV0ZXMoCisgICAgICBpbiBQYXR0ZXJuIGJhUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDkwMDgpCisgICAqIEdldCB0aGUgcmVsYXRlZCBlbGVtZW50IG5hbWVzIG9mIHRoZSBiYXNlIGVsZW1lbnQgZGVmaW5lZCBieSB0aGUKKyAgICogcmVsYXRpb25zaGlwLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1JFTEFUSU9OU0hJUAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJyUmVsYXRpb25zaGlwICBUaGUgcmVxdWVzdGVkIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlbGF0ZWQgZWxlbWVudCBuYW1lcyBvZiB0aGUgYmFzZSBlbGVtZW50LgorICAgKi8KKyAgIEJhc2VUeXBlU2VxdWVuY2UgbGlzdFJlbGF0ZWRFbGVtZW50c0J5UmVsYXRpb25zaGlwKAorICAgICAgaW4gUmVsYXRpb25zaGlwIGJyUmVsYXRpb25zaGlwKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBCYXNlRWxlbWVudC4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBiYXNlIHJlbGF0aW9uIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgQmFzZVJlbGF0aW9uIHsKKworICAgLyoqICgxMDAwMSkKKyAgICogR2V0IHRoZSBmaXJzdCBiYXNlIGVsZW1lbnQgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZmlyc3QgYmFzZSBlbGVtZW50IG9mIHRoZSBiYXNlIHJlbGF0aW9uLgorICAgKi8KKyAgIEJhc2VFbGVtZW50IGdldEVsZW0xKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEwMDAyKQorICAgKiBHZXQgdGhlIHNlY29uZCBiYXNlIGVsZW1lbnQgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2Vjb25kIGJhc2UgZWxlbWVudCBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICovCisgICBCYXNlRWxlbWVudCBnZXRFbGVtMigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwMykKKyAgICogR2V0IHRoZSBpbnZlcnNlIHJlbGF0aW9uIHJhbmdlIG9mIHRoZSBiYXNlIHJlbGF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGludmVyc2UgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25SYW5nZSBnZXRJbnZlcnNlUmVsYXRpb25SYW5nZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwNCkKKyAgICogR2V0IHRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICovCisgICBSZWxhdGlvbnNoaXAgZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwNSkKKyAgICogR2V0IHRoZSByZWxhdGlvbiBuYW1lIG9mIHRoZSBiYXNlIHJlbGF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlbGF0aW9uIG5hbWUgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgTmFtZSBnZXRSZWxhdGlvbk5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTAwMDYpCisgICAqIEdldCB0aGUgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25SYW5nZSBnZXRSZWxhdGlvblJhbmdlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEwMDA3KQorICAgKiBHZXQgdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwOCkKKyAgICogR2V0IHRoZSByZWxhdGlvbiB0eXBlIG9mIHRoZSBiYXNlIHJlbGF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlbGF0aW9uIHR5cGUgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25UeXBlIGdldFJlbGF0aW9uVHlwZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwOSkKKyAgICogUmV0dXJuIHRoZSBpbnZlcnNlIG5hbWUgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lIG9mIHRoZSBpbnZlcnNlIHJlbGF0aW9uLgorICAgKi8KKyAgIE5hbWUgZ2V0SW52ZXJzZVJlbGF0aW9uTmFtZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEJhc2VSZWxhdGlvbi4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBiYXNlIHN0cnVjdHVyZSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEJhc2VTdHJ1Y3R1cmUgeworCisgICAvKiogKDExMDAxKQorICAgKiBHZXQgdGhlIGJhc2UgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCB0eXBlLiBUaGUgdHlwZSBvZiBhCisgICAqIGJhc2UgZWxlbWVudCBpcyBpZGVudGljYWwgd2l0aCB0aGUgbmFtZSBvZiB0aGUgYmFzZSBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmVUeXBlICBUaGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGJhc2UgZWxlbWVudC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBiYXNlIGVsZW1lbnQuCisgICAqLworICAgQmFzZUVsZW1lbnQgZ2V0RWxlbWVudEJ5VHlwZSgKKyAgICAgIGluIEJhc2VUeXBlIGJlVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDExMDAyKQorICAgKiBHZXQgdGhlIGJhc2UgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIHBhdHRlcm4gaXMgY2FzZQorICAgKiBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmVQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSByZXF1ZXN0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGJhc2UgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0ZWQgYmFzZSBlbGVtZW50cy4KKyAgICovCisgICBCYXNlRWxlbWVudFNlcXVlbmNlIGdldEVsZW1lbnRzKAorICAgICAgaW4gUGF0dGVybiBiZVBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMTAwMykKKyAgICogR2V0IHRoZSBiYXNlIHJlbGF0aW9uIGJldHdlZW4gdHdvIGJhc2UgZWxlbWVudHMuIFRoZSBiYXNlIHJlbGF0aW9uCisgICAqIGlzIGdpdmVuIGZyb20gdGhlIGZpcnN0IGVsZW1lbnQgKHBhcmFtZXRlciBlbGVtMSkgdG8gdGhlIHNlY29uZAorICAgKiBlbGVtZW50IChwYXJhbWV0ZXIgZWxlbTIpLCB0aGUgaW52ZXJzZSByZWxhdGlvbiBpcyBub3QgZ2l2ZW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKgorICAgKiBAcGFyYW0gIGVsZW0xICBUaGUgYmFzZSBlbGVtZW50IGZyb20gd2hpY2ggdGhlIHJlbGF0aW9uIHN0YXJ0cy4KKyAgICoKKyAgICogQHBhcmFtICBlbGVtMiAgVGhlIGJhc2UgZWxlbWVudCB0byB3aGljaCB0aGUgcmVsYXRpb24gcG9pbnRzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmFzZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gYmFzZSBlbGVtZW50cy4KKyAgICovCisgICBCYXNlUmVsYXRpb24gZ2V0UmVsYXRpb24oCisgICAgICBpbiBCYXNlRWxlbWVudCBlbGVtMSwKKyAgICAgIGluIEJhc2VFbGVtZW50IGVsZW0yKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTEwMDQpCisgICAqIEdldCB0aGUgdG9wIGxldmVsIGJhc2UgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIHBhdHRlcm4KKyAgICogaXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuIEEgdG9wIGxldmVsCisgICAqIGJhc2UgZWxlbWVudCBpcyBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGEgZmF0aGVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJlUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgcmVxdWVzdGVkCisgICAqICAgICAgICAgICAgICAgICAgICB0b3AgbGV2ZWwgYmFzZSBlbGVtZW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCB0b3AgbGV2ZWwgYmFzZSBlbGVtZW50cy4KKyAgICovCisgICBCYXNlRWxlbWVudFNlcXVlbmNlIGdldFRvcExldmVsRWxlbWVudHMoCisgICAgICBpbiBQYXR0ZXJuIGJlUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDExMDA1KQorICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgbW9kZWwuIFRoZSB2ZXJzaW9uIG9mIHRoZSBiYXNlIG1vZGVsIGlzCisgICAqIHRoZSB2ZXJzaW9uIG9mIHRoZSBBU0FNIE9EUyBiYXNlIG1vZGVsLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZlcnNpb24gb2YgdGhlIEFTQU0gT0RTIGJhc2UgbW9kZWwuCisgICAqLworICAgVF9TVFJJTkcgZ2V0VmVyc2lvbigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMTAwNikKKyAgICogR2V0IHRoZSBiYXNlIGVsZW1lbnQgbmFtZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIHBhdHRlcm4gaXMKKyAgICogY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmVQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSByZXF1ZXN0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGJhc2UgZWxlbWVudCBuYW1lcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBiYXNlIGVsZW1lbnQgbmFtZXMuCisgICAqLworICAgQmFzZVR5cGVTZXF1ZW5jZSBsaXN0RWxlbWVudHMoCisgICAgICBpbiBQYXR0ZXJuIGJlUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDExMDA3KQorICAgKiBHZXQgdGhlIHRvcCBsZXZlbCBiYXNlIGVsZW1lbnQgbmFtZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlCisgICAqIHBhdHRlcm4gaXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuIEEgdG9wCisgICAqIGxldmVsIGJhc2UgZWxlbWVudCBpcyBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGEgZmF0aGVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJlUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgcmVxdWVzdGVkCisgICAqICAgICAgICAgICAgICAgICAgICB0b3AgbGV2ZWwgYmFzZSBlbGVtZW50IG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIHRvcCBsZXZlbCBiYXNlIGVsZW1lbnQgbmFtZXMuCisgICAqLworICAgQmFzZVR5cGVTZXF1ZW5jZSBsaXN0VG9wTGV2ZWxFbGVtZW50cygKKyAgICAgIGluIFBhdHRlcm4gYmVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTEwMDgpCisgICAqIEdldCB0aGUgYmFzZSByZWxhdGlvbnMgYmV0d2VlbiB0d28gYmFzZSBlbGVtZW50cy4gVGhlIGJhc2UgcmVsYXRpb24KKyAgICogaXMgZ2l2ZW4gZnJvbSB0aGUgZmlyc3QgZWxlbWVudCAocGFyYW1ldGVyIGVsZW0xKSB0byB0aGUgc2Vjb25kCisgICAqIGVsZW1lbnQgKHBhcmFtZXRlciBlbGVtMiksIHRoZSBpbnZlcnNlIHJlbGF0aW9uIGlzIG5vdCBnaXZlbi4KKyAgICogV2hlbiB0aGVyZSBhcmUgbm8gYmFzZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gZWxlbWVudHMgdGhlIHNlcnZlcgorICAgKiB3aWxsIHRocm93IHRoZSBleGNlcHRpb24gQU9fTk9UX0ZPVU5ECisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICoKKyAgICogQHBhcmFtICBlbGVtMSAgVGhlIGJhc2UgZWxlbWVudCBmcm9tIHdoaWNoIHRoZSByZWxhdGlvbiBzdGFydHMuCisgICAqCisgICAqIEBwYXJhbSAgZWxlbTIgIFRoZSBiYXNlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHJlbGF0aW9uIHBvaW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGxpc3Qgd2l0aCBiYXNlIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZSB0d28gZWxlbWVudHMuCisgICAqLworICAgQmFzZVJlbGF0aW9uU2VxdWVuY2UgZ2V0UmVsYXRpb25zKAorICAgICAgaW4gQmFzZUVsZW1lbnQgZWxlbTEsCisgICAgICBpbiBCYXNlRWxlbWVudCBlbGVtMikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgQmFzZVN0cnVjdHVyZS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBibG9iIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgQmxvYiB7CisKKyAgIC8qKiAoMTIwMDEpCisgICAqIEFwcGVuZCBhIGJ5dGUgc2VxdWVuY2UgdG8gdGhlIGJpbmFyeSBsYXJnZSBvYmplY3QuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3Qgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgYnl0ZSBzZXF1ZW5jZS4KKyAgICovCisgICB2b2lkIGFwcGVuZCgKKyAgICAgIGluIFNfQllURSB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEyMDAyKQorICAgKiBDb21wYXJlcyB0aGUgY29udGVudCBvZiB0aGUgYmluYXJ5IGxhcmdlIG9iamVjdC4gVGhlIGhlYWRlcnMgYXJlIG5vdAorICAgKiBjb21wYXJlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhQmxvYiAgVGhlIGJsb2IgdG8gY29tcGFyZS4KKyAgICoKKyAgICogQHJldHVybiAgQSBmbGFnIHdoZXRoZXIgb3Igbm90IHRoZSBjb21wYXJlZCBibG9icyBhcmUgZXF1YWwuCisgICAqLworICAgVF9CT09MRUFOIGNvbXBhcmUoCisgICAgICBpbiBUX0JMT0IgYUJsb2IpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMjAwMykKKyAgICogR2V0IGEgcGFydCBvZiB0aGUgYmluYXJ5IGxhcmdlIG9iamVjdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBvZmZzZXQgIFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgZGF0YSBpbiB0aGUgYmxvYi4KKyAgICoKKyAgICogQHBhcmFtICBsZW5ndGggIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkIGZyb20gdGhlIGJsb2IuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0IHBhcnQgb2YgdGhlIGJsb2IgZGF0YS4KKyAgICovCisgICBTX0JZVEUgZ2V0KAorICAgICAgaW4gVF9MT05HIG9mZnNldCwKKyAgICAgIGluIFRfTE9ORyBsZW5ndGgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMjAwNCkKKyAgICogR2V0IHRoZSBoZWFkZXIgb2YgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmxvYiBoZWFkZXIuCisgICAqLworICAgVF9TVFJJTkcgZ2V0SGVhZGVyKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEyMDA1KQorICAgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgYmluYXJ5IGxhcmdlIG9iamVjdCB3aXRob3V0IGxvYWRpbmcgaXQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmxvYiBsZW5ndGguCisgICAqLworICAgVF9MT05HIGdldExlbmd0aCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMjAwNikKKyAgICogQ2xlYXIgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3QgYW5kIHNldCB0aGUgbmV3IGRhdGEuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3Qgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgbmV3IGJsb2IgZGF0YS4KKyAgICovCisgICB2b2lkIHNldCgKKyAgICAgIGluIFNfQllURSB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEyMDA3KQorICAgKiBTZXQgdGhlIGhlYWRlciBvZiBhIGJpbmFyeSBsYXJnZSBvYmplY3QuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3Qgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGhlYWRlciAgVGhlIGJsb2IgaGVhZGVyLgorICAgKi8KKyAgIHZvaWQgc2V0SGVhZGVyKAorICAgICAgaW4gVF9TVFJJTkcgaGVhZGVyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTIwMDgpCisgICAqIERlc3Ryb3kgdGhlIG9iamVjdCBvbiB0aGUgc2VydmVyLiBUaGUgZGVzdHJ1Y3RvciBvZiB0aGUgY2xpZW50LCBzbworICAgKiB0aGUgc2VydmVyIGtub3dzIHRoaXMgb2JqZWN0IGlzIG5vdCB1c2VkIGFueW1vcmUgYnkgdGhlIGNsaWVudC4KKyAgICogQWNjZXNzIHRvIHRoaXMgb2JqZWN0IGFmdGVyIHRoZSBkZXN0cm95IG1ldGhvZCB3aWxsIGxlYWQgdG8gYW4KKyAgICogZXhjZXB0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgZGVzdHJveSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEJsb2IuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgY29sdW1uIGludGVyZmFjZS4gSXQgaXMgbm90IGluaGVyaXRlZCBmcm9tCisqIEluc3RhbmNlRWxlbWVudC4gVmlhIHRoZSBtZXRob2QgZ2V0Q29sdW1uIG9mIHRoZSBpbnRlcmZhY2UgU3ViTWF0cml4CisqIHRoZSBjb2x1bW4gaXMgYWNjZXNzZWQuIFRoZSBjb2x1bW4gaXMgb25seSB1c2VkIGZvciByZWFkIGFjY2Vzcy4gV2l0aAorKiB0aGUgY3JlYXRpb24gb2YgaW5zdGFuY2VzIGF0IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHR5cGUKKyogQW9Mb2NhbENvbHVtbiBhbmQgdGhlIHJlbGF0aW9uIHRvIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uCisqIGVsZW1lbnQgb2YgdHlwZSBBb1N1Yk1hdHJpeCBhIGxvY2FsIGNvbHVtbiBjYW4gYmUgY3JlYXRlZC4gVGhlIGNvbHVtbgorKiBuYW1lIGlzIHVzZWQgZm9yIHRoZSBTTWF0TGluayBhbmQgdGhlIGNvbHVtbiBpcyB1c2VkIHRvIHN0b3JlIGEgZm9ybXVsYQorKiBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbHVtbi4gVGhlcmUgaXMgbm8gZGVmaW5pdGlvbgorKiBvZiB0aGUgZm9ybXVsYSBsYW5ndWFnZSBhdCB0aGUgbW9tZW50LgorKi8KK2ludGVyZmFjZSBDb2x1bW4geworCisgICAvKiogKDEzMDAxKQorICAgKiBHZXQgdGhlIGZvcm11bGEgb2YgdGhlIGNvbHVtbi4KKyAgICogCisgICAqIFRoZXJlIGlzIG5vIGZvcm11bGEgZGVmaW5lZCBpbiBBU0FNIE9EUywgc28gdGhlcmUgaXMgbm90aGluZyB0bworICAgKiByZXR1cm4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZm9ybXVsYSBvZiB0aGUgY29sdW1uLgorICAgKi8KKyAgIFRfU1RSSU5HIGdldEZvcm11bGEoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMDIpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY29sdW1uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi4KKyAgICovCisgICBOYW1lIGdldE5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMDMpCisgICAqIEdldCB0aGUgc291cmNlIG1lYXN1cmVtZW50IHF1YW50aXR5LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHNvdXJjZSBtZWFzdXJlbWVudCBxdWFudGl0eS4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnQgZ2V0U291cmNlTVEoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMDQpCisgICAqIEdldCB0aGUgdW5pdCBvZiB0aGUgY29sdW1uLgorICAgKiAKKyAgICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSB1bml0IG9mIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRoZSBjdXJyZW50CisgICAqIHNldHRpbmcuIEluaXRpYWxseSB3aXRoaW4gYSBzZXNzaW9uIHRoaXMgaXMgdGhlIHVuaXQgYXMgZ2l2ZW4gaW4gdGhlCisgICAqIHN0b3JhZ2UuIEFmdGVyIHNldFVuaXQoKSBpcyBjYWxsZWQsIHRoZSB1bml0IGFzIHNwZWNpZmllZCBieQorICAgKiBzZXRVbml0KCkgd2lsbCBiZQorICAgKiByZXR1cm5lZCBmb3IgdGhlIHBhcnRpY3VsYXIgY29sdW1uLiBUaHVzIHRoZSB1bml0IHJldHVybmVkIHdpbGwgYmUKKyAgICogcmV0cmlldmVkIGJ5IHRoZSBPRFMgc2VydmVyIGFjY29yZGluZyB0byBmb2xsb3dpbmcgc3RyYXRlZ3k6CisgICAqIDEpIGlmIGEgdW5pdCBoYXMgYWxyZWFkeSBiZWVuIHNldCBmb3IgdGhlIHBhcmljdWxhciBjb2x1bW4gYnkKKyAgICogc2V0VW5pdCguLikgcHJpb3I7IHRoYXQgdW5pdCBpcyByZXR1cm5lZCwgZWxzZQorICAgKiAyKSBpZiB0aGUgcmVsYXRlZCBtZWFzdXJlbWVudCBxdWFudGl0eSBoYXMgYSB1bml0IChpLmUuIGl0IGhhcyBhCisgICAqIHJlbGF0aW9uIGRlcml2ZWQgZnJvbSB0aGUgYmFzZSByZWxhdGlvbiAndW5pdCcgcmVmZXJlbmNpbmcgYW4KKyAgICogaW5zdGFuY2Ugb2YgYmFzZSB0eXBlIEFvVW5pdCksIHRoYXQgdW5pdCdzIG5hbWUgaXMgcmV0dXJuZWQsIGVsc2UKKyAgICogMykgaWYgdGhlIHJlbGF0ZWQgbWVhc3VyZW1lbnQgcXVhbnRpdHkgaGFzIGEgcmVsYXRpb24gdG8gYSBxdWFudGl0eQorICAgKiAoaS5lLiBpdHMgcmVsYXRpb24gZGVyaXZlZCBmcm9tIHRoZSBiYXNlIHJlbGF0aW9uICdxdWFudGl0eScgaXMKKyAgICogcmVmZXJlbmNpbmcgYW4gaW5zdGFuY2Ugb2YgYmFzZSB0eXBlIEFvUXVhbnRpdHkpLCBhbmQgdGhpcyBxdWFudGl0eQorICAgKiBoYXMKKyAgICogYSBkZWZhdWx0IHVuaXQgKGkuZS4gaXQgaGFzIGEgcmVsYXRpb24gZGVyaXZlZCBmcm9tIHRoZSBiYXNlCisgICAqIHJlbGF0aW9uICdkZWZhdWx0X3VuaXQnIHJlZmVyZW5jaW5nIGFuIGluc3RhbmNlIG9mIGJhc2UgdHlwZQorICAgKiBBb1VuaXQpLCB0aGF0IHVuaXQncyBuYW1lIGlzIHJldHVybmVkLCBlbHNlCisgICAqIDQpIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSB1bml0IG9mIHRoZSBjb2x1bW4uCisgICAqLworICAgVF9TVFJJTkcgZ2V0VW5pdCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAwNSkKKyAgICogU2V0IHRoZSBmb3JtdWxhIG9mIHRoZSBjb2x1bW4uIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGNvbHVtbiBvdXRzaWRlIGEgdHJhbnNhY3Rpb24gYnV0IGl0IGlzCisgICAqIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGVyZSBpcyBubyBmb3JtdWxhIGluIEFTQU0gT0RTIHNvIGRvbid0IHRyeSB0byBzZXQgdGhlIGZvcm11bGEuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgZm9ybXVsYSAgVGhlIGZvcm11bGEuCisgICAqLworICAgdm9pZCBzZXRGb3JtdWxhKAorICAgICAgaW4gVF9TVFJJTkcgZm9ybXVsYSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEzMDA2KQorICAgKiBTZXQgdGhlIHVuaXQgb2YgdGhlIGNvbHVtbi4gVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IHVuaXQgZm9yCisgICAqIGdldHRpbmcgdGhlIHZhbHVlcyBvZiBhIGNvbHVtbi4gVGhpcyB1bml0IGlzIG5vdCBzdG9yZWQgaW4gdGhlCisgICAqIHN0b3JhZ2UuIAorICAgKiBXaGVuIGFuIGVtcHR5IHN0cmluZyBpcyBnaXZlbiB0aGUgdW5pdCBpcyByZXR1cm5lZCB0byB0aGUgb3JpZ2luYWwKKyAgICogc2V0dGluZy4KKyAgICogV2hlbiB0aGUgdmFsdWUgbWF0cml4IHdoZXJlIHRoZSBjb2x1bW4gYmVsb25ncyB0byBpcyBpbiB0aGUgU1RPUkFHRQorICAgKiBtb2RlIHRoaXMgbWV0aG9kIGhhdmUgbm8gaW5mbHVlbmNlIG9uIHRoZSB2YWx1ZXMgcmV0dXJuZWQgZnJvbSB0aGUKKyAgICogdmFsdWUgbWF0cml4LgorICAgKiBUbyBjaGFuZ2UgdGhlIHVuaXQgcGVybWFuZW50IGluIHRoZSBzdG9yYWdlIHRoZSByZWxhdGlvbiBhdCB0aGUKKyAgICogbWVhc3VyZW1lbnQgcXVhbnRpdHkgbXVzdCBiZSBjaGFuZ2VkIGJ5IHRoZSBjbGllbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdW5pdCAgVGhlIHBoeXNpY2FsIHVuaXQuCisgICAqLworICAgdm9pZCBzZXRVbml0KAorICAgICAgaW4gVF9TVFJJTkcgdW5pdCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEzMDA3KQorICAgKiBJcyB0aGUgY29sdW1uIGFuIGluZGVwZW5kZW50IGNvbHVtbgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgaW5kZXBlbmRlbnQgZmxhZyBvZiB0aGUgY29sdW1uLgorICAgKi8KKyAgIFRfQk9PTEVBTiBpc0luZGVwZW5kZW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEzMDA4KQorICAgKiBEZXByZWNhdGVkLCBzb2x2ZWQgYnkgTlZIIEFwcGxpY2F0aW9uIG1vZGVsLgorICAgKiAKKyAgICogSXMgdGhlIGNvbHVtbiBhbiBzY2FsaW5nIGNvbHVtbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGVsbHMgaWYgdGhlIGNvbHVtbiBpcyBhIHNjYWxpbmcgY29sdW1uLgorICAgKi8KKyAgIFRfQk9PTEVBTiBpc1NjYWxpbmcoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMDkpCisgICAqIFNldCB0aGUgY29sdW1uIGFzIGFuIGluZGVwZW5kZW50IGNvbHVtbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGluZGVwZW5kZW50ICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBpbmRlcGVuZGVudCBmbGFnLgorICAgKi8KKyAgIHZvaWQgc2V0SW5kZXBlbmRlbnQoCisgICAgICBpbiBUX0JPT0xFQU4gaW5kZXBlbmRlbnQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxMCkKKyAgICogRGVwcmVjYXRlZCwgc29sdmVkIGJ5IE5WSCBBcHBsaWNhdGlvbiBtb2RlbC4KKyAgICogCisgICAqIFNldCB0aGUgY29sdW1uIHRvIGEgc2NhbGluZyBjb2x1bW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBzY2FsaW5nICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBzY2FsaW5nIGZsYWcuCisgICAqLworICAgdm9pZCBzZXRTY2FsaW5nKAorICAgICAgaW4gVF9CT09MRUFOIHNjYWxpbmcpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxMSkKKyAgICogR2V0IHRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtbi4KKyAgICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgbWVhc3VyZW1lbnQgcXVhbnRpdHkgaXMgYWx3YXlzIHJldHVybmVkLAorICAgKiBpbmRlcGVuZGVudCBvZiB0aGUgbW9kZSBvZiB0aGUgdmFsdWVzIG1hdHJpeCB3aGVyZSB0aGUgY29sdW1uCisgICAqIGJlbG9uZ3MgdG8gbmVpdGhlciB0aGUgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbHVtbi4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIHRoZSBkYXRhIHR5cGUgb2YgdGhlIG1lYXN1cmVtZW50IHF1YW50aXR5CisgICAqIHRvIHdoaWNoIHRoaXMgbG9jYWwgY29sdW1uIGJlbG9uZ3MsIGluZGVwZW5kZW50IG9mIAorICAgKiAtIHRoZSB2YWx1ZSBtYXRyaXggbW9kZSBvZiB0aGUgdmFsdWUgbWF0cmljZXMgdGhpcyBsb2NhbCBjb2x1bW4KKyAgICogYmVsb25ncyB0bworICAgKiAtIHRoZSBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGxvY2FsIGNvbHVtbgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uLgorICAgKi8KKyAgIERhdGFUeXBlIGdldERhdGFUeXBlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEzMDEyKQorICAgKiBEZXN0cm95IHRoZSBvYmplY3Qgb24gdGhlIHNlcnZlci4gVGhlIGRlc3RydWN0b3Igb2YgdGhlIGNsaWVudCBzbworICAgKiB0aGUgc2VydmVyIGtub3dzIHRoaXMgb2JqZWN0IGlzIG5vdCB1c2VkIGFueW1vcmUgYnkgdGhlIGNsaWVudC4KKyAgICogQWNjZXNzIHRvIHRoaXMgb2JqZWN0IGFmdGVyIHRoZSBkZXN0cm95IG1ldGhvZCB3aWxsIGxlYWQgdG8gYW4KKyAgICogZXhjZXB0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgZGVzdHJveSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxMykKKyAgICogR2V0IHRoZSBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sdW1uLiAKKyAgICogCisgICAqIFdoZW4gdGhlIHZhbHVlIG1hdHJpeCB0byB3aGljaCB0aGUgY29sdW1uIGJlbG9uZ3MgaXMgaW4gQ0FMQ1VMQVRFRAorICAgKiBtb2RlIHRoZSBzZXF1ZW5jZV9yZXByZXNlbnRhdGlvbiBpcyBhbHdheXMgZXhwbGljaXQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbHVtbi4gVGhpcyBpcyB0aGUKKyAgICogICAgICAgICAgaW50ZWdlciB2YWx1ZSBhY2NvcmRpbmcgdGhlIGVudW1lcmF0aW9uIHNlcV9yZXBfZW51bSBvZiB0aGUKKyAgICogICAgICAgICAgYmFzZSBtb2RlbC4KKyAgICovCisgICBUX0xPTkcgZ2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxNCkKKyAgICogU2V0IHRoZSBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBvZiBhIG5ldyBjb2x1bW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RWSUUKKyAgICoKKyAgICogQHBhcmFtICBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uICBUaGUgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24uICBUaGlzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIGludGVnZXIgdmFsdWUgYWNjb3JkaW5nIHRoZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0aW9uIHNlcV9yZXBfZW51bSBvZiB0aGUgYmFzZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLgorICAgKi8KKyAgIHZvaWQgc2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbigKKyAgICAgIGluIFRfTE9ORyBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMTUpCisgICAqIEdldCB0aGUgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBDb2x1bW4uIAorICAgKiAKKyAgICogSWYgbm8gZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzIGV4aXN0IGFuIGVtcHR5IHNlcXVlbmNlIGlzIHJldHVybmVkLCBpdHMKKyAgICogdHlwZSBpcyBkb3VibGUsIGl0cyBsZW5ndGggaXMgMC4KKyAgICogV2hlbiB0aGUgdmFsdWUgbWF0cml4IHRvIHdoaWNoIHRoZSBjb2x1bW4gYmVsb25ncyBpcyBpbiBDQUxDVUxBVEVECisgICAqIG1vZGUgYW4gZW1wdHkgc2VxdWVuY2UgaXMgcmV0dXJuZWQsIGl0cyB0eXBlIGlzIGRvdWJsZSwgaXRzIGxlbmd0aAorICAgKiBpcyAwLgorICAgKiAKKyAgICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgZ2VuZXJhdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBpbXBsaWNpdCBjb2x1bW5zCisgICAqIGlzIHRoZSBkYXRhIHR5cGUgZ2l2ZW4gYXQgdGhlIG1lYXN1cmVtZW50IHF1YW50aXR5LiBUaGUgZGF0YSB0eXBlIG9mCisgICAqIHRoZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgZm9yIHJhdyBkYXRhIGlzIGFsd2F5cyBUX0RPVUJMRS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnMuCisgICAqLworICAgVFNfVW5pb24gZ2V0R2VuZXJhdGlvblBhcmFtZXRlcnMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMTYpCisgICAqIFNldCB0aGUgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzLgorICAgKiAKKyAgICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgZ2VuZXJhdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBpbXBsaWNpdCBjb2x1bW5zCisgICAqIG11c3QgYmUgdGhlIGRhdGEgdHlwZSBnaXZlbiBhdCB0aGUgbWVhc3VyZW1lbnQgcXVhbnRpdHkuIFRoZSBkYXRhCisgICAqIHR5cGUgb2YgdGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBmb3IgcmF3IGRhdGEgbXVzdCBiZSBhbHdheXMKKyAgICogVF9ET1VCTEUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RWSUUKKyAgICoKKyAgICogQHBhcmFtICBnZW5lcmF0aW9uUGFyYW1ldGVycyAgVGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycy4KKyAgICovCisgICB2b2lkIHNldEdlbmVyYXRpb25QYXJhbWV0ZXJzKAorICAgICAgaW4gVFNfVW5pb24gZ2VuZXJhdGlvblBhcmFtZXRlcnMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxNykKKyAgICogR2V0IHRoZSBkYXRhIHR5cGUgb2YgdGhlIHJhdyB2YWx1ZXMuCisgICAqIAorICAgKiBXaGVuIHRoZSBjb2x1bW4gaGFzIG5vIHJhdyB2YWx1ZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgbWVhc3VyZW1lbnQKKyAgICogcXVhbnRpdHkgaXMgcmV0dXJuZWQuIAorICAgKiBXaGVuIHRoZSB2YWx1ZSBtYXRyaXggdG8gd2hpY2ggdGhlIGNvbHVtbiBiZWxvbmdzIGlzIGluIENBTENVTEFURUQKKyAgICogbW9kZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBtZWFzdXJlbWVudCBxdWFudGl0eSByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHJhdyB2YWx1ZXMuCisgICAqLworICAgRGF0YVR5cGUgZ2V0UmF3RGF0YVR5cGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBDb2x1bW4uCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgaW5zdGFuY2UgZWxlbWVudCBpbnRlcmZhY2UuIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZQorKiBpbnN0YW5jZXMgb3V0c2lkZSBhIHRyYW5zYWN0aW9uIGJ1dCByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhCisqIHRyYW5zYWN0aW9uIGJlZm9yZSB0aGUgaW5zdGFuY2VzIGFyZSBtb2RpZmllZC4gVGhlIG1vZGlmaWNhdGlvbnMgdG8KKyogaW5zdGFuY2VzIGdldCBwZXJtYW5lbnQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLgorKi8KK2ludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQgeworCisgICAvKiogKDE0MDAxKQorICAgKiBBZGQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIHRvIHRoZSBpbnN0YW5jZS4gVGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBpcworICAgKiBidWlsdCBhcyBhIE5hbWUvVmFsdWUvVW5pdCB0dXBsZSBvbiB0aGUgY2xpZW50LiBUaGlzIG1ldGhvZCBoYXMgdG8KKyAgICogY29weSB0aGUgZGF0YSBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlci4gVGhlIG5hbWUgb2YgdGhlCisgICAqIGF0dHJpYnV0ZSBtdXN0IGJlIHVuaXF1ZS4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIGFkZCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3V0c2lkZSBhIHRyYW5zYWN0aW9uIGJ1dAorICAgKiBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGluc3RBdHRyICBUaGUgaW5zdGFuY2UgYXR0cmlidXRlIHRvIGJlIGFkZGVkLgorICAgKi8KKyAgIHZvaWQgYWRkSW5zdGFuY2VBdHRyaWJ1dGUoCisgICAgICBpbiBOYW1lVmFsdWVVbml0IGluc3RBdHRyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMDIpCisgICAqIENyZWF0ZSBhIHJlbGF0aW9uIGJldHdlZW4gdGhlIGN1cnJlbnQgYW5kIHRoZSBnaXZlbiBpbnN0YW5jZS4gQ2hlY2sKKyAgICogaWYgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnRzIG9mIHRoZSByZWxhdGlvbiBtYXRjaGVzIHRoZSBhcHBsaWNhdGlvbgorICAgKiBlbGVtZW50cyBvZiB0aGUgaW5zdGFuY2VzLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBpbnN0YW5jZSBlbGVtZW50IG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTgorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHJlbGF0aW9uICBUaGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEBwYXJhbSAgaW5zdEVsZW0gIFRoZSBpbnN0YW5jZSBlbGVtZW50LgorICAgKi8KKyAgIHZvaWQgY3JlYXRlUmVsYXRpb24oCisgICAgICBpbiBBcHBsaWNhdGlvblJlbGF0aW9uIHJlbGF0aW9uLAorICAgICAgaW4gSW5zdGFuY2VFbGVtZW50IGluc3RFbGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMDMpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGZyb20gd2hpY2ggdGhlIGluc3RhbmNlIGVsZW1lbnQgaXMKKyAgICogICAgICAgICAgZGVyaXZlZC4KKyAgICovCisgICBBcHBsaWNhdGlvbkVsZW1lbnQgZ2V0QXBwbGljYXRpb25FbGVtZW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDA0KQorICAgKiBHZXQgdGhlIEFTQU0tUGF0aCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBBU0FNIHBhdGggdG8gdGhlIGluc3RhbmNlIGVsZW1lbnQuCisgICAqLworICAgTmFtZSBnZXRBc2FtUGF0aCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAwNSkKKyAgICogR2V0IHRoZSBJZCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBJZCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICovCisgICBUX0xPTkdMT05HIGdldElkKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDA2KQorICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICovCisgICBOYW1lIGdldE5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMDcpCisgICAqIEdldCB0aGUgcmVsYXRlZCBpbnN0YW5jZXMuIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBhbmQgdGhlIG5hbWUgb2YKKyAgICogdGhlIHJlbGF0ZWQgIGluc3RhbmNlcyBzcGVjaWZ5IHRoZSBsaXN0ZWQgaW5zdGFuY2VzLiBUaGUgcGF0dGVybiBpcworICAgKiBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTgorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFwcGxSZWwgIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICBpZVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHJlbGF0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRlZCBpbnN0YW5jZXMuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3IgZ2V0UmVsYXRlZEluc3RhbmNlcygKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbFJlbCwKKyAgICAgIGluIFBhdHRlcm4gaWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMDgpCisgICAqIEdldCB0aGUgbGlzdCBvZiByZWxhdGVkIGluc3RhbmNlcy4gVGhlIHJlbGF0aW9uc2hpcCBhbmQgdGhlIG5hbWUgb2YKKyAgICogdGhlIHJlbGF0ZWQgaW5zdGFuY2VzIHNwZWNpZnkgdGhlIGxpc3RlZCBpbnN0YW5jZXMuIFRoZSBwYXR0ZXJuIGlzCisgICAqIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1JFTEFUSU9OU0hJUAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGllUmVsYXRpb25zaGlwICBUaGUgcmVxdWVzdGVkIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHBhcmFtICBpZVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHJlbGF0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRlZCBpbnN0YW5jZXMuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3IgZ2V0UmVsYXRlZEluc3RhbmNlc0J5UmVsYXRpb25zaGlwKAorICAgICAgaW4gUmVsYXRpb25zaGlwIGllUmVsYXRpb25zaGlwLAorICAgICAgaW4gUGF0dGVybiBpZVBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAwOSkKKyAgICogR2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgKG5hbWUsIHZhbHVlIGFuZCB1bml0KSBvZiB0aGUgZ2l2ZW4KKyAgICogYXR0cmlidXRlIG9mIHRoZSBpbnN0YW5jZSBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gdGhlCisgICAqIHZhbHVlIG9mIHJlbGF0aW9uIGF0dHJpYnV0ZXMsIHVzZSB0aGUgbWV0aG9kIGdldFJlbGF0ZWRJbnN0YW5jZXMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXR0ck5hbWUgIFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXR0cmlidXRlIHZhbHVlLgorICAgKi8KKyAgIE5hbWVWYWx1ZVVuaXQgZ2V0VmFsdWUoCisgICAgICBpbiBOYW1lIGF0dHJOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMTApCisgICAqIEdldCB0aGUgYXR0cmlidXRlIHZhbHVlICh2YWx1ZSBhbmQgdW5pdCkgb2YgdGhlIGF0dHJpYnV0ZSBpbmhlcml0ZWQKKyAgICogZnJvbSB0aGUgZ2l2ZW4gYmFzZSBhdHRyaWJ1dGUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQuIFRoZSBiYXNlIG5hbWUKKyAgICogaXMgY2FzZSBpbnNlbnNpdGl2ZSBhbmQgbWF5IG5vdCBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmFzZUF0dHJOYW1lICBUaGUgYmFzZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXR0cmlidXRlIHZhbHVlLgorICAgKi8KKyAgIE5hbWVWYWx1ZVVuaXQgZ2V0VmFsdWVCeUJhc2VOYW1lKAorICAgICAgaW4gTmFtZSBiYXNlQXR0ck5hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAxMSkKKyAgICogR2V0IHRoZSBhdHRyaWJ1dGUgbmFtZXMgZnJvbSB0aGUgaW5zdGFuY2UgZWxlbWVudC4gVGhlICBhdHRyaWJ1dGVzCisgICAqIHJlc2VydmVkIGZvciBhIHJlbGF0aW9uIGFyZSBub3QgbGlzdGVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0FUVFJJQlVURV9UWVBFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaWFQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICogICAgICAgICAgICAgICAgICAgIG5hbWVzLgorICAgKgorICAgKiBAcGFyYW0gIGFUeXBlICBUaGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSB0eXBlLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZXMuCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RBdHRyaWJ1dGVzKAorICAgICAgaW4gUGF0dGVybiBpYVBhdHRlcm4sCisgICAgICBpbiBBdHRyVHlwZSBhVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDEyKQorICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSByZWxhdGVkIGluc3RhbmNlcy4gVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIGFuZAorICAgKiB0aGUgbmFtZSBvZiB0aGUgcmVsYXRlZCBpbnN0YW5jZXMgc3BlY2lmaWVzIHRoZSBsaXN0ZWQgbmFtZXMuIFRoZQorICAgKiBwYXR0ZXJuIGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGllUmVsYXRpb24gIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICBpZVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHJlbGF0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZXMgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLgorICAgKi8KKyAgIE5hbWVJdGVyYXRvciBsaXN0UmVsYXRlZEluc3RhbmNlcygKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gaWVSZWxhdGlvbiwKKyAgICAgIGluIFBhdHRlcm4gaWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMTMpCisgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLiBUaGUgcmVsYXRpb25zaGlwIGFuZCB0aGUKKyAgICogbmFtZSBvZiB0aGUgcmVsYXRlZCBpbnN0YW5jZXMgc3BlY2lmeSB0aGUgbGlzdGVkIG5hbWVzLiBUaGUgcGF0dGVybgorICAgKiBpcyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTlNISVAKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBpZVJlbGF0aW9uc2hpcCAgVGhlIHJlcXVlc3RlZCByZWxhdGlvbnNoaXAuCisgICAqCisgICAqIEBwYXJhbSAgaWVQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSByZWxhdGVkCisgICAqICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSBuYW1lcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSByZWxhdGVkIGluc3RhbmNlcy4KKyAgICovCisgICBOYW1lSXRlcmF0b3IgbGlzdFJlbGF0ZWRJbnN0YW5jZXNCeVJlbGF0aW9uc2hpcCgKKyAgICAgIGluIFJlbGF0aW9uc2hpcCBpZVJlbGF0aW9uc2hpcCwKKyAgICAgIGluIFBhdHRlcm4gaWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMTQpCisgICAqIFJlbW92ZSBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUuCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIHJlbW92ZSB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIGNhbid0IGJlIHJlbW92ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGF0dHJOYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQuCisgICAqLworICAgdm9pZCByZW1vdmVJbnN0YW5jZUF0dHJpYnV0ZSgKKyAgICAgIGluIE5hbWUgYXR0ck5hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAxNSkKKyAgICogUmVtb3ZlIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSBjdXJyZW50IGluc3RhbmNlIGFuZCB0aGUgZ2l2ZW4KKyAgICogaW5zdGFuY2UuIEl0IGlzIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IHRoZSBpbnN0YW5jZSBlbGVtZW50IGluIGNhc2Ugb2YKKyAgICogbjptIHJlbGF0aW9ucyBpZiBub3QgYWxsIHJlbGF0aW9ucyBzaGFsbCBiZSBkZWxldGVkLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBpbnN0YW5jZSBlbGVtZW50IG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTgorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhcHBsUmVsICBUaGUgcmVsYXRpb24gdG8gYmUgcmVtb3ZlZC4KKyAgICoKKyAgICogQHBhcmFtICBpbnN0RWxlbV9ubSAgVGhlIGluc3RhbmNlIGVsZW1lbnQgZm9yIHNwZWNpZmljIGRlbGV0ZSBmcm9tCisgICAqICAgICAgICAgICAgICAgICAgICAgIG46bSByZWxhdGlvbnMuCisgICAqLworICAgdm9pZCByZW1vdmVSZWxhdGlvbigKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbFJlbCwKKyAgICAgIGluIEluc3RhbmNlRWxlbWVudCBpbnN0RWxlbV9ubSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDE2KQorICAgKiBSZW5hbWUgdGhlIGluc3RhbmNlIGF0dHJpYnV0ZS4gVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMgY2FuJ3QgYmUKKyAgICogcmVuYW1lZC4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIHJlbmFtZSB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9OQU1FCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgb2xkTmFtZSAgVGhlIG9sZCBpbnN0YW5jZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICoKKyAgICogQHBhcmFtICBuZXdOYW1lICBUaGUgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZSBuYW1lLgorICAgKi8KKyAgIHZvaWQgcmVuYW1lSW5zdGFuY2VBdHRyaWJ1dGUoCisgICAgICBpbiBOYW1lIG9sZE5hbWUsCisgICAgICBpbiBOYW1lIG5ld05hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAxNykKKyAgICogU2V0IHRoZSBuYW1lIG9mIGFuIGluc3RhbmNlIGVsZW1lbnQuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGlhTmFtZSAgVGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBuYW1lLgorICAgKi8KKyAgIHZvaWQgc2V0TmFtZSgKKyAgICAgIGluIE5hbWUgaWFOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMTgpCisgICAqIFNldCB0aGUgdmFsdWUgb2YgYW4gYXBwbGljYXRpb24gYXR0cmlidXRlIG9yIG9mIGFuIGV4aXN0aW5nIGluc3RhbmNlCisgICAqIGF0dHJpYnV0ZSwgYnV0IGlzIGRvZXNuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZTsgZm9yIHRoaXMKKyAgICogcHVycG9zZSB1c2UgdGhlIG1ldGhvZCBhZGRJbnN0YW5jZXNBdHRyaWJ1dGUgb2YgdGhpcyBpbnRlcmZhY2UuCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXR0cmlidXRlIHZhbHVlIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBuYW1lIG9mIHRoZQorICAgKiBOYW1lVmFsdWVVbml0IHR1cGxlLiBJZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlIGZsYWcgdW5pcXVlIGlzCisgICAqIHNldCwgdGhlIHVuaXF1ZW5lc3Mgb2YgdGhlIG5ldyB2YWx1ZSBpcyBjaGVja2VkLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIHRvIHNldCB0aGUgdmFsdWUgb2YgYSByZWxhdGlvbgorICAgKiBhdHRyaWJ1dGUsIHVzZSB0aGUgbWV0aG9kIGNyZWF0ZVJlbGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9WQUxVRQorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlIHRvIGJlIHNldCBpbiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICovCisgICB2b2lkIHNldFZhbHVlKAorICAgICAgaW4gTmFtZVZhbHVlVW5pdCB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDE5KQorICAgKiBDYXN0IGFuIGluc3RhbmNlIGVsZW1lbnQgdG8gYSBtZWFzdXJlbWVudC4gVGhlcmUgYXJlIHNvbWUKKyAgICogb2JqZWN0LW9yaWVudGVkIGxhbmd1YWdlcyB3aGljaCBkbyBub3QgYWxsb3cgdGhpcyBjYXN0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fSU5WQUxJRF9CQVNFVFlQRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgaW5zdGFuY2Ugb2YgdHlwZSBtZWFzdXJlbWVudC4KKyAgICovCisgICBNZWFzdXJlbWVudCB1cGNhc3RNZWFzdXJlbWVudCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAyMCkKKyAgICogQ2FzdCBhbiBpbnN0YW5jZSBlbGVtZW50IHRvIGEgc3VibWF0cml4LiBUaGVyZSBhcmUgc29tZQorICAgKiBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGlzIGNhc3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnN0YW5jZSBvZiB0eXBlIHN1Ym1hdHJpeC4KKyAgICovCisgICBTdWJNYXRyaXggdXBjYXN0U3ViTWF0cml4KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDIxKQorICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAobmFtZSwgdmFsdWUgYW5kIHVuaXQpIG9mIHRoZSBnaXZlbgorICAgKiBhdHRyaWJ1dGUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTkNPTVBBVElCTEVfVU5JVFMKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGF0dHIgIFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlIGFuZCB0aGUgdW5pdCBvZgorICAgKiAgICAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhdHRyaWJ1dGUgdmFsdWUsIHZhbHVlIGNvbnZlcnRlZCB0byB0aGUgcmVxdWVzdGVkIHVuaXQuCisgICAqLworICAgTmFtZVZhbHVlVW5pdCBnZXRWYWx1ZUluVW5pdCgKKyAgICAgIGluIE5hbWVVbml0IGF0dHIpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAyMikKKyAgICogU2V0IGEgc2VxdWVuY2VzIG9mIHZhbHVlcyBvZiBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIGJ1dCBubworICAgKiBpbnN0YW5jZXMgYXR0cmlidXRlcy4KKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgYnkgdGhlIG5hbWUgb2YgdGhlCisgICAqIE5hbWVWYWx1ZVVuaXQgdHVwbGUuIElmIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgZmxhZyB1bmlxdWUgaXMKKyAgICogc2V0LCB0aGUgdW5pcXVlbmVzcyBvZiB0aGUgbmV3IHZhbHVlIGlzIGNoZWNrZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19EVVBMSUNBVEVfVkFMVUUKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdmFsdWVzICBUaGUgc2VxdWVuY2Ugb2YgdGhlIHZhbHVlcyB0byBiZSBzZXQgYXQgdGhlIGluc3RhbmNlCisgICAqICAgICAgICAgICAgICAgICBlbGVtZW50LgorICAgKi8KKyAgIHZvaWQgc2V0VmFsdWVTZXEoCisgICAgICBpbiBOYW1lVmFsdWVVbml0U2VxdWVuY2UgdmFsdWVzKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMjMpCisgICAqIFRoZSBnaXZlbiB1c2VyIGdyb3VwIHRoZSByaWdodHMgc2hvdWxkIGJlIHNldCBmb3IuIDxyaWdodHM+IGRlZmluZXMKKyAgICogdGhlIHJpZ2h0cyB0byBzZXQgb3IgdG8gY2xlYXIuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvCisgICAqICdzZXQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBzZXQgYWxsIG90aGVycyBhcmUgY2xlYXJlZC4gSWYgdGhlCisgICAqIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ2FkZCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIGFkZGVkIHRvCisgICAqIHRoZSBleGlzdGluZyByaWdodHMuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdyZW1vdmUnLCB0aGUKKyAgICogcmlnaHRzIGluIDxyaWdodHM+IGFyZSByZW1vdmVkIGZyb20gdGhlIGV4aXN0aW5nIHJpZ2h0cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cCAgVGhlIHVzZXIgZ3JvdXAgZm9yIHdoaWNoIHRoZSByaWdodHMgd2lsbCBiZQorICAgKiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQuCisgICAqCisgICAqIEBwYXJhbSAgcmlnaHRzICBUaGUgbmV3IHJpZ2h0IGZvciB0aGUgdXNlciBncm91cC4gVGhlIHJpZ2h0cworICAgKiAgICAgICAgICAgICAgICAgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UKKyAgICogICAgICAgICAgICAgICAgIFNlY3VyaXR5UmlnaHRzLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UKKyAgICogICAgICAgICAgICAgICAgIElETCBkb2VzIG5vdCBhbGxvdyB0byBzZXQgdGhlIHZhbHVlcyBvZiBlbnVtZXJhdGlvbnMKKyAgICogICAgICAgICAgICAgICAgIHRodXMgdGhlIGNvbnN0YW50IGRlZmluaXRpb25zIGhhZCB0byBiZSBkb25lIGluIGFuCisgICAqICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyByaWdodC4KKyAgICovCisgICB2b2lkIHNldFJpZ2h0cygKKyAgICAgIGluIEluc3RhbmNlRWxlbWVudCB1c2VyZ3JvdXAsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDI0KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIG9mIHRoZSBnaXZlbiBvYmplY3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGVudHJpZXMgb2YgdGhlIGdpdmVuIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgIGVsZW1lbnQuCisgICAqLworICAgQUNMU2VxdWVuY2UgZ2V0UmlnaHRzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDI1KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIGZvciB0aGUgaW5pdGlhbCByaWdodHMgb2YKKyAgICogdGhlIGdpdmVuIG9iamVjdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFjY2VzcyBjb250cm9sIGxpc3QgZW50cmllcyB3aXRoIHRoZSBpbml0aWFsIHJpZ2h0cyBvZgorICAgKiAgICAgICAgICB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICovCisgICBJbml0aWFsUmlnaHRTZXF1ZW5jZSBnZXRJbml0aWFsUmlnaHRzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDI2KQorICAgKiBUaGUgZ2l2ZW4gdXNlciBncm91cCB0aGUgaW5pdGlhbCByaWdodHMgc2hvdWxkIGJlIHNldCBmb3IuIDxyaWdodHM+CisgICAqIGRlZmluZXMgdGhlIHJpZ2h0cyB0byBzZXQgb3IgdG8gY2xlYXIuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0CisgICAqIHRvICdzZXQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBzZXQgYWxsIG90aGVycyBhcmUgY2xlYXJlZC4gSWYKKyAgICogdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ2FkZCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlCisgICAqIGFkZGVkIHRvIHRoZSBleGlzdGluZyByaWdodHMuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvCisgICAqICdyZW1vdmUnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSByZW1vdmVkIGZyb20gdGhlIGV4aXN0aW5nCisgICAqIHJpZ2h0cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cCAgVGhlIHVzZXIgZ3JvdXAgZm9yIHdoaWNoIHRoZSBpbml0aWFsIHJpZ2h0cyB3aWxsCisgICAqICAgICAgICAgICAgICAgICAgICBiZSBtb2RpZmllZC4KKyAgICoKKyAgICogQHBhcmFtICByaWdodHMgIFRoZSBuZXcgaW5pdGlhbCByaWdodHMgZm9yIHRoZSB1c2VyIGdyb3VwLiBUaGUKKyAgICogICAgICAgICAgICAgICAgIHJpZ2h0cyBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZQorICAgKiAgICAgICAgICAgICAgICAgU2VjdXJpdHlSaWdodHMuIFRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZQorICAgKiAgICAgICAgICAgICAgICAgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mIGVudW1lcmF0aW9ucworICAgKiAgICAgICAgICAgICAgICAgdGh1cyB0aGUgY29uc3RhbnQgZGVmaW5pdGlvbnMgaGF2ZSB0byBiZSBkb25lIGluIHRoZQorICAgKiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgKgorICAgKiBAcGFyYW0gIHJlZkFpZCAgVGhlIElkIG9mIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGVsZW1lbnQgZm9yIHdoaWNoCisgICAqICAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbCByaWdodHMgd2lsbCBiZSB1c2VkLiBJZiBubyByZWZBaWQgaXMgc2V0CisgICAqICAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbCByaWdodHMgd2lsbCBiZSB1c2VkIGZvciBlYWNoIG5ldworICAgKiAgICAgICAgICAgICAgICAgaW5zdGFuY2UgZWxlbWVudCBpbmRlcGVuZGVudCBvZiB0aGUgYXBwbGljYXRpb24KKyAgICogICAgICAgICAgICAgICAgIGVsZW1lbnQuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyBpbml0aWFsIHJpZ2h0cy4KKyAgICovCisgICB2b2lkIHNldEluaXRpYWxSaWdodHMoCisgICAgICBpbiBJbnN0YW5jZUVsZW1lbnQgdXNlcmdyb3VwLAorICAgICAgaW4gVF9MT05HIHJpZ2h0cywKKyAgICAgIGluIFRfTE9OR0xPTkcgcmVmQWlkLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDI3KQorICAgKiBQcm92aWRlcyBhbiBlYXN5LXRvLXVzZSBhbmQgZWZmZWN0aXZlIGNvcHkgbWVjaGFuaXNtIGZvciBpbnN0YW5jZQorICAgKiBlbGVtZW50cyBpbnNpZGUgdGhlIHNlcnZlci4gVGhlIG5ldyBpbnN0YW5jZSBlbGVtZW50cyBnZXRzIGEgY29weSBvZgorICAgKiBhbGwgYXR0cmlidXRlIHZhbHVlcyBhbmQgaW5mb3JtYXRpb25hbCByZWxhdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlCisgICAqIGluIHRoZSBvcmlnaW5hbCBpbnN0YW5jZSBlbGVtZW50LiBUaGUgbmV3IGluc3RhbmNlIGVsZW1lbnQgaGFzIHRoZQorICAgKiBzYW1lIHBhcmVudCBhcyB0aGUgb3JpZ2luYWwgaW5zdGFuY2UgZWxlbWVudCBidXQgaXQgZG9lcyBub3QgaGF2ZQorICAgKiByZWZlcmVuY2VzIHRvIGFueSBjaGlsZHJlbiBvZiB0aGUgb3JpZ2luYWwgaW5zdGFuY2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIG5ld05hbWUgIFRoZSBuYW1lIG9mIHRoZSBuZXcgaW5zdGFuY2UgZWxlbWVudC4gSWYgYSBuZXcKKyAgICogICAgICAgICAgICAgICAgICB2ZXJzaW9uIHNoYWxsIGJlIGNyZWF0ZWQgdGhpcyBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwKKyAgICogICAgICAgICAgICAgICAgICB0byB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgdGhlIGNvcHkuIEluIHRoaXMgY2FzZSBhCisgICAqICAgICAgICAgICAgICAgICAgbmV3IHZlcnNpb24gbXVzdCBiZSBwcm92aWRlZC4KKyAgICoKKyAgICogQHBhcmFtICBuZXdWZXJzaW9uICBUaGUgdmVyc2lvbiBvZiB0aGUgbmV3IGluc3RhbmNlIGVsZW1lbnQuIFRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwgaWYgYSBuZXcgbmFtZSBpcyBwcm92aWRlZC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlZmVyZW5jZSB0byB0aGUgY29waWVkIGluc3RhbmNlIGVsZW1lbnQuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50IHNoYWxsb3dDb3B5KAorICAgICAgaW4gVF9TVFJJTkcgbmV3TmFtZSwKKyAgICAgIGluIFRfU1RSSU5HIG5ld1ZlcnNpb24pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAyOCkKKyAgICogUHJvdmlkZXMgYW4gZWFzeS10by11c2UgYW5kIGVmZmVjdGl2ZSBjb3B5IG1lY2hhbmlzbSBmb3IgaW5zdGFuY2UKKyAgICogZWxlbWVudCBoaWVyYXJjaGllcyBpbnNpZGUgdGhlIHNlcnZlciAoZS5nLiBjb3B5IGEgcHJvamVjdCB3aXRoIGFsbAorICAgKiB0ZXN0cyBvciBjb3B5IGEgdGVzdCB3aXRoIGFsbCBtZWFzdXJlbWVudHMpLiBUaGUgZGVlcCBjb3B5IGZvbGxvd3MKKyAgICogb25seSB0aGUgY2hpbGQgcmVmZXJlbmNlcyBidXQgbm90IHRoZSBpbmZvcm1hdGlvbmFsIHJlZmVyZW5jZXMuCisgICAqIEV4YW1wbGU6IENvcHlpbmcgZWxlbWVudHMgb2YgdHlwZSBBb01lYXN1cmVtZW50IGRvZXMgbm90IGluY2x1ZGUKKyAgICogY29weWluZyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cyBvZiB0eXBlIEFvTWVhc3VyZW1lbnRRdWFudGl0eS4gVGhlCisgICAqIGNvcGllZCBpbnN0YW5jZSBlbGVtZW50cyBvZiB0eXBlIEFvTWVhc3VyZW1lbnQgd2lsbCByZWZlcmVuY2UgdGhlCisgICAqIHNhbWUgbWVhc3VyZW1lbnQgcXVhbnRpdGllcyBhcyB0aGUgb3JpZ2luYWwuIEFuIGFwcGxpY2F0aW9uIHRoYXQKKyAgICogd2FudHMgdG8gY29weSB0aGUgbWVhc3VyZW1lbnQgcXVhbnRpdHkgYWxzbyBtdXN0IGRvIHRoaXMgKGluY2x1ZGluZworICAgKiBzZXR0aW5nIHRoZSBwcm9wZXIgcmVmZXJlbmNlcykgYnkgaXRzZWxmIGUuZy4gd2l0aCBhbm90aGVyIGNhbGwgdG8KKyAgICogc2hhbGxvd0NvcHk7IGRlZXBDb3B5IGlzIG5vdCBuZWNlc3NhcnkgaW4gdGhpcyBjYXNlIGJlY2F1c2UKKyAgICogQW9NZWFzdXJlbWVudFF1YW50aXR5IGhhcyBubyBjaGlsZHJlbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIG5ld05hbWUgIFRoZSBuYW1lIG9mIHRoZSBuZXcgaW5zdGFuY2UgZWxlbWVudC4gSWYgYSBuZXcKKyAgICogICAgICAgICAgICAgICAgICB2ZXJzaW9uIHNoYWxsIGJlIGNyZWF0ZWQgdGhpcyBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwKKyAgICogICAgICAgICAgICAgICAgICB0byB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgdGhlIGNvcHkuIEluIHRoaXMgY2FzZSBhCisgICAqICAgICAgICAgICAgICAgICAgbmV3IHZlcnNpb24gbXVzdCBiZSBwcm92aWRlZC4KKyAgICoKKyAgICogQHBhcmFtICBuZXdWZXJzaW9uICBUaGUgdmVyc2lvbiBvZiB0aGUgbmV3IGluc3RhbmNlIGVsZW1lbnQuIFRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwgaWYgYSBuZXcgbmFtZSBpcyBwcm92aWRlZC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlZmVyZW5jZSB0byB0aGUgY29waWVkIGluc3RhbmNlIGVsZW1lbnQgaGllcmFyY2h5LgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudCBkZWVwQ29weSgKKyAgICAgIGluIFRfU1RSSU5HIG5ld05hbWUsCisgICAgICBpbiBUX1NUUklORyBuZXdWZXJzaW9uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMjkpCisgICAqIEdldCB0aGUgc2VxdWVuY2Ugb2YgdGhlIHZhbHVlcyBvZiB0aGUgYXBwbGljYXRpb24gb3IgaW5zdGFuY2UKKyAgICogYXR0cmlidXRlcywgc3BlY2lmaWVkIGJ5IHRoZWlyIG5hbWVzLiAgVGhlIG5hbWUgc2VxdWVuY2UgY2FuIHVzZSBhCisgICAqIHBhdHRlcm4gKCopIGZvciBhbGwgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4gVGhpcyBtZWFucworICAgKiB0aGF0IGFwcGxpY2F0aW9uIGFzIHdlbGwgYXMgICBpbnN0YW5jZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVsaXZlcmVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGF0dHJOYW1lcyAgVGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIHJlcG9ydGVkLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2VxdWVuY2Ugb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMuCisgICAqLworICAgTmFtZVZhbHVlVW5pdFNlcXVlbmNlIGdldFZhbHVlU2VxKAorICAgICAgaW4gTmFtZVNlcXVlbmNlIGF0dHJOYW1lcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDMwKQorICAgKiBEZXN0cm95IHRoZSBvYmplY3Qgb24gdGhlIHNlcnZlci4gVGhlIGRlc3RydWN0b3Igb2YgdGhlIGNsaWVudCBzbworICAgKiB0aGUgc2VydmVyIGtub3dzIHRoaXMgb2JqZWN0IGlzIG5vdCB1c2VkIGFueW1vcmUgYnkgdGhlIGNsaWVudC4KKyAgICogQWNjZXNzIHRvIHRoaXMgb2JqZWN0IGFmdGVyIHRoZSBkZXN0cm95IG1ldGhvZCB3aWxsIGxlYWQgdG8gYW4KKyAgICogZXhjZXB0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgZGVzdHJveSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAzMSkKKyAgICogQ29tcGFyZSB0d28gaW5zdGFuY2UgZWxlbWVudHMuIFRoZSBJZCdzIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50cworICAgKiBhbmQgdGhlIElkJ3Mgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnRzIGFyZSBjb21wYXJlZC4gVGhlIElkJ3Mgb2YgdGhlCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnRzIHdpbGwgYmUgY29tcGFyZSBmaXJzdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb21wSWVPYmogIFRoZSBpbnN0YW5jZSBlbGVtZW50IHRvIGNvbXBhcmUgd2l0aC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGRpZmZlcmVuY2Ugb2YgdGhlIElkJ3MuIE1lYW5pbmc6CisgICAqICAgICAgICAgIGRpZmYgPCAwIEVsZW1JZCBvZiBpbnN0YW5jZSBpcyBzbWFsbGVyIHRoZW4gaW5zdGFuY2UgdG8KKyAgICogICAgICAgICAgY29tcGFyZSB3aXRoLgorICAgKiAgICAgICAgICBkaWZmID09IDAgRWxlbUlkIGlzIGlkZW50aWNhbC4KKyAgICogICAgICAgICAgZGlmZiA+IDAgRWxlbUlkIG9mIGluc3RhbmNlIGlzIGdyZWF0ZXIgdGhlbiBpbnN0YW5jZSB0bworICAgKiAgICAgICAgICBjb21wYXJlIHdpdGguCisgICAqLworICAgVF9MT05HTE9ORyBjb21wYXJlKAorICAgICAgaW4gSW5zdGFuY2VFbGVtZW50IGNvbXBJZU9iaikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDMyKQorICAgKiBDcmVhdGUgYSBsaXN0IHdpdGggaW5zdGFuY2VzIHdoaWNoIGFyZSByZWxhdGVkIHRvIHRoZSBhY3R1YWwKKyAgICogaW5zdGFuY2UgZWxlbWVudC4gVGhlIGF0dHJpYnV0ZSBhcmUgZ2l2ZW4gd2l0aCB0aGUgbmFtZSBvZiB0aGUKKyAgICogc2VxdWVuY2UuIFRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMgYXJlIGdpdmVuIGluIHRoZSB2YWx1ZQorICAgKiBzZXF1ZW5jZS4gVGhlIGluZGV4IGluIHRoZSBkaWZmZXJlbnQgdmFsdWUgc2VxdWVuY2VzIG1hdGNoIGZvciBvbmUKKyAgICogaW5zdGFuY2UgZWxlbWVudC4gVGhlIGluZGV4IGluIHRoZSBpbnN0YW5jZSBlbGVtZW50IHNlcXVlbmNlIG9mIHRoZQorICAgKiByZWxhdGVkIGluc3RhbmNlcyBtYXRjaCBmb3IgdGhlIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgaW5kZXggaW4gdGhlCisgICAqIHZhbHVlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0lOVkFMSURfUkVRVUVTVAorICAgKgorICAgKiBAcGFyYW0gIGFwcGxSZWwgIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBmb3Igd2l0Y2ggdGhlIHJlbGF0ZWQKKyAgICogICAgICAgICAgICAgICAgICBpbnN0YW5jZXMgd2lsbCBiZSBjcmVhdGVkLgorICAgKgorICAgKiBAcGFyYW0gIGF0dHJpYnV0ZXMgIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZXMuCisgICAqCisgICAqIEBwYXJhbSAgcmVsYXRlZEluc3RhbmNlcyAgVGhlIGxpc3Qgd2l0aCByZWxhdGVkIGluc3RhbmNlcyBmb3IKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgYXBwbGljYXRpb24gcmVsYXRpb25zLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbGlzdCB3aXRoIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZXMuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50U2VxdWVuY2UgY3JlYXRlUmVsYXRlZEluc3RhbmNlcygKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbFJlbCwKKyAgICAgIGluIE5hbWVWYWx1ZVNlcVVuaXRTZXF1ZW5jZSBhdHRyaWJ1dGVzLAorICAgICAgaW4gQXBwbGljYXRpb25SZWxhdGlvbkluc3RhbmNlRWxlbWVudFNlcVNlcXVlbmNlIHJlbGF0ZWRJbnN0YW5jZXMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAzMykKKyAgICogVXBjYXN0IHRoZSBJbnN0YW5jZUVsZW1lbnQgb2JqZWN0IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EU0ZpbGUKKyAgICogaW50ZXJmYWNlIGZvciBhbiBpbnN0YW5jZS4gCisgICAqIAorICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBpbnZva2VkIGZvciBpbnN0YW5jZXMgb2YgYW4gYXBwbGljYXRpb24KKyAgICogZWxlbWVudCBkZXJpdmVkIGZyb20KKyAgICogdGhlIGJhc2UgZWxlbWVudCBBb0ZpbGUgYW5kIHJldHVybnMgYW4gT0RTRmlsZSBpbnRlcmZhY2UuCisgICAqIAorICAgKiBBbiBleGNlcHRpb24gd2l0aCB0aGUgZXJyb3IgY29kZSBBT19JTlZBTElEX0JBU0VUWVBFIGlzIHRocm93biB3aGVuCisgICAqIHRoZSBpbnN0YW5jZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYW4gYXBwbGljYXRpb24gZWxlbWVudCBkZXJpdmVkCisgICAqIGZyb20gdGhlIGJhc2UgZWxlbWVudCBBb0ZpbGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBPRFNGaWxlIGludGVyZmFjZSB0byBhY2Nlc3MgdGhlIGRlc2lyZWQgZmlsZS4KKyAgICovCisgICBPRFNGaWxlIHVwY2FzdE9EU0ZpbGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgaW5zdGFuY2UgZWxlbWVudCBpdGVyYXRvciBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEluc3RhbmNlRWxlbWVudEl0ZXJhdG9yIHsKKworICAgLyoqICgxNTAwMSkKKyAgICogRGVzdHJveSB0aGUgaXRlcmF0b3IgYW5kIGZyZWUgdGhlIGFzc29jaWF0ZWQgbWVtb3J5LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIGRlc3Ryb3koKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTUwMDIpCisgICAqIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjY2Vzc2libGUgYnkgdGhlIGl0ZXJhdG9yLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICovCisgICBUX0xPTkcgZ2V0Q291bnQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTUwMDMpCisgICAqIEdldCB0aGUgbmV4dCBuIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGhvd19tYW55ICBUaGUgbnVtYmVyIG9mIHJlcXVlc3RlZCBlbGVtZW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbiBpbnN0YW5jZSBlbGVtZW50cyBmcm9tIHRoZSBpbnN0YW5jZSBzZXF1ZW5jZS4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnRTZXF1ZW5jZSBuZXh0TigKKyAgICAgIGluIFRfTE9ORyBob3dfbWFueSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE1MDA0KQorICAgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IGluc3RhbmNlIGVsZW1lbnQgZnJvbSB0aGUgaW5zdGFuY2Ugc2VxdWVuY2UuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50IG5leHRPbmUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTUwMDUpCisgICAqIFJlc2V0IHRoZSBwb2ludGVyIGluIHRoZSBlbGVtZW50IHNlcXVlbmNlIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIHJlc2V0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3IuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgbWVhc3VyZW1lbnQgaW50ZXJmYWNlLlRoZSBpbnRlcmZhY2UgTWVhc3VyZW1lbnQgZXh0ZW5kcworKiB0aGUgaW50ZXJmYWNlIEluc3RhbmNlRWxlbWVudC4gVGh1cyBhbGxsIG1ldGhvZHMgb2YgdGhlIGludGVyZmFjZQorKiBJbnN0YW5jZUVsZW1lbnQgZG8gYWxzbyB3b3JrIGhlcmUuCisqLworaW50ZXJmYWNlIE1lYXN1cmVtZW50IDogSW5zdGFuY2VFbGVtZW50IHsKKworICAgLyoqICgxNjAwMSkKKyAgICogQ3JlYXRlIGEgc3VibWF0cml4IGxpbmsuIFRoZSBzdWJtYXRyaXggbGluayBpcyBvbmx5IHZhbGlkIGluIHRoZQorICAgKiBjdXJyZW50IHNlc3Npb24uIFdoZW4gdGhlIHNlc3Npb24gaXMgY2xvc2VkIHRoZSBzdWJtYXRyaXggbGluayB3aWxsCisgICAqIGJlIGRlc3Ryb3llZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXcgc3VibWF0cml4IGxpbmsuCisgICAqLworICAgU01hdExpbmsgY3JlYXRlU01hdExpbmsoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTYwMDIpCisgICAqIEdldCB0aGUgbGlzdCBvZiB0aGUgc3VibWF0cml4IGxpbmtzIC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhdmFpbGFibGUgc3VibWF0cml4IGxpbmtzLgorICAgKi8KKyAgIFNNYXRMaW5rU2VxdWVuY2UgZ2V0U01hdExpbmtzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE2MDAzKQorICAgKiBHZXQgdGhlIHZhbHVlIG1hdHJpeCBvZiBhIG1lYXN1cmVtZW50LiAKKyAgICogQnkgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIHZhbHVlIG1hdHJpeCBtb2RlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZQorICAgKiBtYXRyaXggd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBjb250ZXh0IHZhcmlhYmxlICdWQUxVRU1BVFJJWF9NT0RFJy4KKyAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gZXNwZWNpYWxseSBvbiBkaWZmZXJlbnQgbW9kZXMgb2YgdGhlIHZhbHVlCisgICAqIG1hdHJpeCwgc2VlIGRlc2NyaXB0aW9uIGF0IHRoZSBtZXRob2QgZ2V0VmFsdWVNYXRyaXhJbk1vZGUoKSBvZiB0aGlzCisgICAqIGludGVyZmFjZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSB2YWx1ZSBtYXRyaXguCisgICAqLworICAgVmFsdWVNYXRyaXggZ2V0VmFsdWVNYXRyaXgoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTYwMDQpCisgICAqIFJlbW92ZSBhIHN1Ym1hdHJpeCBsaW5rLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBzbUxpbmsgIFRoZSBzdWIgbWF0cml4IGxpbmsgdG8gYmUgcmVtb3ZlZC4KKyAgICovCisgICB2b2lkIHJlbW92ZVNNYXRMaW5rKAorICAgICAgaW4gU01hdExpbmsgc21MaW5rKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTYwMDUpCisgICAqIEdldCB0aGUgdmFsdWUgbWF0cml4IG9mIGEgbWVhc3VyZW1lbnQgaW4gdGhlIHJlcXVlc3RlZCBtb2RlLgorICAgKiAKKyAgICogVGhlIHNlcnZlciBjaGVja3MgdGhlIGluZGVwZW5kZW50IGNvbHVtbiwgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQorICAgKiBzdWJtYXRyaXggYXQgdGhlIG1lYXN1cmVtZW50IHRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgaW5kZXBlbmRlbnQKKyAgICogY29sdW1uIHdpdGggdGhlIHNhbWUgbWVhc3VyZW1lbnQgcXVhbnRpdHkgaW4gZWFjaCBzdWJtYXRyaXgsCisgICAqIG90aGVyd2lzZSB0aGUgZXhjZXB0aW9uIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFIGlzCisgICAqIHRocm93bi4KKyAgICogCisgICAqIFRoZSBzZXJ2ZXIgdGhyb3dzIHRoZSBleGNlcHRpb24gQU9fSU5WQUxJRF9WQUxVRU1BVFJJWF9TVFJVQ1RVUkUKKyAgICogd2hlbiBpdCBpcyB1bmFibGUgdG8gY3JlYXRlIHRoZSB2YWx1ZSBtYXRyaXggZHVlIHRvIHRoZSBkYXRhIG9mIHRoZQorICAgKiBtZWFzdXJlbWVudAorICAgKiAtIGlmIHRoZXJlIGFyZSBubyBpbmRlcGVuZGVudCBjb2x1bW4KKyAgICogLSBpZiB0aGVyZSBhcmUgZGlmZmVyZW50IGluZGVwZW5kZW50IGNvbHVtbnMKKyAgICogLSBpZiB0aGVyZSBhcmUgc3ViIG1hdHJpY2VzIHdpdGggbW9yZSB0aGFuIG9uZSBpbmRlcGVuZGVudCBjb2x1bW4uCisgICAqIAorICAgKiBUaGUgc2VydmVyIG9yZGVycyB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB0aGUgdmFsdWVzIG9mIHRoZQorICAgKiBpbmRlcGVuZGVudCBsb2NhbGNvbHVtbi4gKGluIGFzY2VuZGluZyBvcmRlcikgSXQgaXMgdXAgdG8gdGhlIHNlcnZlcgorICAgKiB3aGF0IHZhbHVlIGlzIHJldHVybmVkIHdoZW4gYSBtZWFzdXJlbWVudCBxdWFudGl0eSBoYXMgdHdvIGRpZmZlcmVudAorICAgKiB2YWx1ZXMgYXQgdGhlIHNhbWUgaW5kZXBlbmRlbnQgcG9pbnQuIFRoZSBnYXBzIGFyZSBtYXJrZWQgd2l0aCBGbGFncworICAgKiBpbiBUU19WYWx1ZVNlcSAoZmxhZ3ZhbHVlID0gMCkuCisgICAqIAorICAgKiBJbiB0aGUgQ0FMQ1VMQVRFRCBtb2RlIHRoZSBzZXJ2ZXIgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCB2YWx1ZXMgZm9yCisgICAqIGltcGxpY2l0IGFuZCByYXcgdmFsdWVzLiBUaGUgc2VydmVyIHJldHVybnMgYXQgZWFjaCBtZWFzdXJlbWVudAorICAgKiBwb2ludCB0aGUgZXhwbGljaXQgdmFsdWUgYXMgdGhlIHZhbHVlIGZvciB0aGUgaW1wbGljaXQgY2hhbm5lbHMuIFRoZQorICAgKiByYXcgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIHRvIHRoZSBleHBsaWNpdCB2YWx1ZXMuCisgICAqIAorICAgKiBJbiB0aGUgU1RPUkFHRSBtb2RlIHRoZSBzZXJ2ZXIgaGFuZGxlcyB0aGUgdmFsdWVzIG9mIHRoZSBsb2NhbGNvbHVtbgorICAgKiBhcyB0aGV5IGFyZSBpbiB0aGUgc3RvcmFnZS4gV3JpdGUgaXMgb25seSBhbGxvd2VkIHdoZW4gdGhlIHZhbHVlCisgICAqIG1hdHJpeCBpcyBpbiB0aGUgU1RST0FHRSBtb2RlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fSU5WQUxJRF9WQUxVRU1BVFJJWF9TVFJVQ1RVUkUKKyAgICoKKyAgICogQHBhcmFtICB2bU1vZGUgIFRoZSByZXF1ZXN0ZWQgbW9kZSBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIFZhbHVlTWF0cml4IGdldFZhbHVlTWF0cml4SW5Nb2RlKAorICAgICAgaW4gVmFsdWVNYXRyaXhNb2RlIHZtTW9kZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgTWVhc3VyZW1lbnQuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgbmFtZSBpdGVyYXRvciBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIE5hbWVJdGVyYXRvciB7CisKKyAgIC8qKiAoMTcwMDEpCisgICAqIERlc3Ryb3kgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIG1lbW9yeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBkZXN0cm95KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE3MDAyKQorICAgKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqLworICAgVF9MT05HIGdldENvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE3MDAzKQorICAgKiBHZXQgdGhlIG5leHQgbiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBob3dfbWFueSAgVGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IG4gbmFtZXMgZnJvbSB0aGUgbmFtZSBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbmV4dE4oCisgICAgICBpbiBUX0xPTkcgaG93X21hbnkpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNzAwNCkKKyAgICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBuYW1lIGZyb20gdGhlIG5hbWUgc2VxdWVuY2UuCisgICAqLworICAgTmFtZSBuZXh0T25lKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE3MDA1KQorICAgKiBSZXNldCB0aGUgcG9pbnRlciBpbiB0aGUgZWxlbWVudCBzZXF1ZW5jZSB0byB0aGUgZmlyc3QgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCByZXNldCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIE5hbWVJdGVyYXRvci4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlIGl0ZXJhdG9yIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgTmFtZVZhbHVlSXRlcmF0b3IgeworCisgICAvKiogKDE4MDAxKQorICAgKiBEZXN0cm95IHRoZSBpdGVyYXRvciBhbmQgZnJlZSB0aGUgYXNzb2NpYXRlZCBtZW1vcnkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgZGVzdHJveSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxODAwMikKKyAgICogR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjY2Vzc2libGUgYnkgdGhlIGl0ZXJhdG9yLgorICAgKi8KKyAgIFRfTE9ORyBnZXRDb3VudCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxODAwMykKKyAgICogR2V0IHRoZSBuZXh0IG4gZWxlbWVudHMgZnJvbSB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaG93X21hbnkgIFRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIGVsZW1lbnRzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBuIG5hbWUtdmFsdWUgcGFpcnMgZnJvbSB0aGUgbmFtZS12YWx1ZSBwYWlyCisgICAqICAgICAgICAgIHNlcXVlbmNlLgorICAgKi8KKyAgIE5hbWVWYWx1ZVNlcXVlbmNlIG5leHROKAorICAgICAgaW4gVF9MT05HIGhvd19tYW55KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTgwMDQpCisgICAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbmFtZS12YWx1ZSBwYWlyIGZyb20gdGhlIG5hbWUtdmFsdWUgcGFpciBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lVmFsdWUgbmV4dE9uZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxODAwNSkKKyAgICogUmVzZXQgdGhlIHBvaW50ZXIgaW4gdGhlIGVsZW1lbnQgc2VxdWVuY2UgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgcmVzZXQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBOYW1lVmFsdWVJdGVyYXRvci4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlLXVuaXQgaXRlcmF0b3IgaW50ZXJmYWNlLiBUaGlzIGludGVyZmFjZSBpcworKiBpZGVudGljYWwgd2l0aCB0aGUgTmFtZVZhbHVlVW5pdElkSXRlcmF0b3IsIGV4Y2VwdCB0aGUgdW5pdCBpcyBnaXZlbiBhcworKiBhIHN0cmluZyBpbnNlYWQgb2YgYW4gSWQuCisqLworaW50ZXJmYWNlIE5hbWVWYWx1ZVVuaXRJdGVyYXRvciB7CisKKyAgIC8qKiAoMTkwMDEpCisgICAqIERlc3Ryb3kgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIG1lbW9yeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBkZXN0cm95KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE5MDAyKQorICAgKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqLworICAgVF9MT05HIGdldENvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE5MDAzKQorICAgKiBHZXQgdGhlIG5leHQgbiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBob3dfbWFueSAgVGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IG4gbmFtZS12YWx1ZS11bml0IHR1cGxlcyBmcm9tIHRoZSBuYW1lLXZhbHVlLXVuaXQKKyAgICogICAgICAgICAgdHVwbGUgc2VxdWVuY2UuCisgICAqLworICAgTmFtZVZhbHVlVW5pdFNlcXVlbmNlIG5leHROKAorICAgICAgaW4gVF9MT05HIGhvd19tYW55KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTkwMDQpCisgICAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbmFtZS12YWx1ZS11bml0IHR1cGxlIGZyb20gdGhlIG5hbWUtdmFsdWUtdW5pdAorICAgKiAgICAgICAgICB0dXBsZSBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lVmFsdWVVbml0IG5leHRPbmUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTkwMDUpCisgICAqIFJlc2V0IHRoZSBwb2ludGVyIGluIHRoZSBlbGVtZW50IHNlcXVlbmNlIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIHJlc2V0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgTmFtZVZhbHVlVW5pdEl0ZXJhdG9yLgorCisvKioKKyogVGhlIEFTQU0gT0RTIHN1Ym1hdHJpeCBsaW5rIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgU01hdExpbmsgeworCisgICAvKiogKDIwMDAxKQorICAgKiBHZXQgdGhlIGxpbmsgb3IgYnVpbGQgdHlwZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBsaW5rIHR5cGUuCisgICAqLworICAgQnVpbGRVcEZ1bmN0aW9uIGdldExpbmtUeXBlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDAyKQorICAgKiBHZXQgdGhlIG9yZGluYWwgb3Igc2VxdWVuY2UgbnVtYmVyCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2VxdWVuY2UgbnVtYmVyLgorICAgKi8KKyAgIFRfTE9ORyBnZXRPcmRpbmFsTnVtYmVyKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDAzKQorICAgKiBHZXQgdGhlIGZpcnN0IHN1Ym1hdHJpeCBvZiB0aGUgbGluay4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBmaXJzdCBzdWJtYXRyaXggb2YgdGhlIGxpbmsuCisgICAqLworICAgU3ViTWF0cml4IGdldFNNYXQxKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDA0KQorICAgKiBHZXQgdGhlIGJpbmQgY29sdW1ucyBvZiB0aGUgZmlyc3Qgc3VibWF0cml4IHVzZWQgaW4gdGhlIGxpbmsgKGUuZy4KKyAgICogVGltZSkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgY29sdW1ucyBvZiB0aGUgZmlyc3Qgc3VibWF0cml4LgorICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldFNNYXQxQ29sdW1ucygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMDAwNSkKKyAgICogR2V0IHRoZSBzZWNvbmQgc3VibWF0cml4IG9mIHRoZSBsaW5rLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHNlY29uZCBzdWJtYXRyaXggb2YgdGhlIGxpbmsuCisgICAqLworICAgU3ViTWF0cml4IGdldFNNYXQyKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDA2KQorICAgKiBHZXQgdGhlIGJpbmQgY29sdW1ucyBvZiB0aGUgc2Vjb25kIHN1Ym1hdHJpeCB1c2VkIGluIHRoZSBsaW5rIChlLmcuCisgICAqIFRpbWUpLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGNvbHVtbnMgb2YgdGhlIHNlY29uZCBzdWJtYXRyaXguCisgICAqLworICAgQ29sdW1uU2VxdWVuY2UgZ2V0U01hdDJDb2x1bW5zKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDA3KQorICAgKiBTZXQgdGhlIGJ1aWxkIG9yIGxpbmsgdHlwZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9CVUlMRFVQX0ZVTkNUSU9OCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgbGlua1R5cGUgIFRoZSByZXF1ZXN0ZWQgYnVpbGQtdXAgZnVuY3Rpb24uCisgICAqLworICAgdm9pZCBzZXRMaW5rVHlwZSgKKyAgICAgIGluIEJ1aWxkVXBGdW5jdGlvbiBsaW5rVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDA4KQorICAgKiBTZXQgdGhlIG9yZGluYWwgb3Igc2VxdWVuY2UgbnVtYmVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX09SRElOQUxOVU1CRVIKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBvcmRpbmFsTnVtYmVyICBUaGUgc2VxdWVuY2UgbnVtYmVyLgorICAgKi8KKyAgIHZvaWQgc2V0T3JkaW5hbE51bWJlcigKKyAgICAgIGluIFRfTE9ORyBvcmRpbmFsTnVtYmVyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjAwMDkpCisgICAqIFNldCB0aGUgZmlyc3Qgc3VibWF0cml4IG9mIHRoZSBsaW5rLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1NVQk1BVFJJWAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHN1Yk1hdDEgIFRoZSBmaXJzdCBzdWIgbWF0cml4IG9mIHRoZSBzdWIgbWF0cml4IGxpbmsuCisgICAqLworICAgdm9pZCBzZXRTTWF0MSgKKyAgICAgIGluIFN1Yk1hdHJpeCBzdWJNYXQxKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjAwMTApCisgICAqIFNldCB0aGUgYmluZCBjb2x1bW5zIG9mIHRoZSBmaXJzdCBzdWJtYXRyaXggdXNlZCBpbiB0aGUgbGluayAoZS5nLgorICAgKiBUaW1lKS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9DT0xVTU4KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2x1bW5zICBUaGUgY29sdW1uIHNlcXVlbmNlIG9mIHRoZSBzdWIgbWF0cml4LgorICAgKi8KKyAgIHZvaWQgc2V0U01hdDFDb2x1bW5zKAorICAgICAgaW4gQ29sdW1uU2VxdWVuY2UgY29sdW1ucykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDExKQorICAgKiBTZXQgdGhlIHNlY29uZCBzdWJtYXRyaXggb2YgdGhlIGxpbmsuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19JTlZBTElEX1NVQk1BVFJJWAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgc3ViTWF0MiAgVGhlIHNlY29uZCBzdWIgbWF0cml4IG9mIHRoZSBzdWIgbWF0cml4IGxpbmsuCisgICAqLworICAgdm9pZCBzZXRTTWF0MigKKyAgICAgIGluIFN1Yk1hdHJpeCBzdWJNYXQyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjAwMTIpCisgICAqIFNldCB0aGUgYmluZCBjb2x1bW5zIG9mIHRoZSBzZWNvbmQgc3VibWF0cml4IHVzZWQgaW4gdGhlIGxpbmsgKGUuZy4KKyAgICogVGltZSkuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY29sdW1uIGJvdW5kIHRoZSBjb2x1bW4gc2VxdWVuY2UKKyAgICogbXVzdCBiZSBpZGVudGljYWwgd2l0aCB0aGUgY29sdW1uIHNlcXVlbmNlIG9mIHRoZSBmaXJzdCBzdWJtYXRyaXguCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19JTlZBTElEX0NPTFVNTgorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sdW1ucyAgVGhlIGNvbHVtbiBzZXF1ZW5jZSBvZiB0aGUgc3ViIG1hdHJpeC4KKyAgICovCisgICB2b2lkIHNldFNNYXQyQ29sdW1ucygKKyAgICAgIGluIENvbHVtblNlcXVlbmNlIGNvbHVtbnMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIFNNYXRMaW5rLgorCisvKioKKyogVGhlIEFTQU0gT0RTIHN1Ym1hdHJpeCBpbnRlcmZhY2UuIFRoZSBpbnN0YW5jZXMgb2YgdGhlIHN1Ym1hdHJpeCBjYW4gYmUKKyogYWNjZXNzZWQgdmlhIHRoZSBtZXRob2QgZ2V0UmVsYXRlZEluc3RhbmNlcyBvZiB0aGUgaW50ZXJmYWNlCisqIE1lYXN1cmVtZW50LiBUaGUgaW50ZXJmYWNlIFN1Yk1hdHJpeCBleHRlbmRzIHRoZSBpbnRlcmZhY2UKKyogSW5zdGFuY2VFbGVtZW50LiBUaHVzIGFsbGwgbWV0aG9kcyBvZiB0aGUgaW50ZXJmYWNlIEluc3RhbmNlRWxlbWVudCBkbworKiBhbHNvIHdvcmsgaGVyZS4KKyovCitpbnRlcmZhY2UgU3ViTWF0cml4IDogSW5zdGFuY2VFbGVtZW50IHsKKworICAgLyoqICgyMTAwMSkKKyAgICogR2V0IHRoZSBjb2x1bW5zIG9mIHRoZSBzdWJtYXRyaXguIFRoZSBjb2x1bW4gaXMgbm90IGluaGVyaXRlZCBmcm9tCisgICAqIHRoZSBJbnN0YW5jZUVsZW1lbnQgaW50ZXJmYWNlLiBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byBnZXQgYSBjb2x1bW4uCisgICAqIFRoZSBjb2x1bW5zIGFyZSB1c2VkIGluIHRoZSBTTWF0TGluayBpbnRlcmZhY2UgdG8gYnVpbGQgdGhlIHZhbHVlCisgICAqIG1hdHJpeC4gVGhlIHBhdHRlcm4gaXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkCisgICAqIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgY29sdW1uCisgICAqICAgICAgICAgICAgICAgICAgICAgbmFtZXMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBjb2x1bW5zIG9mIHRoZSBzdWJtYXRyaXguCisgICAqLworICAgQ29sdW1uU2VxdWVuY2UgZ2V0Q29sdW1ucygKKyAgICAgIGluIFBhdHRlcm4gY29sUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIxMDAyKQorICAgKiBHZXQgYSB2YWx1ZSBtYXRyaXggb2YgdGhlIHN1Ym1hdHJpeC4KKyAgICogQnkgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIHZhbHVlIG1hdHJpeCBtb2RlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZQorICAgKiBtYXRyaXggd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBjb250ZXh0IHZhcmlhYmxlICdWQUxVRU1BVFJJWF9NT0RFJy4KKyAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gZXNwZWNpYWxseSBvbiBkaWZmZXJlbnQgbW9kZXMgb2YgdGhlIHZhbHVlCisgICAqIG1hdHJpeCwgc2VlIGRlc2NyaXB0aW9uIGF0IHRoZSBtZXRob2QgZ2V0VmFsdWVNYXRyaXhJbk1vZGUoKSBvZiB0aGlzCisgICAqIGludGVyZmFjZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfU01BVExJTksKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZhbHVlIG1hdHJpeC4KKyAgICovCisgICBWYWx1ZU1hdHJpeCBnZXRWYWx1ZU1hdHJpeCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMTAwMykKKyAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBvZiB0aGUgc3VibWF0cml4LiBUaGUgbmFtZSBzZXF1ZW5jZSBpcworICAgKiBpZGVudGljYWwgd2l0aCB0aGUgbmFtZXMgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLiBUaGUgcGF0dGVybiBpcworICAgKiBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2xQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSBjb2x1bW4KKyAgICogICAgICAgICAgICAgICAgICAgICBuYW1lcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGNvbHVtbiBuYW1lcyBvZiB0aGUgc3VibWF0cml4LgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBsaXN0Q29sdW1ucygKKyAgICAgIGluIFBhdHRlcm4gY29sUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIxMDA0KQorICAgKiBHZXQgdGhlIHZhbHVlIG1hdHJpeCBvZiBhIHN1Ym1hdHJpeCBpbiB0aGUgcmVxdWVzdGVkIG1vZGUuCisgICAqIAorICAgKiBUaGUgc2VydmVyIGRvZXNuJ3QgY2hlY2sgYW55IGluZGVwZW5kZW50IGNvbHVtbnMuIFRoZSBjb2x1bW5zIGFyZQorICAgKiBvbmx5IHRoZSBsb2NhbCBjb2x1bW5zIGZyb20gdGhpcyBzdWJtYXRyaXguIFRoZSBmbGFncyBpbiB0aGUKKyAgICogVFNfVmFsdWVTZXEgYXJlIHRoZSBmbGFncyBvZiB0aGUgbG9jYWxjb2x1bW4uIElmIG5vIGZsYWdzIGFyZSBnaXZlbgorICAgKiB0aGVyZSBhcmUgbm8gZmxhZ3MgYXZhaWxhYmxlLCB0aGUgY2xpZW50IGhhdmUgdG8gY2hlY2sgdGhlCisgICAqIGdsb2JhbF9mbGFnLgorICAgKiAKKyAgICogSW4gdGhlIENBTENVTEFURUQgbW9kZSB0aGUgc2VydmVyIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgdmFsdWVzIGZvcgorICAgKiBpbXBsaWNpdCBhbmQgcmF3IHZhbHVlcy4gVGhlIHNlcnZlciByZXR1cm5zIGF0IGVhY2ggbWVhc3VyZW1lbnQKKyAgICogcG9pbnQgdGhlIGV4cGxpY2l0IHZhbHVlIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGltcGxpY2l0IGNoYW5uZWxzLiBUaGUKKyAgICogcmF3IHZhbHVlcyBhcmUgY2FsY3VsYXRlZCB0byB0aGUgZXhwbGljaXQgdmFsdWVzLgorICAgKiAKKyAgICogSW4gdGhlIFNUT1JBR0UgbW9kZSB0aGUgc2VydmVyIGhhbmRsZXMgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWxjb2x1bW4KKyAgICogYXMgdGhleSBhcmUgaW4gdGhlIHN0b3JhZ2UuIFdyaXRlIGlzIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSB2YWx1ZQorICAgKiBtYXRyaXggaXMgaW4gdGhlIFNUUk9BR0UgbW9kZS4gVGhlIHZhbHVlcyBhcmUgZXhhY3RseSBmcm9tIHRoaXMKKyAgICogc3VibWF0cml4LiBUaGUgcmF3IC8gaW1wbGljaXQgdmFsdWVzIGFyZSByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdm1Nb2RlICBUaGUgcmVxdWVzdGVkIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZhbHVlIG1hdHJpeC4KKyAgICovCisgICBWYWx1ZU1hdHJpeCBnZXRWYWx1ZU1hdHJpeEluTW9kZSgKKyAgICAgIGluIFZhbHVlTWF0cml4TW9kZSB2bU1vZGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIFN1Yk1hdHJpeC4KKworLyoqCisqIFRoZSBBU0FNIE9EUyB2YWx1ZSBtYXRyaXggaW50ZXJmYWNlLiBWYWx1ZSBtYXRyaXggaXMgYW4gaW50ZXJmYWNlIHVzZWQKKyogYnkgTWVhc3VyZW1lbnQgYW5kIFN1Yk1hdHJpeCB0byBoYW5kbGUgdmVjdG9ycyBvZiB2YWx1ZXMuCisqLworaW50ZXJmYWNlIFZhbHVlTWF0cml4IHsKKworICAgLyoqICgyMjAwMSkKKyAgICogR2V0IHRoZSBjb2x1bW5zIG9mIHRoZSB2YWx1ZSBtYXRyaXggbm8gbWF0dGVyIHdoZXRoZXIgdGhlIGNvbHVtbiBpcworICAgKiBkZXBlbmRlbnQgb3IgaW5kZXBlbmRlbnQuIFRoZSBwYXR0ZXJuIGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkKKyAgICogY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGNvbFBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIGNvbHVtbgorICAgKiAgICAgICAgICAgICAgICAgICAgIG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LCBubyBtYXR0ZXIgd2hldGhlciB0aGUKKyAgICogICAgICAgICAgY29sdW1uIGlzIGRlcGVuZGVudCwgaW5kZXBlbmRlbnQgb3Igc2NhbGluZworICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldENvbHVtbnMoCisgICAgICBpbiBQYXR0ZXJuIGNvbFBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAwMikKKyAgICogR2V0IHRoZSBjb2x1bW4gY291bnQgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIFRfTE9ORyBnZXRDb2x1bW5Db3VudCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAwMykKKyAgICogR2V0IHRoZSBpbmRlcGVuZGVudCBjb2x1bW5zIG9mIHRoZSB2YWx1ZSBtYXRyaXguIFRoZSBpbmRlcGVuZGVudAorICAgKiBjb2x1bW5zIGFyZSB0aGUgY29sdW1ucyB1c2VkIHRvIGJ1aWxkIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUKKyAgICogICAgICAgICAgICAgICAgICAgICBpbmRlcGVuZGVudCBjb2x1bW4gbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGluZGVwZW5kZW50IGNvbHVtbiBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldEluZGVwZW5kZW50Q29sdW1ucygKKyAgICAgIGluIFBhdHRlcm4gY29sUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDA0KQorICAgKiBHZXQgdGhlIHJvdyBjb3VudCBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqLworICAgVF9MT05HIGdldFJvd0NvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDA1KQorICAgKiBHZXQgYSBtZWFzdXJlbWVudCBwb2ludCBvZiB0aGUgdmFsdWUgbWF0cml4LiBUaGUgcGFyYW1ldGVyIG1lYVBvaW50CisgICAqIHNwZWNpZmllcyB0aGUgcm93IG9mIHRoZSBtYXRyaXguIFRoZSBpdGVyYXRvciBhbGxvd3MgdG8gYWNjZXNzIGFsbAorICAgKiBlbGVtZW50cyBpbiB0aGUgcm93LgorICAgKiAKKyAgICogVGhlIHNlcnZlciBiZWhhdmlvciBkZXBlbmRzIG9uIHRoZSBtb2RlIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqIFZhbHVlIG1hdHJpeCBtb2RlICdDQUxDVUxBVEVEJzoKKyAgICogSW4gY2FzZSAnc2VxdWVuY2VfcmVwcmVzZW50YXRpb24nIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGNvbHVtbgorICAgKiBpcyBvbmUgb2YgdGhlIGVudHJpZXMgJ3Jhd19saW5lYXInLCByYXdfcG9seW5vbWlhbCcsCisgICAqICdyYXdfbGluZWFyX2V4dGVybmFsJywgJ3Jhd19wb2x5bm9taWFsX2V4dGVybmFsJywKKyAgICogJ3Jhd19saW5lYXJfY2FsaWJyYXRlZCcsIG9yICdyYXdfbGluZWFyX2NhbGlicmF0ZWRfZXh0ZXJuYWwnLCB0aGUKKyAgICogc2VydmVyIHdpbGwgZmlyc3QgY2FsY3VsYXRlIHRoZSBwaHlzaWNhbCB2YWx1ZXMgZnJvbSByYXcgdmFsdWVzIGFuZAorICAgKiBnZW5lcmF0aW9uIHBhcmFtZXRlcnMsIGJlZm9yZSBpdCByZXR1cm5zIHRoZW0gdG8gdGhlIHJlcXVlc3RpbmcKKyAgICogY2xpZW50LgorICAgKiBWYWx1ZSBtYXRyaXggbW9kZSAnU1RPUkFHRSc6CisgICAqIEluIGNhc2UgJ3NlcXVlbmNlX3JlcHJlc2VudGF0aW9uJyBvZiB0aGUgY29ycmVzcG9uZGluZyBsb2NhbCBjb2x1bW4KKyAgICogaXMgb25lIG9mIHRoZSBlbnRyaWVzICdyYXdfbGluZWFyJywgcmF3X3BvbHlub21pYWwnLAorICAgKiAncmF3X2xpbmVhcl9leHRlcm5hbCcsICdyYXdfcG9seW5vbWlhbF9leHRlcm5hbCcsCisgICAqICdyYXdfbGluZWFyX2NhbGlicmF0ZWQnLCBvciAncmF3X2xpbmVhcl9jYWxpYnJhdGVkX2V4dGVybmFsJywgdGhlCisgICAqIHNlcnZlciB3aWxsIHJldHVybiB0aGUgcmF3IHZhbHVlcyBvZiB0aGUgbG9jYWwgY29sdW1uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIG1lYVBvaW50ICBUaGUgbWVhc3VyZW1lbnQgcG9pbnQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0ZWQgbWVhc3VyZW1lbnQgcG9pbnQuCisgICAqLworICAgTmFtZVZhbHVlVW5pdEl0ZXJhdG9yIGdldFZhbHVlTWVhUG9pbnQoCisgICAgICBpbiBUX0xPTkcgbWVhUG9pbnQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAwNikKKyAgICogR2V0IHRoZSB2YWx1ZXMgb3IgYSBwYXJ0IG9mIHZhbHVlcyBvZiB0aGUgY29sdW1uIGZyb20gdGhlIHZhbHVlCisgICAqIG1hdHJpeC4gVGhlIHBhcmFtZXRlciBjb2x1bW4gc3BlY2lmaWVzIGZyb20gd2hpY2ggY29sdW1uIHRoZSB2YWx1ZXMKKyAgICogd2lsbCBiZSByZXR1cm5lZC4gVGhlIHN0YXJ0UG9pbnQgYW5kIGNvdW50IHNwZWNpZnkgdGhlIHBhcnQgb2YgdGhlCisgICAqIHZlY3Rvci4gQSBzdGFydFBvaW50ID0gMCBhbmQgY291bnQgPSByb3dDb3VudCB3aWxsIHJldHVybiB0aGUgZW50aXJlCisgICAqIHZlY3Rvci4gV2hlbiBzdGFydFBvaW50ID49IHJvd0NvdW50IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uIElmCisgICAqIHN0YXJ0UG9pbnQgKyBjb3VudCA+IHJvd0NvdW50IG9ubHkgdGhlIHJlbWFpbmluZyB2YWx1ZXMgb2YgdGhlCisgICAqIHZlY3RvciBhcmUgcmV0dXJuZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFVzZSB0aGUgZ2V0TmFtZSBhbmQKKyAgICogZ2V0VW5pdCBtZXRob2Qgb2YgdGhlIGludGVyZmFjZSBjb2x1bW4gZm9yIHRoZSBuYW1lIGFuZCB0aGUgdW5pdCBvZgorICAgKiB0aGUgY29sdW1uLiBUaGUgbmFtZSBhbmQgdGhlIHZhbHVlIGFyZSBub3Qgc3RvcmVkIGF0IGVhY2ggZWxlbWVudCBvZgorICAgKiB0aGUgdmVjdG9yLiBUaGUgcmV0dXJuIHR5cGUgVFNfVmFsdWVTZXEgaXMgbm90IGEgc2VxdWVuY2Ugb2YKKyAgICogVFNfVmFsdWUgYnV0IGEgc3BlY2lhbCBzdHJ1Y3R1cmUuCisgICAqIAorICAgKiBUaGUgc2VydmVyIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICogVmFsdWUgbWF0cml4IG1vZGUgJ0NBTENVTEFURUQnOgorICAgKiBJbiBjYXNlICdzZXF1ZW5jZV9yZXByZXNlbnRhdGlvbicgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWwgY29sdW1uCisgICAqIGlzIG9uZSBvZiB0aGUgZW50cmllcyAncmF3X2xpbmVhcicsIHJhd19wb2x5bm9taWFsJywKKyAgICogJ3Jhd19saW5lYXJfZXh0ZXJuYWwnLCAncmF3X3BvbHlub21pYWxfZXh0ZXJuYWwnLAorICAgKiAncmF3X2xpbmVhcl9jYWxpYnJhdGVkJywgb3IgJ3Jhd19saW5lYXJfY2FsaWJyYXRlZF9leHRlcm5hbCcsIHRoZQorICAgKiBzZXJ2ZXIgd2lsbCBmaXJzdCBjYWxjdWxhdGUgdGhlIHBoeXNpY2FsIHZhbHVlcyBmcm9tIHJhdyB2YWx1ZXMgYW5kCisgICAqIGdlbmVyYXRpb24gcGFyYW1ldGVycywgYmVmb3JlIGl0IHJldHVybnMgdGhlbSB0byB0aGUgcmVxdWVzdGluZworICAgKiBjbGllbnQuCisgICAqIFZhbHVlIG1hdHJpeCBtb2RlICdTVE9SQUdFJzoKKyAgICogSW4gY2FzZSAnc2VxdWVuY2VfcmVwcmVzZW50YXRpb24nIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGNvbHVtbgorICAgKiBpcyBvbmUgb2YgdGhlIGVudHJpZXMgJ3Jhd19saW5lYXInLCByYXdfcG9seW5vbWlhbCcsCisgICAqICdyYXdfbGluZWFyX2V4dGVybmFsJywgJ3Jhd19wb2x5bm9taWFsX2V4dGVybmFsJywKKyAgICogJ3Jhd19saW5lYXJfY2FsaWJyYXRlZCcsIG9yICdyYXdfbGluZWFyX2NhbGlicmF0ZWRfZXh0ZXJuYWwnLCB0aGUKKyAgICogc2VydmVyIHdpbGwgcmV0dXJuIHRoZSByYXcgdmFsdWVzIG9mIHRoZSBsb2NhbCBjb2x1bW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQ09MVU1OCisgICAqICAgIEFPX0lOVkxBSURfQ09VTlQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2wgIFRoZSBjb2x1bW4gdG8gcmV0cmlldmUgdGhlIHZhbHVlcyBmcm9tLgorICAgKgorICAgKiBAcGFyYW0gIHN0YXJ0UG9pbnQgIFRoZSBzdGFydGluZyBwb2ludCBpbiB0aGUgY29sdW1uLgorICAgKgorICAgKiBAcGFyYW0gIGNvdW50ICBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byBiZSByZXRyaWV2ZWQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0ZWQgY29sdW1uIHZhbHVlcyBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIFRTX1ZhbHVlU2VxIGdldFZhbHVlVmVjdG9yKAorICAgICAgaW4gQ29sdW1uIGNvbCwKKyAgICAgIGluIFRfTE9ORyBzdGFydFBvaW50LAorICAgICAgaW4gVF9MT05HIGNvdW50KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMDcpCisgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgb2YgdGhlIHZhbHVlIG1hdHJpeCBubyBtYXR0ZXIgd2hldGhlcgorICAgKiB0aGUgY29sdW1uIGlzIGRlcGVuZGVudCBvciBpbmRlcGVuZGVudC4gVGhlIHBhdHRlcm4gaXMgY2FzZQorICAgKiBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgY29sdW1uCisgICAqICAgICAgICAgICAgICAgICAgICAgbmFtZXMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBjb2x1bW4gbmFtZXMgb2YgdGhlIHZhbHVlIG1hdHJpeCwgbm8gbWF0dGVyIHdoZXRoZXIgdGhlCisgICAqICAgICAgICAgIGNvbHVtbiBpcyBkZXBlbmRlbnQsIGluZGVwZW5kZW50IG9yIHNjYWxlZCBieSBhbm90aGVyIG9uZS4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdENvbHVtbnMoCisgICAgICBpbiBQYXR0ZXJuIGNvbFBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAwOCkKKyAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgaW5kZXBlbmRlbnQgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LiBUaGUKKyAgICogaW5kZXBlbmRlbnQgY29sdW1ucyBhcmUgdGhlIGNvbHVtbnMgdXNlZCB0byBidWlsZCB0aGUgdmFsdWUgbWF0cml4LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGNvbFBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlCisgICAqICAgICAgICAgICAgICAgICAgICAgaW5kZXBlbmRlbnQgY29sdW1uIG5hbWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgaW5kZXBlbmRlbnQgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBsaXN0SW5kZXBlbmRlbnRDb2x1bW5zKAorICAgICAgaW4gUGF0dGVybiBjb2xQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMDkpCisgICAqIFJlbW92ZSB0aGUgdmFsdWVzIG9mIHRoZSBjb2x1bW5zIGF0IGEgZ2l2ZW4gbWVhc3VyZW1lbnQgcG9pbnQuCisgICAqIFJlbW92ZSB0aGUgbnVtYmVyIG9mIHBvaW50cyBvZiB0aGUgZ2l2ZW4gY29sdW1uLiBJZiB0aGUgY291bnQgaXMgMAorICAgKiBhbGwgcG9pbnRzIHVudGlsIHRoZSBlbmQgb2YgdGhlIGNvbHVtbiBhcmUgcmVtb3ZlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9DT1VOVAorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2x1bW5OYW1lcyAgVGhlIGNvbHVtbnMgZnJvbSB3aGljaCB0aGUgbWVhc3VyZW1lbnQgcG9pbnRzCisgICAqICAgICAgICAgICAgICAgICAgICAgIGFyZSB0byBiZSByZW1vdmVkLgorICAgKgorICAgKiBAcGFyYW0gIG1lYVBvaW50ICBUaGUgbWVhc3VyZW1lbnQgcG9pbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICoKKyAgICogQHBhcmFtICBjb3VudCAgVGhlIG51bWJlciBvZiBwb2ludHMgdG8gYmUgcmVtb3ZlZCBmcm9tIGVhY2ggY29sdW1uLgorICAgKi8KKyAgIHZvaWQgcmVtb3ZlVmFsdWVNZWFQb2ludCgKKyAgICAgIGluIE5hbWVTZXF1ZW5jZSBjb2x1bW5OYW1lcywKKyAgICAgIGluIFRfTE9ORyBtZWFQb2ludCwKKyAgICAgIGluIFRfTE9ORyBjb3VudCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDEwKQorICAgKiBSZW1vdmUgdGhlIHZhbHVlcyBmcm9tIGEgdmFsdWUgdmVjdG9yLiBCZWdpbm5pbmcgYXQgc3RhcnRQb2ludCB0aGUKKyAgICogbnVtYmVyIG9mIHZhbHVlcyBzcGVjaWZpZWQgaW4gY291bnQgYXJlIHJlbW92ZWQuIElmIGNvdW50IGlzIDAgYWxsCisgICAqIHZhbHVlcyBmcm9tICB0aGUgc3RhcnRQb2ludCB1bnRpbCB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IgYXJlIHJlbW92ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQ09MVU1OCisgICAqICAgIEFPX0lOVkFMSURfQ09VTlQKKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sICBUaGUgY29sdW1uIGZyb20gd2hpY2ggdGhlIHZhbHVlcyBhcmUgdG8gYmUgcmVtb3ZlZC4KKyAgICoKKyAgICogQHBhcmFtICBzdGFydFBvaW50ICBUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSB2YWx1ZSByZW1vdmFsLgorICAgKgorICAgKiBAcGFyYW0gIGNvdW50ICBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNvbHVtbi4KKyAgICovCisgICB2b2lkIHJlbW92ZVZhbHVlVmVjdG9yKAorICAgICAgaW4gQ29sdW1uIGNvbCwKKyAgICAgIGluIFRfTE9ORyBzdGFydFBvaW50LAorICAgICAgaW4gVF9MT05HIGNvdW50KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTEpCisgICAqIENyZWF0ZSBvciBtb2RpZnkgYSBtZWFzdXJlbWVudCBwb2ludCBvZiBhIHZhbHVlIG1hdHJpeC4gCisgICAqIFRoZSBzZXF1ZW5jZSBvZiBuYW1lIHZhbHVlcyBzcGVjaWZpZXMgdGhlIG5hbWVzIG9mIHRoZSBjb2x1bW4gd2l0aAorICAgKiB0aGUgbmV3IHZhbHVlcy4gCisgICAqIFRoZSBtZWFuaW5nIG9mIHRoZSBwYXJhbWV0ZXIgc2V0VHlwZSBpczoKKyAgICogCisgICAqICAgIElOU0VSVCAgIEluc2VydCB0aGUgdmFsdWVzIGF0IG1lYVBvaW50LCB0aGUgY3VycmVudCB2YWx1ZXMgYXQKKyAgICogbWVhUG9pbnQgICAgYXJlIG1vdmVkIHRvIHRoZSBlbmQgb2YgIHRoZSBuZXcgaW5zZXJ0ZWQgdmFsdWVzLgorICAgKiAKKyAgICogICAgQVBQRU5EICAgVGhlIHZhbHVlIG9mIG1lYVBvaW50IGlzIGlnbm9yZWQsIHRoZSB2YWx1ZXMgYXJlCisgICAqIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdmFsdWVzLgorICAgKiAKKyAgICogICAgVVBEQVRFICAgVXBkYXRlIG9yIG1vZGlmeSB0aGUgdmFsdWVzIGF0IG1lYVBvaW50LCB0aGUgY3VycmVudAorICAgKiB2YWx1ZXMgYXJlIG92ZXJ3cml0dGVuLiBJZiBtZWFQb2ludCBpcyBiaWdnZXIgdGhhbiB0aGUgbnVtYmVyIG9mCisgICAqIHZhbHVlcyBpbiB0aGUgICAgICAgICAgdmVjdG9yLCB0aGUgbWVhc3VyZW1lbnQgcG9pbnQgaXMKKyAgICogYXV0b21hdGljYWxseSBhcHBlbmRlZC4KKyAgICogCisgICAqIFRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBoYXZlIHRvIGV4aXN0LgorICAgKiAKKyAgICogV2hlbiBhIGNsaWVudCBjcmVhdGVzIGEgVmFsdWVNYXRyaXggYmFzZWQgb24gQW9NZWFzdXJlbWVudCB0aGlzCisgICAqIG1ldGhvZHMgYmVoYXZlcyBhcyBmb2xsb3dzOgorICAgKiBUaGUgc2VydmVyIGNoZWNrcyB0aGUgc3ViIG1hdHJpY2VzIGFuZCBjcmVhdGVzIGFsbCBuZWNlc3NhcnkKKyAgICogaW5zdGFuY2VzIG9mIEFvU3VibWF0cml4LCBBb0xvY2FsQ29sdW1uIGFuZCBBb01lYXN1cmVtZW50UXVhbnRpdHkuIAorICAgKiBUaGUgdmFsdWVzIG9mIHRoZSBuYW1lIGF0dHJpYnV0ZSBvZiBBb1N1Ym1hdHJpeCBtdXN0IGJlIGdlbmVyYXRlZCBieQorICAgKiB0aGUgc2VydmVyLiBUaGUgdmFsdWUgd2lsbCBiZSBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBJRAorICAgKiAoY29udmVydGVkIHRvIERUX1NUUklORykuIE1pc3NpbmcgaW5zdGFuY2VzIG9mIEFvTWVhc3VyZW1lbnRRdWFudGl0eQorICAgKiB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHNlcnZlciwgdG9vLiAKKyAgICogCisgICAqIFRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyB3aWxsIGdldCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgdmFsdWVzOgorICAgKiBOYW1lIHN1cHBsaWVkIGJ5IGNsaWVudCAKKyAgICogRGF0YXR5cGUgY29waWVkIGZyb20gQW9RdWFudGl0eS5kZWZhdWx0X2RhdGF0eXBlCisgICAqIFR5cGVzaXplIGNvcGllZCBmcm9tIEFvUXVhbnRpdHkuZGVmYXVsdF90eXBlc2l6ZQorICAgKiBJbnRlcnBvbGF0aW9uIG5vIGludGVycG9sYXRpb24KKyAgICogUmFuayBjb3BpZWQgZnJvbSBBb1F1YW50aXR5LmRlZmF1bHRfcmFuaworICAgKiBEaW1lbnNpb24gY29waWVkIGZyb20gQW9RdWFudGl0eS5kZWZhdWx0X2RpbWVuc2lvbgorICAgKiAKKyAgICogVGhlIHNlcnZlciB0YWtlcyB0aGUgdmFsdWUgb2YgdGhlIGNoYW5uZWwgKHN1cHBsaWVkIGJ5IGNsaWVudCkgYW5kCisgICAqIGxvb2tzIHVwIHRoZSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIGluIEFvUXVhbnRpdHkgdXNpbmcgdGhlCisgICAqIGF0dHJpYnV0ZSBkZWZhdWx0X21lcV9uYW1lLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JU19NRUFTVVJFTUVOVF9NQVRSSVgKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFRoZSBzZXQgdHlwZS4KKyAgICoKKyAgICogQHBhcmFtICBtZWFQb2ludCAgVGhlIG1lYXN1cmVtZW50IHBvaW50LgorICAgKgorICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgdmFsdWVzIHRvIGJlIGluc2VydGVkLgorICAgKi8KKyAgIHZvaWQgc2V0VmFsdWVNZWFQb2ludCgKKyAgICAgIGluIFNldFR5cGUgc2V0LAorICAgICAgaW4gVF9MT05HIG1lYVBvaW50LAorICAgICAgaW4gTmFtZVZhbHVlU2VxdWVuY2UgdmFsdWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAxMikKKyAgICogQ3JlYXRlIG9yIG1vZGlmeSBhIHZhbHVlIHZlY3RvciBpbiBhIHZhbHVlIG1hdHJpeC4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgdmFsdWVzIG9mIHRoZSB2YWx1ZSBtYXRyaXggb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIGRhdGEgaXMgbWFkZSBwZXJtYW5lbnQgb24gdHJhbnNhY3Rpb24gY29tbWl0LiBVbnRpbCB0aGUKKyAgICogdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIG9yIHVudGlsIHRoZSBhY2Nlc3MgdG8gdGhlIG1lYXN1cmVtZW50CisgICAqIHBvaW50IG9mIHRoZSB2YWx1ZSBtYXRyaXgsIGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mCisgICAqIHZhbHVlcyBpbiB0aGUgZGlmZmVyZW50IHZhbHVlIHZlY3RvcnMuCisgICAqIAorICAgKiBUaGUgbWVhbmluZyBvZiB0aGUgcGFyYW1ldGVyIHNldFR5cGUgaXM6CisgICAqIAorICAgKiAgICBJTlNFUlQgICBJbnNlcnQgdGhlIHZhbHVlcyBmcm9tIHN0YXJ0UG9pbnQsIHRoZSBjdXJyZW50IGF2YWlsYWJsZQorICAgKiB2YWx1ZXMgZnJvbSBzdGFydFBvaW50IGFyZSBtb3ZlZCB0byB0aGUgZW5kIG9mIHRoZSBuZXcgaW5zZXJ0ZWQKKyAgICogdmFsdWVzLgorICAgKiAKKyAgICogICAgQVBQRU5EICAgVGhlIHZhbHVlIG9mIHN0YXJ0UG9pbnQgaXMgaWdub3JlZCwgIHRoZSB2YWx1ZXMgYXJlCisgICAqIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdmFsdWVzLgorICAgKiAKKyAgICogICAgVVBEQVRFICAgVXBkYXRlIG9yIG1vZGlmeSB0aGUgdmFsdWVzIGZyb20gc3RhcnRQb2ludCwgdGhlIGN1cnJlbnQKKyAgICogdmFsdWVzIGFyZSBvdmVyd3JpdHRlbi4gSWYgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIHBhcmFtZXRlcgorICAgKiB2YWx1ZXMgaXMgdG9vIGJpZyAgICB0aGUgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkLgorICAgKiAKKyAgICogV2hlbiBhIGNsaWVudCBjcmVhdGVzIGEgVmFsdWVNYXRyaXggYmFzZWQgb24gQW9NZWFzdXJlbWVudCB0aGlzCisgICAqIG1ldGhvZHMgCisgICAqIGJlaGF2ZXMgYXMgZm9sbG93czoKKyAgICogVGhlIHNlcnZlciBjaGVja3MgdGhlIHN1YiBtYXRyaWNlcyBhbmQgY3JlYXRlcyBhbGwgbmVjZXNzYXJ5CisgICAqIGluc3RhbmNlcyBvZiBBb1N1Ym1hdHJpeCwgQW9Mb2NhbENvbHVtbiBhbmQgQW9NZWFzdXJlbWVudFF1YW50aXR5LiAKKyAgICogVGhlIHZhbHVlcyBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgQW9TdWJtYXRyaXggbXVzdCBiZSBnZW5lcmF0ZWQgYnkKKyAgICogdGhlIHNlcnZlci4gVGhlIHZhbHVlIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgSUQKKyAgICogKGNvbnZlcnRlZCB0byBEVF9TVFJJTkcpLiBNaXNzaW5nIGluc3RhbmNlcyBvZiBBb01lYXN1cmVtZW50UXVhbnRpdHkKKyAgICogd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBzZXJ2ZXIsIAorICAgKiB0b28uIAorICAgKiAKKyAgICogVGhlIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIHdpbGwgZ2V0IHRoZSBmb2xsb3dpbmcgZGVmYXVsdCB2YWx1ZXM6CisgICAqIE5hbWUgc3VwcGxpZWQgYnkgY2xpZW50IAorICAgKiBEYXRhdHlwZSBjb3BpZWQgZnJvbSBBb1F1YW50aXR5LmRlZmF1bHRfZGF0YXR5cGUKKyAgICogVHlwZXNpemUgY29waWVkIGZyb20gQW9RdWFudGl0eS5kZWZhdWx0X3R5cGVzaXplCisgICAqIEludGVycG9sYXRpb24gbm8gaW50ZXJwb2xhdGlvbgorICAgKiBSYW5rIGNvcGllZCBmcm9tIEFvUXVhbnRpdHkuZGVmYXVsdF9yYW5rCisgICAqIERpbWVuc2lvbiBjb3BpZWQgZnJvbSBBb1F1YW50aXR5LmRlZmF1bHRfZGltZW5zaW9uCisgICAqIAorICAgKiBUaGUgc2VydmVyIHRha2VzIHRoZSB2YWx1ZSBvZiB0aGUgY2hhbm5lbCAoc3VwcGxpZWQgYnkgY2xpZW50KSBhbmQKKyAgICogbG9va3MgdXAgdGhlIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2UgaW4gQW9RdWFudGl0eSB1c2luZyB0aGUKKyAgICogYXR0cmlidXRlIGRlZmF1bHRfbWVxX25hbWUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQ09MVU1OCisgICAqICAgIEFPX0lOVkFMSURfU0VUX1RZUEUKKyAgICogICAgQU9fSVNfTUVBU1VSRU1FTlRfTUFUUklYCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sICBUaGUgY29sdW1uIHdob3NlIHZhbHVlcyBhcmUgdG8gYmUgc2V0LgorICAgKgorICAgKiBAcGFyYW0gIHNldCAgVGhlIHNldCB0eXBlLgorICAgKgorICAgKiBAcGFyYW0gIHN0YXJ0UG9pbnQgIFRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIG5ldyB2YWx1ZXMuCisgICAqCisgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQuCisgICAqLworICAgdm9pZCBzZXRWYWx1ZVZlY3RvcigKKyAgICAgIGluIENvbHVtbiBjb2wsCisgICAgICBpbiBTZXRUeXBlIHNldCwKKyAgICAgIGluIFRfTE9ORyBzdGFydFBvaW50LAorICAgICAgaW4gVFNfVmFsdWVTZXEgdmFsdWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAxMykKKyAgICogQ3JlYXRlIG9yIG1vZGlmeSBhIG51bWJlciBvZiB2YWx1ZSB2ZWN0b3JzIGluIGEgdmFsdWUgbWF0cml4LiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSB2YWx1ZXMgb2YgdGhlIHZhbHVlIG1hdHJpeCBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgZGF0YSBpcyBtYWRlIHBlcm1hbmVudCBvbiB0cmFuc2FjdGlvbiBjb21taXQuIFVudGlsIHRoZQorICAgKiB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgb3IgdW50aWwgdGhlIGFjY2VzcyB0byB0aGUgbWVhc3VyZW1lbnQKKyAgICogcG9pbnQgb2YgdGhlIHZhbHVlIG1hdHJpeCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgZGlmZmVyZW50IG51bWJlcnMgb2YKKyAgICogdmFsdWVzIGluIHRoZSBkaWZmZXJlbnQgdmFsdWUgdmVjdG9ycy4KKyAgICogCisgICAqIFRoZSBuYW1lcyBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zLiBUaGUKKyAgICogdmFsdWVzIGFyZSB0aGUgbmV3IHZhbHVlcyBvZiB0aGUgY29sdW1uLiAoc2V0VmFsdWVNZWFQb2ludCBhbGxvd3MKKyAgICogb25seSBvbmUgcG9pbnQsIHRoZSBUU19WYWx1ZVNlcSBhbGxvd3MgbW9yZSB0aGVuIG9uZSBwb2ludCkgVGhlcmUgaXMKKyAgICogYSBzZXF1ZW5jZSBvZiBuYW1lIHZhbHVlIHBhaXJzIChzZXRWYWx1ZVZlY3RvciBhbGxvd3Mgb25seSBvbmUKKyAgICogY29sdW1uKSwgc28gYSBibG9jayBvZiB2YWx1ZXMgY2FuIGJlIG1vZGlmaWVkLgorICAgKiAKKyAgICogVGhlIG1lYW5pbmcgb2YgdGhlIHBhcmFtZXRlciBzZXRUeXBlIGlzOgorICAgKiAKKyAgICogICAgSU5TRVJUICAgSW5zZXJ0IHRoZSB2YWx1ZXMgZnJvbSBzdGFydFBvaW50LCAgdGhlIGN1cnJlbnQKKyAgICogYXZhaWxhYmxlIHZhbHVlcyBmcm9tICBzdGFydFBvaW50IGFyZSBtb3ZlZCB0byB0aGUgZW5kIG9mICB0aGUgbmV3CisgICAqIGluc2VydGVkIHZhbHVlcy4KKyAgICogCisgICAqICAgIEFQUEVORCAgIFRoZSB2YWx1ZSBvZiBzdGFydFBvaW50IGlzIGlnbm9yZWQsIHRoZSB2YWx1ZXMgYXJlCisgICAqIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdmFsdWVzLgorICAgKiAKKyAgICogICAgVVBEQVRFICAgVXBkYXRlIG9yIG1vZGlmeSB0aGUgdmFsdWVzIGZyb20gc3RhcnRQb2ludCwgdGhlIGN1cnJlbnQKKyAgICogdmFsdWVzIGFyZSBvdmVyd3JpdHRlbi4gSWYgdGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgKiBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSAgdmVjdG9yLCB0aGUgbWVhc3VyZW1lbnQgcG9pbnQgaXMgCisgICAqIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQuCisgICAqIAorICAgKiAgICBSRU1PVkUgIFJlbW92ZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyBmcm9tIGVhY2ggY29sdW1uLCBzdGFydGluZworICAgKiB3aXRoIHN0YXJ0UG9pbnQuIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gaXMgZ2l2ZW4gYXMgdGhlIG5hbWUgb2YgdGhlCisgICAqIE5hbWVWYWx1ZXNlcVVuaXQsIHRoZSAgbnVtYmVyIG9mIHZhbHVlcyB0byByZW1vdmUgaXMgZ2l2ZW4gIGluIHRoZQorICAgKiBudW1iZXIgb2YgdGhlIHZhbHVlcyBpbiB0aGUgICB2YWx1ZS4KKyAgICogCisgICAqIFdoZW4gYSBjbGllbnQgY3JlYXRlcyBhIFZhbHVlTWF0cml4IGJhc2VkIG9uIEFvTWVhc3VyZW1lbnQgdGhpcworICAgKiBtZXRob2RzIGJlaGF2ZXMgYXMgZm9sbG93czoKKyAgICogVGhlIHNlcnZlciBjaGVja3MgdGhlIHN1YiBtYXRyaWNlcyBhbmQgY3JlYXRlcyBhbGwgbmVjZXNzYXJ5CisgICAqIGluc3RhbmNlcyBvZiBBb1N1Ym1hdHJpeCwgQW9Mb2NhbENvbHVtbiBhbmQgQW9NZWFzdXJlbWVudFF1YW50aXR5LiAKKyAgICogVGhlIHZhbHVlcyBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgQW9TdWJtYXRyaXggbXVzdCBiZSBnZW5lcmF0ZWQgYnkKKyAgICogdGhlIHNlcnZlci4gVGhlIHZhbHVlIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgSUQKKyAgICogKGNvbnZlcnRlZCB0byBEVF9TVFJJTkcpLiBNaXNzaW5nIGluc3RhbmNlcyBvZiBBb01lYXN1cmVtZW50UXVhbnRpdHkKKyAgICogd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBzZXJ2ZXIsIHRvby4gCisgICAqIAorICAgKiBUaGUgbWFuZGF0b3J5IGF0dHJpYnV0ZXMgd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBkZWZhdWx0IHZhbHVlczoKKyAgICogTmFtZSBzdXBwbGllZCBieSBjbGllbnQgCisgICAqIERhdGF0eXBlIGNvcGllZCBmcm9tIEFvUXVhbnRpdHkuZGVmYXVsdF9kYXRhdHlwZQorICAgKiBUeXBlc2l6ZSBjb3BpZWQgZnJvbSBBb1F1YW50aXR5LmRlZmF1bHRfdHlwZXNpemUKKyAgICogSW50ZXJwb2xhdGlvbiBubyBpbnRlcnBvbGF0aW9uCisgICAqIFJhbmsgY29waWVkIGZyb20gQW9RdWFudGl0eS5kZWZhdWx0X3JhbmsKKyAgICogRGltZW5zaW9uIGNvcGllZCBmcm9tIEFvUXVhbnRpdHkuZGVmYXVsdF9kaW1lbnNpb24KKyAgICogCisgICAqIFRoZSBzZXJ2ZXIgdGFrZXMgdGhlIHZhbHVlIG9mIHRoZSBjaGFubmVsIChzdXBwbGllZCBieSBjbGllbnQpIGFuZAorICAgKiBsb29rcyB1cCB0aGUgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBpbiBBb1F1YW50aXR5IHVzaW5nIHRoZQorICAgKiBhdHRyaWJ1dGUgZGVmYXVsdF9tZXFfbmFtZS4KKyAgICogCisgICAqIFRoZSBWYWx1ZU1hdHJpeCBpbnRlcmZhY2UgaGFuZGxlcyB0aGUgdmFsdWVzIGJ1dCBub3QgdGhlIHJhdyB2YWx1ZXMsCisgICAqIHRvIG1vZGlmeSB0aGUgcmF3IHZhbHVlcyB0aGUgaW5zdGFuY2VzIG9mIGxvY2FsY29sdW1uIG11c3QgYmUKKyAgICogY3JlYXRlZCwgdGhlIGJhc2UgYXR0cmlidXRlIHNlcXVlbmNlX3JlcHJlc2VudGF0aW9uLCByYXdfZGF0YXR5cGUKKyAgICogYW5kIHRoZSBnZW5lcmF0aW9uX3BhcmFtZXRlciBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSB2YWx1ZXMgYXJlCisgICAqIG1vZGlmaWVkLiBUaGUgdmFsdWVzIG11c3QgaGF2ZSB0aGUgZGF0YSB0eXBlIGlkZW50aWNhbCB3aXRoIHRoZQorICAgKiByYXdfZGF0YXR5cGUsIGFueSBvdGhlciBkYXRhIHR5cGUgd2lsbCBjYXVzZSBhbiBBT19JTlZBTElEX0RBVEFUWVBFCisgICAqIGV4Y2VwdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9DT0xVTU4KKyAgICogICAgQU9fSU5WQUxJRF9TRVRfVFlQRQorICAgKiAgICBBT19JTlZBTElEX0RBVEFUWVBFCisgICAqICAgIEFPX0lTX01FQVNVUkVNRU5UX01BVFJJWAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHNldCAgVGhlIHNldCB0eXBlLgorICAgKgorICAgKiBAcGFyYW0gIHN0YXJ0UG9pbnQgIFRoZSBtZWFzdXJlbWVudCBwb2ludC4KKyAgICoKKyAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlcyB0byBiZSBpbnNlcnRlZC4KKyAgICovCisgICB2b2lkIHNldFZhbHVlKAorICAgICAgaW4gU2V0VHlwZSBzZXQsCisgICAgICBpbiBUX0xPTkcgc3RhcnRQb2ludCwKKyAgICAgIGluIE5hbWVWYWx1ZVNlcVVuaXRTZXF1ZW5jZSB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDE0KQorICAgKiBBZGQgYSBjb2x1bW4gdG8gdGhlIHZhbHVlIG1hdHJpeC4gSXQgaXMgb25seSBhbGxvd2VkIHRvIGNyZWF0ZSBhCisgICAqIHZhbHVlIHZlY3RvciBpZiB0aGUgdmFsdWUgbWF0cml4IGlzIGNyZWF0ZWQgZnJvbSBhIHN1Ym1hdHJpeC4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIGFkZCBhIGNvbHVtbiBvdXRzaWRlIGEgdHJhbnNhY3Rpb24gYnV0IGl0IGlzCisgICAqIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgZGF0YSBpcyBtYWRlIHBlcm1hbmVudCBvbiB0cmFuc2FjdGlvbiBjb21taXQuIFVudGlsIHRoZQorICAgKiB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgb3IgdW50aWwgdGhlIGFjY2VzcyB0byB0aGUgbWVhc3VyZW1lbnQKKyAgICogcG9pbnQgb2YgdGhlIHZhbHVlIG1hdHJpeCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZgorICAgKiB2YWx1ZXMgaW4gdGhlIGRpZmZlcmVudCB2YWx1ZSB2ZWN0b3JzLiBBZnRlciB0aGUgbmV3IGNvbHVtbiBpcworICAgKiBhZGRlZCwgaXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGNvbHVtbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9OQU1FCisgICAqICAgIEFPX0lOVkFMSURfU0VUX1RZUEUKKyAgICogICAgQU9fSVNfTUVBU1VSRU1FTlRfTUFUUklYCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBuZXdDb2x1bW4gIFRoZSBuYW1lIGFuZCB1bml0IG9mIHRoZSBjb2x1bW4gdG8gYWRkLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGNvbHVtbi4KKyAgICovCisgICBDb2x1bW4gYWRkQ29sdW1uKAorICAgICAgaW4gTmFtZVVuaXQgbmV3Q29sdW1uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTUpCisgICAqIERlcHJlY2F0ZWQsIHNvbHZlZCBieSBOVkggQXBwbGljYXRpb24gbW9kZWwuCisgICAqIAorICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBzY2FsaW5nIGNvbHVtbnMgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2xQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSBzY2FsaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgY29sdW1uIG5hbWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgc2NhbGluZyBjb2x1bW5zIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RTY2FsaW5nQ29sdW1ucygKKyAgICAgIGluIFBhdHRlcm4gY29sUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDE2KQorICAgKiBEZXByZWNhdGVkLCBzb2x2ZWQgYnkgTlZIIEFwcGxpY2F0aW9uIG1vZGVsLgorICAgKiAKKyAgICogR2V0IHRoZSBzY2FsaW5nIGNvbHVtbiBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGNvbFBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHNjYWxpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICBjb2x1bW4gbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHNjYWxpbmcgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldFNjYWxpbmdDb2x1bW5zKAorICAgICAgaW4gUGF0dGVybiBjb2xQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTcpCisgICAqIERlcHJlY2F0ZWQsIHNvbHZlZCBieSBOVkggQXBwbGljYXRpb24gbW9kZWwuCisgICAqIAorICAgKiBMaXN0IHRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucywgd2hpY2ggYXJlIHNjYWxlZCBieSB0aGUgZ2l2ZW4gY29sdW1uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19OT19TQ0FMSU5HX0NPTFVNTgorICAgKgorICAgKiBAcGFyYW0gIHNjYWxpbmdDb2x1bW4gIFRoZSBzY2FsaW5nIGNvbHVtbi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zIHdoaWNoIGFyZSBzY2FsZWQgYnkgdGhlIGdpdmVuCisgICAqICAgICAgICAgIGlucHV0IGNvbHVtbi4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdENvbHVtbnNTY2FsZWRCeSgKKyAgICAgIGluIENvbHVtbiBzY2FsaW5nQ29sdW1uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTgpCisgICAqIERlcHJlY2F0ZWQsIHNvbHZlZCBieSBOVkggQXBwbGljYXRpb24gbW9kZWwuCisgICAqIAorICAgKiBHZXQgdGhlIGNvbHVtbnMgd2hpY2ggYXJlIHNjYWxlZCBieSB0aGUgZ2l2ZW4gY29sdW1uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19OT19TQ0FMSU5HX0NPTFVNTgorICAgKgorICAgKiBAcGFyYW0gIHNjYWxpbmdDb2x1bW4gIFRoZSBzY2FsaW5nIGNvbHVtbi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGNvbHVtbnMgd2hpY2ggYXJlIHNjYWxlZCBieSB0aGUgZ2l2ZW4gaW5wdXQgY29sdW1uLgorICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldENvbHVtbnNTY2FsZWRCeSgKKyAgICAgIGluIENvbHVtbiBzY2FsaW5nQ29sdW1uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTkpCisgICAqIERlcHJlY2F0ZWQsIHNvbHZlZCBieSBOVkggQXBwbGljYXRpb24gbW9kZWwuCisgICAqIAorICAgKiBBZGQgYSBjb2x1bW4gdG8gdGhlIHZhbHVlIG1hdHJpeC4gSXQgaXMgb25seSBhbGxvd2VkIHRvIGNyZWF0ZSBhCisgICAqIHZhbHVlIHZlY3RvciBpZiB0aGUgdmFsdWUgbWF0cml4IGlzIGNyZWF0ZWQgZnJvbSBhIHN1Ym1hdHJpeC4gVGhlCisgICAqIGNvbHVtbiB3aWxsIGJlIHNjYWxlZCBieSB0aGUgZ2l2ZW4gc2NhbGluZyBjb2x1bW4uCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIGFkZCBhIGNvbHVtbiBvdXRzaWRlIGEgdHJhbnNhY3Rpb24gYnV0IGl0IGlzCisgICAqIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgZGF0YSBpcyBtYWRlIHBlcm1hbmVudCBvbiB0cmFuc2FjdGlvbiBjb21taXQuIFVudGlsIHRoZQorICAgKiB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgb3IgdW50aWwgdGhlIGFjY2VzcyB0byB0aGUgbWVhc3VyZW1lbnQKKyAgICogcG9pbnQgb2YgdGhlIHZhbHVlIG1hdHJpeCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZgorICAgKiB2YWx1ZXMgaW4gdGhlIGRpZmZlcmVudCB2YWx1ZSB2ZWN0b3JzLiBBZnRlciB0aGUgbmV3IGNvbHVtbiBpcworICAgKiBhZGRlZCwgaXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGNvbHVtbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9OQU1FCisgICAqICAgIEFPX0lOVkFMSURfU0VUX1RZUEUKKyAgICogICAgQU9fSVNfTUVBU1VSRU1FTlRfTUFUUklYCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX05PX1NDQUxJTkdfQ09MVU1OCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBuZXdDb2x1bW4gIFRoZSBuYW1lIGFuZCB1bml0IG9mIHRoZSBjb2x1bW4gdG8gYWRkLgorICAgKgorICAgKiBAcGFyYW0gIHNjYWxpbmdDb2x1bW4gIFRoZSBzY2FsaW5nIGNvbHVtbi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5ldyBjb2x1bW4uCisgICAqLworICAgQ29sdW1uIGFkZENvbHVtblNjYWxlZEJ5KAorICAgICAgaW4gTmFtZVVuaXQgbmV3Q29sdW1uLAorICAgICAgaW4gQ29sdW1uIHNjYWxpbmdDb2x1bW4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAyMCkKKyAgICogRGVzdHJveSB0aGUgb2JqZWN0IG9uIHRoZSBzZXJ2ZXIuIFRoZSBkZXN0cnVjdG9yIG9mIHRoZSBjbGllbnQsIHNvCisgICAqIHRoZSBzZXJ2ZXIga25vd3MgdGhpcyBvYmplY3QgaXMgbm90IHVzZWQgYW55bW9yZSBieSB0aGUgY2xpZW50LgorICAgKiBBY2Nlc3MgdG8gdGhpcyBvYmplY3QgYWZ0ZXIgdGhlIGRlc3Ryb3kgbWV0aG9kIHdpbGwgbGVhZCB0byBhbgorICAgKiBleGNlcHRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIGRlc3Ryb3koKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMjEpCisgICAqIEdldCB0aGUgdmFsdWVzIG9mIGRpZmZlcmVudCBjb2x1bW5zIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqIAorICAgKiBUaGUgc2VydmVyIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICogVmFsdWUgbWF0cml4IG1vZGUgJ0NBTENVTEFURUQnOgorICAgKiBJbiBjYXNlICdzZXF1ZW5jZV9yZXByZXNlbnRhdGlvbicgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWwgY29sdW1uCisgICAqIGlzIG9uZSBvZiB0aGUgZW50cmllcyAncmF3X2xpbmVhcicsIHJhd19wb2x5bm9taWFsJywKKyAgICogJ3Jhd19saW5lYXJfZXh0ZXJuYWwnLCAncmF3X3BvbHlub21pYWxfZXh0ZXJuYWwnLAorICAgKiAncmF3X2xpbmVhcl9jYWxpYnJhdGVkJywgb3IgJ3Jhd19saW5lYXJfY2FsaWJyYXRlZF9leHRlcm5hbCcsIHRoZQorICAgKiBzZXJ2ZXIgd2lsbCBmaXJzdCBjYWxjdWxhdGUgdGhlIHBoeXNpY2FsIHZhbHVlcyBmcm9tIHJhdyB2YWx1ZXMgYW5kCisgICAqIGdlbmVyYXRpb24gcGFyYW1ldGVycywgYmVmb3JlIGl0IHJldHVybnMgdGhlbSB0byB0aGUgcmVxdWVzdGluZworICAgKiBjbGllbnQuCisgICAqIFZhbHVlIG1hdHJpeCBtb2RlICdTVE9SQUdFJzoKKyAgICogSW4gY2FzZSAnc2VxdWVuY2VfcmVwcmVzZW50YXRpb24nIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGNvbHVtbgorICAgKiBpcyBvbmUgb2YgdGhlIGVudHJpZXMgJ3Jhd19saW5lYXInLCByYXdfcG9seW5vbWlhbCcsCisgICAqICdyYXdfbGluZWFyX2V4dGVybmFsJywgJ3Jhd19wb2x5bm9taWFsX2V4dGVybmFsJywKKyAgICogJ3Jhd19saW5lYXJfY2FsaWJyYXRlZCcsIG9yICdyYXdfbGluZWFyX2NhbGlicmF0ZWRfZXh0ZXJuYWwnLCB0aGUKKyAgICogc2VydmVyIHdpbGwgcmV0dXJuIHRoZSByYXcgdmFsdWVzIG9mIHRoZSBsb2NhbCBjb2x1bW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sdW1ucyAgVGhlIHJlcXVlc3RlZCBjb2x1bW5zLgorICAgKgorICAgKiBAcGFyYW0gIHN0YXJ0UG9pbnQgIFRoZSBzdGFydGluZyBwb2ludCBpbiB0aGUgY29sdW1uLgorICAgKgorICAgKiBAcGFyYW0gIGNvdW50ICBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byBiZSByZXRyaWV2ZWQuIDAgbWVhbiB1bnRpbAorICAgKiAgICAgICAgICAgICAgICBlbmQgb2YgY29sdW1uLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdmFsdWVzIG9mIHRoZSBkaWZmZXJlbnQgY29sdW1ucy4gVGhlIG5hbWUgb2YgdGhlIHJldHVybgorICAgKiAgICAgICAgICBzdHJ1Y3R1cmUgY29ycmVzcG9uZHMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29sdW1uLiBUaGUgdW5pdAorICAgKiAgICAgICAgICBjb3JyZXNwb25kcyB3aXRoIHRoZSB1bml0IG9mIHRoZSBjb2x1bW4uIFRoZSBvcmRlciBvZiB0aGUKKyAgICogICAgICAgICAgcmVzdWx0cyBtaWdodCBub3QgbWF0Y2ggdGhlIG9yZGVyIGluIHRoZSByZXF1ZXN0ZWQKKyAgICogICAgICAgICAgc2VxdWVuY2UuCisgICAqLworICAgTmFtZVZhbHVlU2VxVW5pdFNlcXVlbmNlIGdldFZhbHVlKAorICAgICAgaW4gQ29sdW1uU2VxdWVuY2UgY29sdW1ucywKKyAgICAgIGluIFRfTE9ORyBzdGFydFBvaW50LAorICAgICAgaW4gVF9MT05HIGNvdW50KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMjIpCisgICAqIEdldCB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbW9kZSBvZiB0aGUgdmFsdWUgbWF0cml4CisgICAqLworICAgVmFsdWVNYXRyaXhNb2RlIGdldE1vZGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBWYWx1ZU1hdHJpeC4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlLXVuaXRJZCBpdGVyYXRvciBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIGlzCisqIGlkZW50aWNhbCB3aXRoIHRoZSBOYW1lVmFsdWVVbml0SXRlcmF0b3IsIGV4Y2VwdCB0aGUgdW5pdCBpcyBnaXZlbiBhcworKiBhbiBJZCBpbnNlYWQgb2YgYSBzdHJpbmcuCisqLworaW50ZXJmYWNlIE5hbWVWYWx1ZVVuaXRJZEl0ZXJhdG9yIHsKKworICAgLyoqICgyMzAwMSkKKyAgICogRGVzdHJveSB0aGUgaXRlcmF0b3IgYW5kIGZyZWUgdGhlIGFzc29jaWF0ZWQgbWVtb3J5LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIGRlc3Ryb3koKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjMwMDIpCisgICAqIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjY2Vzc2libGUgYnkgdGhlIGl0ZXJhdG9yLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICovCisgICBUX0xPTkcgZ2V0Q291bnQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjMwMDMpCisgICAqIEdldCB0aGUgbmV4dCBuIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGhvd19tYW55ICBUaGUgbnVtYmVyIG9mIHJlcXVlc3RlZCBlbGVtZW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbiBuYW1lLXZhbHVlLXVuaXQgdHVwbGVzIGZyb20gdGhlIG5hbWUtdmFsdWUtdW5pdAorICAgKiAgICAgICAgICB0dXBsZSBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lVmFsdWVTZXFVbml0SWQgbmV4dE4oCisgICAgICBpbiBUX0xPTkcgaG93X21hbnkpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMzAwNCkKKyAgICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBuYW1lLXZhbHVlLXVuaXRJZCB0dXBsZSBmcm9tIHRoZSBuYW1lLXZhbHVlLXVuaXRJZAorICAgKiAgICAgICAgICB0dXBsZSBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lVmFsdWVVbml0SWQgbmV4dE9uZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMzAwNSkKKyAgICogUmVzZXQgdGhlIHBvaW50ZXIgaW4gdGhlIGVsZW1lbnQgc2VxdWVuY2UgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgcmVzZXQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBOYW1lVmFsdWVVbml0SWRJdGVyYXRvci4KKworLyoqCisqIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGFjY2Vzcy4gIFRoZSBBcHBsRWxlbUFjY2VzcyBpbnRlcmZhY2UgKFJQQyBBUEkKKyogR2V0VmFsLCBQdXRWYWwsIEdldEluc3RSZWYsIC4uLikgaXMgcmVzcG9uc2libGUgdG8gcmV0cmlldmUgaW5zdGFuY2VzCisqIG9mIGFwcGxpY2F0aW9uIGVsZW1lbnRzLiBDdXJyZW50bHkgYXZhaWxhYmxlIHF1ZXJ5IG1ldGhvZHMgYXJlOgorKiAtIHF1ZXJ5IHdpdGggYXR0cmlidXRlIGFuZCB2YWx1ZQorKiAtIHF1ZXJ5IHdpdGggYXR0cmlidXRlIGFuZCB2YWx1ZXMgKG5vdClpbiBzZXQKKyogLSBzb3J0ZWQgcmVzdWx0cworKiAtIGdyb3VwZWQgcmVzdWx0cyBpbmNsdWRpbmcgaGF2aW5nIGNvbmRpdGlvbgorKi8KK2ludGVyZmFjZSBBcHBsRWxlbUFjY2VzcyB7CisKKyAgIC8qKiAoMjQwMDEpCisgICAqIFBlcmZvcm0gdGhlIFF1ZXJ5LgorICAgKiAKKyAgICogVGhlIG51bWJlciBvZiBkaWZmZXJlbnQgYXBwbGljYXRpb24gZWxlbWVudHMgd2hpY2ggYXJlIHJlcXVlc3RlZCBhcmUKKyAgICogZXhhY3RseSBkZWZpbmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBxdWVyeSBnaXZlbiBpbiB0aGUgZmllbGQKKyAgICogYW51U2VxIG9mIHRoZSBRdWVyeVN0cnVjdHVyZS4gVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGZvciBlYWNoCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgYWxzbyBnaXZlbiBpbiB0aGUgZGVmaW5pdGlvbi4gVGhlIG51bWJlciBvZgorICAgKiBtYXRjaGluZyBpbnN0YW5jZXMgKHRoZWlyIGF0dHJpYnV0ZXMpIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBxdWVyeQorICAgKiBhbmQgY2FuIGJlIGEgbGFyZ2UgYW1vdW50LiBUaGVyZWZvcmUgb25seSBvbmUgaXRlcmF0b3IgZm9yIHRoZQorICAgKiBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBkZWZpbmVkLgorICAgKiAKKyAgICogVGhlIHZhbHVlcyBvZiB0aGUgbG9jYWxjb2x1bW4gaW5zdGFuY2VzIGlzIHBhcnQgb2YgdGhlIHJlc3VsdHNldAorICAgKiB3aGVuIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWEgYWxsIGZpdDoKKyAgICogCisgICAqIC0gT25seSB3aGVuIHRoZSBhdHRyaWJ1dGVzIGlkLCBnZW5lcmF0aW9uX3BhcmFtZXRlcnMsIHZhbHVlcywgZmxhZ3MKKyAgICogYXJlIHJlcXVlc3RlZCwgYXMgc29vbiBhcyBhbnkgb3RoZXIgYXR0cmlidXRlcyBpcyByZXF1ZXN0ZWQgdGhlCisgICAqIHZhbHVlcyBhcmUgbm90IHJlcG9ydGVkLgorICAgKiAtIFRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsY29sdW1uIG11c3QgYWxsIGJlbG9uZyB0byBleGFjdGx5IG9uZQorICAgKiBpbnN0YW5jZXMgb2YgQW9NZWFzdXJlbWVudAorICAgKiAtIFRoZSBzZXJ2ZXIgaGF2ZSBhIGxpbWl0YXRpb24gb2YgdGhlIG1lbW9yeSwgbm90IHRoZSBzeXN0ZW0gbWVtb3J5CisgICAqIGxpbWl0YXRpb24sIGFzIHNvb24gYXMgdGhlIHJlc3VsdCBzZXQgd2lsbCBicmVhayB0aGUgbGltaXRhdGlvbiBhbgorICAgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAqIAorICAgKiAtIE5vIGl0ZXJhdG9yIGZvciB0aGUgcmVzdCBpcyByZXF1aXJlZC4KKyAgICogCisgICAqIEluIGNhc2UgYW4gYXR0cmlidXRlIG9mIGJsb2IgdHlwZSBpcyBhbW9uZyB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMsCisgICAqIHRoZSBjb250ZW50IG9mIHRoZSByZXR1cm4gc3RydWN0dXJlIHdpbGwgZGVwZW5kIG9uIHRoZSBudW1iZXIgb2YKKyAgICogaW5zdGFuY2VzIHRoYXQgYXJlIHJldHVybmVkOgorICAgKiAtIEluIGNhc2UgYXR0cmlidXRlcyBvZiBvbmx5IG9uZSBpbnN0YW5jZSBhcmUgcmV0dXJuZWQgKGVpdGhlcgorICAgKiBiZWNhdXNlICdob3dfbWFueScgd2FzIHNldCB0byAxIG9yIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlCisgICAqIGF2YWlsYWJsZSBhdCB0aGUgc2VydmVyKSwgdGhlIHJldHVybiBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGJsb2IKKyAgICogaXRzZWxmLgorICAgKiAtSW4gY2FzZSBhdHRyaWJ1dGVzIG9mIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgYXJlIHJldHVybmVkLCB0aGUKKyAgICogcmV0dXJuIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIHRoZSBibG9iczsgaW5zdGVhZCBpdCBjb250YWlucyB0aGUKKyAgICogaGVhZGVycyBvZiB0aGUgcmVzcGVjdGl2ZSBibG9icy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhb3EgIFRoZSBxdWVyeSBkZWZpbml0aW9uLgorICAgKgorICAgKiBAcGFyYW0gIGhvd19tYW55ICBNYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMgaW4gZWFjaCByZXN1bHQgc2V0LiBWYWxpZAorICAgKiAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYXJlOiAKKyAgICogICAgICAgICAgICAgICAgICAgaG93X21hbnkgPSAwIDogcmVwb3J0IGFsbCBmb3VuZCB2YWx1ZXMsCisgICAqICAgICAgICAgICAgICAgICAgIGhvd19tYW55ID4gMCA6IHJlcG9ydCBhIG1heGltdW0gbnVtYmVyIG9mIHZhbHVlcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlc3VsdCBzZXQgd2l0aCB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSB2YWx1ZXMuCisgICAqLworICAgRWxlbVJlc3VsdFNldFNlcXVlbmNlIGdldEluc3RhbmNlcygKKyAgICAgIGluIFF1ZXJ5U3RydWN0dXJlIGFvcSwKKyAgICAgIGluIFRfTE9ORyBob3dfbWFueSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDAyKQorICAgKiBHZXQgcmVsYXRlZCBpbnN0YW5jZXMgKElkKS4gVGhpcyBtZXRob2QgcmV0dXJucyBhIHNlcXVlbmNlIG9mCisgICAqIHJlbGF0ZWQgaW5zdGFuY2VzLiAKKyAgICogCisgICAqIFRoZSByZWxhdGlvbiBuYW1lIHNwZWNpZmllcyB0aGUgcmVsYXRpb24gZ2l2ZW4gaW4gdGhlCisgICAqIEFwcGxTdHJ1Y3RWYWx1ZS4gVGhlIGFpZCBvZiB0aGUgRWxlbUlkIGFuZCB0aGUgcmVsTmFtZSBkZWZpbmVzIHRoZQorICAgKiB1bmlxdWUgcmVsYXRpb24gYW5kIHRoZSB0YXJnZXQgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBlbGVtICBPcmlnaW5hbCBpbnN0YW5jZS4gCisgICAqICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgQXQgdGhlIFJQQyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZQorICAgKiAgICAgICAgICAgICAgIGZpZWxkIGVsZW1JZCBvZiB0aGUgc3RydWN0dXJlIEdldEluc3RSZWZSZXEgYW5kIHRoZQorICAgKiAgICAgICAgICAgICAgIHJlcXVlc3QgQU9QX0dldEluc3RSZWYuCisgICAqCisgICAqIEBwYXJhbSAgcmVsTmFtZSAgVGhlIHJlbGF0aW9uIG5hbWUuIAorICAgKiAgICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgICAgICBmaWVsZCByZWZOYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgR2V0SW5zdFJlZlJlcSAgIGFuZAorICAgKiAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0IEFPUF9HZXRJbnN0UmVmLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbGlzdCBvZiB0aGUgSWQgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLgorICAgKi8KKyAgIFNfTE9OR0xPTkcgZ2V0UmVsSW5zdCgKKyAgICAgIGluIEVsZW1JZCBlbGVtLAorICAgICAgaW4gTmFtZSByZWxOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMDMpCisgICAqIFNldCB0aGUgaW5zdGFuY2UgcmVmZXJlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGVsZW0gIFRoZSBpbnN0YW5jZSB0byBhZGQgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLgorICAgKiAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgICBmaWVsZCBlbGVtSWQxIG9mIHRoZSBzdHJ1Y3R1cmUgU2V0SW5zdFJlZlJlcSAgYW5kIHRoZQorICAgKiAgICAgICAgICAgICAgIHJlcXVlc3QgQU9QX1NldEluc3RSZWYuCisgICAqCisgICAqIEBwYXJhbSAgcmVsTmFtZSAgVGhlIG5hbWUgb2YgcmVsYXRpb24uIAorICAgKiAgICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgICAgICBmaWVsZCByZWZOYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgU2V0SW5zdFJlZlJlcSBhbmQKKyAgICogICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdCBBT1BfU2V0SW5zdFJlZi4KKyAgICoKKyAgICogQHBhcmFtICBpbnN0SWRzICBTZXF1ZW5jZSBvZiBpbnN0YW5jZSBpZCdzLiAKKyAgICogICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAgICBBdCB0aGUgUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4gdGhlCisgICAqICAgICAgICAgICAgICAgICAgZmllbGQgZWxlbUlkMiBvZiB0aGUgc3RydWN0dXJlIFNldEluc3RSZWZSZXEgYW5kCisgICAqICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3QgQU9QX1NldEluc3RSZWYuIEl0IHdhcyBub3QgcG9zc2libGUgdG8KKyAgICogICAgICAgICAgICAgICAgICBzZXQgbW9yZSB0aGVuIG9uZSByZWxhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICB0eXBlICBUaGUgdHlwZSBvZiB0aGUgbW9kaWZpY2F0aW9uLCBpbnNlcnQsIHVwZGF0ZSBvcgorICAgKiAgICAgICAgICAgICAgIHJlbW92ZS4gCisgICAqICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgQXQgdGhlIFJQQyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZQorICAgKiAgICAgICAgICAgICAgIGZpZWxkIG9uIG9mZiBvZiB0aGUgc3RydWN0dXJlIFNldEluc3RSZWZSZXEgYW5kIHRoZQorICAgKiAgICAgICAgICAgICAgIHJlcXVlc3QgQU9QX1NldEluc3RSZWYuCisgICAqLworICAgdm9pZCBzZXRSZWxJbnN0KAorICAgICAgaW4gRWxlbUlkIGVsZW0sCisgICAgICBpbiBOYW1lIHJlbE5hbWUsCisgICAgICBpbiBTX0xPTkdMT05HIGluc3RJZHMsCisgICAgICBpbiBTZXRUeXBlIHR5cGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwNCkKKyAgICogQ3JlYXRlIGluc3RhbmNlIGVsZW1lbnRzIG9mIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuIAorICAgKiBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyBzcGVjaWZpZWQgYnkgdGhlIEFJRCBvZiBpbnB1dCBzdHJ1Y3R1cmUuCisgICAqIAorICAgKiBUaGUgYXR0cmlidXRlIG5hbWVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0CisgICAqIHN0cnVjdHVyZS4KKyAgICogVGhlIHZhbHVlcyBvZiBvbmUgaW5zdGFuY2UgZWxlbWVudCBhcmUgc3BlY2lmaWVkIGluIHRoZSB2YWx1ZXNlcSBvZgorICAgKiB0aGUgaW5wdXQgc3RydWN0dXJlLgorICAgKiBZb3UgY2FuIGNyZWF0ZSBzZXZlcmFsIGluc3RhbmNlIGVsZW1lbnRzIGluIG9uZSBjYWxsIGJ5IGZpbGxpbmcgdGhlCisgICAqIHZhbHVlc2VxIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUuCisgICAqIFRoZSBzYW1lIGluZGV4IGluIHRoZSB2YWx1ZXNlcSBjb3JyZXNwb25kcyB0byB0aGUgYXR0cmlidXRlcyB2YWx1ZXMKKyAgICogb2Ygb25lIGluc3RhbmNlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzZXF1ZW5jZSBvZiBJZCdzLCB0aGUKKyAgICogb3JkZXIgaXMgcmVsYXRlZCB0byB0aGUgb3JkZXIgb2YgaW5zdGFuY2UgZWxlbWVudCBzcGVjaWZpZWQgaW4gdGhlCisgICAqIGlucHV0IHN0cnVjdHVyZS4gSW4gY2FzZSBvZiBpbmhlcml0YW5jZSwgdGhlIG1ldGhvZCBzdXBwb3J0cyBvbmx5CisgICAqIGluc3RhbmNlcyBvZiBzYW1lIHN1YnR5cGUgcGVyIGNhbGwuIFRoZSByZXR1cm5lZCBJZCdzIGFyZSB0aGUgSWQncworICAgKiBvZiB0aGUgcmVsYXRlZCBzdXBlciB0eXBlIGluc3RhbmNlcy4KKyAgICogCisgICAqIFRoZSBjbGllbnQgbXVzdCBzdXBwbHkgYWxsIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzCisgICAqIHdpdGhpbiBvbmUgc2luZ2xlIG1ldGhvZCBjYWxsOyBvdGhlcndpc2UgdGhlIG9iamVjdCBjYW5ub3QgYmUgbWFkZQorICAgKiBwZXJzaXN0ZW50IGJ5IHRoZSBzZXJ2ZXIgaW4gdGhlIGRhdGFiYXNlIHdpdGhvdXQgdGhlIHJpc2sgb2YKKyAgICogdmlvbGF0aW5nIGFueSBkYXRhYmFzZSBjb25zdHJhaW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhbCAgVGhlIHNlcXVlbmNlIG9mIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIHZhbHVlcy4gCisgICAqICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgIGZpZWxkcyBlbGVtSWQgYW5kIG52U2VxIG9mIHRoZSBzdHJ1Y3R1cmUgUHV0VmFsUmVxIGFuZAorICAgKiAgICAgICAgICAgICAgdGhlIHJlcXVlc3QgQU9QX1B1dFZhbFJlcS4KKyAgICoKKyAgICogQHJldHVybiAgTGlzdCB3aXRoIHRoZSBJZCdzIG9mIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZXMuCisgICAqLworICAgRWxlbUlkU2VxdWVuY2UgaW5zZXJ0SW5zdGFuY2VzKAorICAgICAgaW4gQUlETmFtZVZhbHVlU2VxVW5pdElkU2VxdWVuY2UgdmFsKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMDUpCisgICAqIFVwZGF0ZSBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9mIG9uZSBvciBtb3JlIGluc3RhbmNlIGVsZW1lbnRzLiBJdCdzCisgICAqIG5lY2Vzc2FyeSB0aGF0IHRoZSBpbnB1dCBzdHJ1Y3R1cmUgaW5jbHVkZXMgYWxzbyB0aGUgSWQgYXR0cmlidXRlLAorICAgKiB0aGUgSWQgYXR0cmlidXRlIHdpbGwgYmUgdXNlZCB0byBzZWxlY3QgdGhlIGluc3RhbmNlIGVsZW1lbnRzLiBJbgorICAgKiBjYXNlIG9mIGluaGVyaXRlZCBhcHBsaWNhdGlvbiBlbGVtZW50cyB0aGUgc3VwZXIgdHlwZSBJZCBoYXMgdG8gYmUKKyAgICogaW5jbHVkZWQuIFRoZSB2YWx1ZXMgb2Ygb25lIGluc3RhbmNlIGVsZW1lbnQgYXJlIHNwZWNpZmllZCBpbiB0aGUKKyAgICogdmFsdWVzZXEgb2YgdGhlIGlucHV0IHN0cnVjdHVyZS4gVGhlIHNhbWUgaW5kZXggaW4gdGhlIHZhbHVlc2VxCisgICAqIGNvcnJlc3BvbmRzIHRvIHRoZSBhdHRyaWJ1dGVzIHZhbHVlcyBvZiBvbmUgaW5zdGFuY2UgZWxlbWVudC4gCisgICAqIAorICAgKiBUaGUgc2VydmVyIHdpbGwgdXBkYXRlIHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsY29sdW1uIGluc3RhbmNlcyB3aGVuCisgICAqIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWEgYWxsIGZpdDoKKyAgICogCisgICAqIC0gT25seSB3aGVuIHRoZSBhdHRyaWJ1dGVzIGlkLCBnZW5lcmF0aW9uX3BhcmFtZXRlcnMsIHZhbHVlcywgZmxhZ3MKKyAgICogYXJlIGdpdmVuLCBhcyBzb29uIGFzIGFueSBvdGhlciBhdHRyaWJ1dGVzIGlzIGdpdmVuIGFuIGV4Y2VwdGlvbiBpcworICAgKiB0aHJvd24uCisgICAqIC0gVGhlIHZhbHVlcyBvZiB0aGUgbG9jYWxjb2x1bW4gbXVzdCBhbGwgYmVsb25nIHRvIGV4YWN0bHkgb25lCisgICAqIGluc3RhbmNlcyBvZiBBb01lYXN1cmVtZW50CisgICAqIC0gVGhlIHNlcnZlciBoYXZlIGEgbGltaXRhdGlvbiBvZiB0aGUgbWVtb3J5LCBub3QgdGhlIHN5c3RlbSBtZW1vcnkKKyAgICogbGltaXRhdGlvbiwgYXMgc29vbiBhcyB0aGUgZ2l2ZW4gdmFsdWVzIGJyZWFrcyB0aGUgbGltaXRhdGlvbiBhbgorICAgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdmFsICBUaGUgc2VxdWVuY2Ugb2YgYXR0cmlidXRlcyBhbmQgdGhlaXIgdmFsdWVzLiBBdCBsZWFzdAorICAgKiAgICAgICAgICAgICAgb25lIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHNlcXVlbmNlIG11c3QgYmUgYSBzZXF1ZW5jZQorICAgKiAgICAgICAgICAgICAgd2l0aCB0aGUgSWQuIAorICAgKiAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICBBdCB0aGUgUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4gdGhlCisgICAqICAgICAgICAgICAgICBmaWVsZHMgZWxlbUlkIGFuZCBudlNlcSBvZiB0aGUgc3RydWN0dXJlIFB1dFZhbFJlcSBhbmQKKyAgICogICAgICAgICAgICAgIHRoZSByZXF1ZXN0IEFPUF9QdXRWYWxSZXEuCisgICAqLworICAgdm9pZCB1cGRhdGVJbnN0YW5jZXMoCisgICAgICBpbiBBSUROYW1lVmFsdWVTZXFVbml0SWRTZXF1ZW5jZSB2YWwpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwNikKKyAgICogRGVsZXRlIGluc3RhbmNlcyBmcm9tIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuIEluIGNhc2Ugb2YgaW5oZXJpdGVkCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnRzIHRoZSBJZCBvZiB0aGUgc3VwZXIgdHlwZSBoYXMgdG8gYmUgc3BlY2lmaWVkLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZGVsZXRlIHNldmVyYWwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQsIHRoZSBtZXRob2QgcmVtb3ZlSW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZQorICAgKiBBcHBsaWNhdGlvbkVsZW1lbnQgdG8gcmVtb3ZlIG9uZSBpbnN0YW5jZSBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50CisgICAqIHdpdGggdGhlIGNoaWxkcmVuIG9mIHRoZSBpbnN0YW5jZSBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuCisgICAqCisgICAqIEBwYXJhbSAgaW5zdElkcyAgVGhlIHNlcXVlbmNlIG9mIGluc3RhbmNlIElkJ3MuIAorICAgKiAgICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgICAgICBmaWVsZHMgZWxlbUlkIGFuZCBudlNlcSBvZiB0aGUgc3RydWN0dXJlIFB1dFZhbFJlcQorICAgKiAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcmVxdWVzdCBBT1BfUHV0VmFsUmVxLgorICAgKi8KKyAgIHZvaWQgZGVsZXRlSW5zdGFuY2VzKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQsCisgICAgICBpbiBTX0xPTkdMT05HIGluc3RJZHMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwNykKKyAgICogR2V0IHRoZSB2YWx1ZSBtYXRyaXggb2YgYSBtZWFzdXJlbWVudCBvciBhIHN1Ym1hdHJpeC4gSWYgdGhlIHZhbHVlCisgICAqIG1hdHJpeCB3aWxsIGJlIGJ1aWx0IHVwIHdpdGggc3BlY2lhbCBzdWJtYXRyaXggbGluaywgdXNlIHRoZQorICAgKiBpbnRlcmZhY2UgTWVhc3VyZW1lbnQuCisgICAqIEJ5IGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSB2YWx1ZSBtYXRyaXggbW9kZSBvZiB0aGUgcmV0dXJuZWQgdmFsdWUKKyAgICogbWF0cml4IHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgY29udGV4dCB2YXJpYWJsZSAnVkFMVUVNQVRSSVhfTU9ERScuCisgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGVzcGVjaWFsbHkgb24gZGlmZmVyZW50IG1vZGVzIG9mIHRoZSB2YWx1ZQorICAgKiBtYXRyaXgsIHNlZSBkZXNjcmlwdGlvbiBhdCB0aGUgbWV0aG9kIGdldFZhbHVlTWF0cml4SW5Nb2RlKCkgb2YgdGhlCisgICAqIGludGVyZmFjZXMgJ01lYXN1cmVtZW50JyBhbmQgJ1N1Yk1hdHJpeCcuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0lOVkFMSURfQkFTRVRZUEUKKyAgICoKKyAgICogQHBhcmFtICBlbGVtICBUaGUgZWxlbWVudCBpZC4gVGhlIGFpZCBoYXMgdG8gYmUgdGhlIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgICAgICAgZWxlbWVudCBJZCBvZiB0aGUgQW9NZWFzdXJlbWVudCBvciBBb1N1Ym1hdHJpeC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZhbHVlIG1hdHJpeAorICAgKi8KKyAgIFZhbHVlTWF0cml4IGdldFZhbHVlTWF0cml4KAorICAgICAgaW4gRWxlbUlkIGVsZW0pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwOCkKKyAgICogU2V0IHRoZSBBQ0wgaW5mb3JtYXRpb24gb24gc29tZSBhcHBsaWNhdGlvbiBlbGVtZW50LWF0dHJpYnV0ZQorICAgKiBkZWZpbmVkIGJ5IDxhaWQ+IGFuZCA8YXR0cl9uYW1lPi4gVGhlIDx1c2VyZ3JvdXBfaWQ+IGRlZmluZXMgdGhlCisgICAqIHVzZXIgZ3JvdXAgdGhlIHJpZ2h0cyBzaG91bGQgYmUgc2V0IGZvci4gPHJpZ2h0cz4gZGVmaW5lcyB0aGUgcmlnaHRzCisgICAqIHRvIHNldCBvciB0byBjbGVhci4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ3NldCcsIHRoZQorICAgKiByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHNldCBhbGwgb3RoZXJzIGFyZSBjbGVhcmVkLiBJZiB0aGUgcGFyYW1ldGVyCisgICAqIDxzZXQ+IGlzIHNldCB0byAnYWRkJywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgYWRkZWQgdG8gdGhlCisgICAqIGV4aXN0aW5nIHJpZ2h0cy4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ3JlbW92ZScsIHRoZQorICAgKiByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHJlbW92ZWQgZnJvbSB0aGUgZXhpc3RpbmcgcmlnaHRzLiBSZXN0cmljdGlvbgorICAgKiBmb3IgdGhlIG1vZGVsOiBvbmx5IG9uZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHRoZSB0eXBlIEFvVXNlckdyb3VwCisgICAqIGlzIGFsbG93ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICBhdHRyTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICoKKyAgICogQHBhcmFtICB1c2VyZ3JvdXBJZCAgVGhlIHVzZXIgZ3JvdXAgdG8gc2V0IHRoZSByaWdodHMgZm9yLgorICAgKgorICAgKiBAcGFyYW0gIHJpZ2h0cyAgVGhlIG5ldyByaWdodCBmb3IgdGhlIHVzZXIgZ3JvdXAuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyByaWdodC4KKyAgICovCisgICB2b2lkIHNldEF0dHJpYnV0ZVJpZ2h0cygKKyAgICAgIGluIFRfTE9OR0xPTkcgYWlkLAorICAgICAgaW4gVF9TVFJJTkcgYXR0ck5hbWUsCisgICAgICBpbiBUX0xPTkdMT05HIHVzZXJncm91cElkLAorICAgICAgaW4gVF9MT05HIHJpZ2h0cywKKyAgICAgIGluIFJpZ2h0c1NldCBzZXQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwOSkKKyAgICogU2V0IHRoZSBBQ0wgaW5mb3JtYXRpb24gb24gc29tZSBhcHBsaWNhdGlvbiBlbGVtZW50IGRlZmluZWQgYnkKKyAgICogPGFpZD4uIFRoZSA8dXNlcmdyb3VwX2lkPiBkZWZpbmVzIHRoZSB1c2VyIGdyb3VwIHRoZSByaWdodHMgc2hvdWxkCisgICAqIGJlIHNldCBmb3IuIDxyaWdodHM+IGRlZmluZXMgdGhlIHJpZ2h0cyB0byBzZXQgb3IgdG8gY2xlYXIuIElmIHRoZQorICAgKiBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdzZXQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBzZXQgYWxsCisgICAqIG90aGVycyBhcmUgY2xlYXJlZC4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ2FkZCcsIHRoZQorICAgKiByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyByaWdodHMuIElmIHRoZQorICAgKiBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdyZW1vdmUnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZQorICAgKiByZW1vdmVkIGZyb20gdGhlIGV4aXN0aW5nIHJpZ2h0cy4gIFJlc3RyaWN0aW9uIGZvciB0aGUgbW9kZWw6IG9ubHkKKyAgICogb25lIGFwcGxpY2F0aW9uIGVsZW1lbnQgb2YgdGhlIHR5cGUgQW9Vc2VyR3JvdXAgaXMgYWxsb3dlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICB1c2VyZ3JvdXBJZCAgVGhlIHVzZXIgZ3JvdXAgdG8gc2V0IHRoZSByaWdodHMgZm9yLgorICAgKgorICAgKiBAcGFyYW0gIHJpZ2h0cyAgVGhlIG5ldyByaWdodHMgZm9yIHRoZSB1c2VyIGdyb3VwLiBUaGUgcmlnaHRzCisgICAqICAgICAgICAgICAgICAgICBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZQorICAgKiAgICAgICAgICAgICAgICAgU2VjdXJpdHlSaWdodHMuIFRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZQorICAgKiAgICAgICAgICAgICAgICAgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mIGVudW1lcmF0aW9ucworICAgKiAgICAgICAgICAgICAgICAgdGh1cyB0aGUgY29uc3RhbnQgZGVmaW5pdGlvbnMgaGFkIHRvIGJlIGRvbmUgaW4gYW4KKyAgICogICAgICAgICAgICAgICAgIGludGVyZmFjZS4KKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFdoYXQgdG8gZG8gd2l0aCB0aGUgbmV3IHJpZ2h0LgorICAgKi8KKyAgIHZvaWQgc2V0RWxlbWVudFJpZ2h0cygKKyAgICAgIGluIFRfTE9OR0xPTkcgYWlkLAorICAgICAgaW4gVF9MT05HTE9ORyB1c2VyZ3JvdXBJZCwKKyAgICAgIGluIFRfTE9ORyByaWdodHMsCisgICAgICBpbiBSaWdodHNTZXQgc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMTApCisgICAqIFNldCB0aGUgQUNMIGluZm9ybWF0aW9uIG9uIHNvbWUgaW5zdGFuY2UgZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24KKyAgICogZWxlbWVudCBpZCA8YWlkPiBhbmQgYSBzZXF1ZW5jZSBvZiBpbnN0YW5jZSBkZWZpbmVkIGJ5IHRoZSBpZCA8aWlkPi4KKyAgICogVGhlIDx1c2VyZ3JvdXBfaWQ+IGRlZmluZXMgdGhlIHVzZXIgZ3JvdXAgdGhlIHJpZ2h0cyBzaG91bGQgYmUgc2V0CisgICAqIGZvci4gPHJpZ2h0cz4gZGVmaW5lcyB0aGUgcmlnaHRzIHRvIHNldCBvciB0byBjbGVhci4gSWYgdGhlCisgICAqIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ3NldCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHNldCBhbGwKKyAgICogb3RoZXJzIGFyZSBjbGVhcmVkLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0byAnYWRkJywgdGhlCisgICAqIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIHJpZ2h0cy4gSWYgdGhlCisgICAqIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ3JlbW92ZScsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlCisgICAqIHJlbW92ZWQgZnJvbSB0aGUgZXhpc3RpbmcgcmlnaHRzLiAgUmVzdHJpY3Rpb24gZm9yIHRoZSBtb2RlbDogb25seQorICAgKiBvbmUgYXBwbGljYXRpb24gZWxlbWVudCBvZiB0aGUgdHlwZSBBb1VzZXJHcm91cCBpcyBhbGxvd2VkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIGluc3RJZHMgIFRoZSBzZXF1ZW5jZSBvZiBpbnN0YW5jZSBJZCdzLgorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cElkICBUaGUgdXNlciBncm91cCB0byBzZXQgdGhlIHJpZ2h0cyBmb3IuCisgICAqCisgICAqIEBwYXJhbSAgcmlnaHRzICBUaGUgbmV3IHJpZ2h0IGZvciB0aGUgdXNlciBncm91cC4KKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFdoYXQgdG8gZG8gd2l0aCB0aGUgbmV3IHJpZ2h0LgorICAgKi8KKyAgIHZvaWQgc2V0SW5zdGFuY2VSaWdodHMoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCwKKyAgICAgIGluIFNfTE9OR0xPTkcgaW5zdElkcywKKyAgICAgIGluIFRfTE9OR0xPTkcgdXNlcmdyb3VwSWQsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDExKQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlIDxhaWQ+LzxhdHRyX25hbWU+LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIGF0dHJOYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBlbnRyaWVzIG9mIHRoZSBnaXZlIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgIGF0dHJpYnV0ZS4KKyAgICovCisgICBBQ0xTZXF1ZW5jZSBnZXRBdHRyaWJ1dGVSaWdodHMoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCwKKyAgICAgIGluIFRfU1RSSU5HIGF0dHJOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMTIpCisgICAqIFJldHJpZXZlIGFjY2VzcyBjb250cm9sIGxpc3QgaW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQKKyAgICogYXBwbGljYXRpb24gZWxlbWVudCA8YWlkPi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFjY2VzcyBjb250cm9sIGxpc3QgZW50cmllcyBvZiB0aGUgZ2l2ZW4gYXBwbGljYXRpb24KKyAgICogICAgICAgICAgZWxlbWVudC4KKyAgICovCisgICBBQ0xTZXF1ZW5jZSBnZXRFbGVtZW50UmlnaHRzKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAxMykKKyAgICogUmV0cmlldmUgYWNjZXNzIGNvbnRyb2wgbGlzdCBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBpbnN0YW5jZQorICAgKiA8YWlkPi88aWlkPi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICBpaWQgIFRoZSBJZCBvZiB0aGUgaW5zdGFuY2UuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGVudHJpZXMgb2YgdGhlIGdpdmVuIGluc3RhbmNlLgorICAgKi8KKyAgIEFDTFNlcXVlbmNlIGdldEluc3RhbmNlUmlnaHRzKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQsCisgICAgICBpbiBUX0xPTkdMT05HIGlpZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDE0KQorICAgKiBTZXQgdGhlIGFjY2VzcyBjb250cm9sIGxpc3QgaW5mb3JtYXRpb24gZm9yIHRoZSBpbml0aWFsIHJpZ2h0cyBvbgorICAgKiBzb21lIGFwcGxpY2F0aW9uIGVsZW1lbnQgZGVmaW5lZCBieSA8YWlkPi4gVGhlIDx1c2VyZ3JvdXBfaWQ+CisgICAqIGRlZmluZXMgdGhlIHVzZXIgZ3JvdXAgdGhlIHJpZ2h0cyBzaG91bGQgYmUgc2V0IGZvci4gPHJpZ2h0cz4KKyAgICogZGVmaW5lcyB0aGUgcmlnaHRzIHRvIHNldCBvciB0byBjbGVhci4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQKKyAgICogdG8gJ3NldCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHNldCBhbGwgb3RoZXJzIGFyZSBjbGVhcmVkLiBJZgorICAgKiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0byAnYWRkJywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUKKyAgICogYWRkZWQgdG8gdGhlIGV4aXN0aW5nIHJpZ2h0cy4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8KKyAgICogJ3JlbW92ZScsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHJlbW92ZWQgZnJvbSB0aGUgZXhpc3RpbmcKKyAgICogcmlnaHRzLiAgUmVzdHJpY3Rpb24gZm9yIHRoZSBtb2RlbDogb25seSBvbmUgYXBwbGljYXRpb24gZWxlbWVudCBvZgorICAgKiB0aGUgdHlwZSBBb1VzZXJHcm91cCBpcyBhbGxvd2VkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cElkICBUaGUgdXNlciBncm91cCB0byBzZXQgdGhlIGluaXRpYWwgcmlnaHRzIGZvci4KKyAgICoKKyAgICogQHBhcmFtICByaWdodHMgIFRoZSBuZXcgaW5pdGlhbCByaWdodHMgZm9yIHRoZSB1c2VyIGdyb3VwLiBUaGUKKyAgICogICAgICAgICAgICAgICAgIHJpZ2h0cyBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZQorICAgKiAgICAgICAgICAgICAgICAgU2VjdXJpdHlSaWdodHMuIFRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZQorICAgKiAgICAgICAgICAgICAgICAgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mIGVudW1lcmF0aW9ucworICAgKiAgICAgICAgICAgICAgICAgdGh1cyB0aGUgY29uc3RhbnQgZGVmaW5pdGlvbnMgaGFkIHRvIGJlIGRvbmUgaW4gYW4KKyAgICogICAgICAgICAgICAgICAgIGludGVyZmFjZS4KKyAgICoKKyAgICogQHBhcmFtICByZWZBaWQgIFRoZSBJZCBvZiByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBlbGVtZW50IGZvciB3aGljaAorICAgKiAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgcmlnaHRzIHdpbGwgYmUgdXNlZC4gSWYgbm8gcmVmQWlkIGlzIHNldAorICAgKiAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgcmlnaHRzIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBuZXcKKyAgICogICAgICAgICAgICAgICAgIGluc3RhbmNlIGVsZW1lbnQgaW5kZXBlbmRlbnQgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgICAgICAgICBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIHNldCAgV2hhdCB0byBkbyB3aXRoIHRoZSBuZXcgaW5pdGlhbCByaWdodHMuCisgICAqLworICAgdm9pZCBzZXRFbGVtZW50SW5pdGlhbFJpZ2h0cygKKyAgICAgIGluIFRfTE9OR0xPTkcgYWlkLAorICAgICAgaW4gVF9MT05HTE9ORyB1c2VyZ3JvdXBJZCwKKyAgICAgIGluIFRfTE9ORyByaWdodHMsCisgICAgICBpbiBUX0xPTkdMT05HIHJlZkFpZCwKKyAgICAgIGluIFJpZ2h0c1NldCBzZXQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAxNSkKKyAgICogU2V0IHRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIGZvciB0aGUgaW5pdGlhbCByaWdodHMgb24KKyAgICogc29tZSBpbnN0YW5jZSBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkIDxhaWQ+IGFuZCBhCisgICAqIHNlcXVlbmNlIG9mIGluc3RhbmNlIGRlZmluZWQgYnkgdGhlIGlkIDxpaWQ+LiBUaGUgPHVzZXJncm91cF9pZD4KKyAgICogZGVmaW5lcyB0aGUgdXNlciBncm91cCB0aGUgcmlnaHRzIHNob3VsZCBiZSBzZXQgZm9yLiA8cmlnaHRzPgorICAgKiBkZWZpbmVzIHRoZSByaWdodHMgdG8gc2V0IG9yIHRvIGNsZWFyLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldAorICAgKiB0byAnc2V0JywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgc2V0IGFsbCBvdGhlcnMgYXJlIGNsZWFyZWQuIElmCisgICAqIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdhZGQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZQorICAgKiBhZGRlZCB0byB0aGUgZXhpc3RpbmcgcmlnaHRzLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0bworICAgKiAncmVtb3ZlJywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBleGlzdGluZworICAgKiByaWdodHMuICBSZXN0cmljdGlvbiBmb3IgdGhlIG1vZGVsOiBvbmx5IG9uZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9mCisgICAqIHRoZSB0eXBlIEFvVXNlckdyb3VwIGlzIGFsbG93ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWlkICBUaGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqCisgICAqIEBwYXJhbSAgaW5zdElkcyAgVGhlIHNlcXVlbmNlIG9mIGluc3RhbmNlIElkJ3MuCisgICAqCisgICAqIEBwYXJhbSAgdXNlcmdyb3VwSWQgIFRoZSB1c2VyIGdyb3VwIHRvIHNldCB0aGUgaW5pdGlhbCByaWdodHMgZm9yLgorICAgKgorICAgKiBAcGFyYW0gIHJpZ2h0cyAgVGhlIG5ldyBpbml0aWFsIHJpZ2h0IGZvciB0aGUgdXNlciBncm91cC4KKyAgICoKKyAgICogQHBhcmFtICByZWZBaWQgIFRoZSBJZCBvZiByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBlbGVtZW50IGZvciB3aGljaAorICAgKiAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgcmlnaHRzIHdpbGwgYmUgdXNlZC4gSWYgbm8gcmVmQWlkIGlzIHNldAorICAgKiAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgcmlnaHRzIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBuZXcKKyAgICogICAgICAgICAgICAgICAgIGluc3RhbmNlIGVsZW1lbnQgaW5kZXBlbmRlbnQgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgICAgICAgICBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIHNldCAgV2hhdCB0byBkbyB3aXRoIHRoZSBuZXcgaW5pdGlhbCByaWdodHMuCisgICAqLworICAgdm9pZCBzZXRJbnN0YW5jZUluaXRpYWxSaWdodHMoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCwKKyAgICAgIGluIFNfTE9OR0xPTkcgaW5zdElkcywKKyAgICAgIGluIFRfTE9OR0xPTkcgdXNlcmdyb3VwSWQsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gVF9MT05HTE9ORyByZWZBaWQsCisgICAgICBpbiBSaWdodHNTZXQgc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMTYpCisgICAqIFNldCB0aGUgZmxhZyA8c2V0PiBpbiBzdmNhdHRyLCBpZiB0aGlzIHJlZmVyZW5jZSB3aWxsIGJlIHVzZWQgKG9yCisgICAqIG5vdCkgdG8gcmV0cmlldmUgdGhlIEluaXRpYWwgUmlnaHRzLiBJZiBtb3JlIHRoYW4gb25lIHJlZmVyZW5jZSBpcworICAgKiBzZXQgdG8gdHJ1ZSwgdGhlIHVuaW9uIChvci1mdW5jdGlvbikgb2YgYWxsIHJpZ2h0cyBhcmUgdXNlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuCisgICAqCisgICAqIEBwYXJhbSAgcmVmTmFtZSAgVGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZS4KKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFdoYXQgdG8gZG8gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlLgorICAgKi8KKyAgIHZvaWQgc2V0SW5pdGlhbFJpZ2h0UmVmZXJlbmNlKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQsCisgICAgICBpbiBUX1NUUklORyByZWZOYW1lLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDE3KQorICAgKiBHZXQgYWxsIGF0dHJpYnV0ZSBuYW1lcyAocmVmZXJlbmNlcykgd2hpY2ggYXJlIHVzZWQgdG8gcmV0cmlldmUgdGhlCisgICAqIEluaXRpYWwgUmlnaHRzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgcmVmZXJlbmNlcyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZQorICAgKiAgICAgICAgICBpbml0aWFsIHJpZ2h0cyBkZXRlcm1pbmF0aW9uLgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBnZXRJbml0aWFsUmlnaHRSZWZlcmVuY2UoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDE4KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIG9mIHRoZSBpbml0aWFsIHJpZ2h0cyBmb3IKKyAgICogdGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50IDxhaWQ+LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBlbnRyaWVzIG9mIHRoZSBnaXZlbiBhcHBsaWNhdGlvbgorICAgKiAgICAgICAgICBlbGVtZW50IGZvciB0aGUgaW5pdGlhbCByaWdodHMuCisgICAqLworICAgSW5pdGlhbFJpZ2h0U2VxdWVuY2UgZ2V0RWxlbWVudEluaXRpYWxSaWdodHMoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDE5KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIG9mIHRoZSBpbml0aWFsIHJpZ2h0cyBmb3IKKyAgICogdGhlIHJlcXVlc3RlZCBpbnN0YW5jZSA8YWlkPi88aWlkPi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICBpaWQgIFRoZSBJZCBvZiB0aGUgaW5zdGFuY2UuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGVudHJpZXMgb2YgdGhlIGdpdmVuIGluc3RhbmNlIGZvcgorICAgKiAgICAgICAgICB0aGUgaW5pdGlhbCByaWdodHMuCisgICAqLworICAgSW5pdGlhbFJpZ2h0U2VxdWVuY2UgZ2V0SW5zdGFuY2VJbml0aWFsUmlnaHRzKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQsCisgICAgICBpbiBUX0xPTkdMT05HIGlpZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDIwKQorICAgKiBQZXJmb3JtIHRoZSBRdWVyeS4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGEgbW9yZSBwb3dlcmZ1bCBxdWVyeQorICAgKiBjb21wYXJlZCB0byB0aGUgbWV0aG9kIGdldEluc3RhbmNlcyBvZiB0aGlzIGludGVyZmFjZSwgd2l0aCBqb2luCisgICAqIGRlZmluaXRpb25zIGFuZCBhZ2dyZWdhdGUgZnVuY3Rpb25zLgorICAgKiAKKyAgICogVGhlIG51bWJlciBvZiBkaWZmZXJlbnQgYXBwbGljYXRpb24gZWxlbWVudHMgd2hpY2ggYXJlIHJlcXVlc3RlZCBhcmUKKyAgICogZXhhY3RseSBkZWZpbmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBxdWVyeSBnaXZlbiBpbiB0aGUgZmllbGQKKyAgICogYW51U2VxIG9mIHRoZSBRdWVyeVN0cnVjdHVyZUV4dC4gVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGZvciBlYWNoCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgYWxzbyBnaXZlbiBpbiB0aGUgZGVmaW5pdGlvbi4gVGhlIG51bWJlciBvZgorICAgKiBtYXRjaGluZyBpbnN0YW5jZXMgKHRoZWlyIGF0dHJpYnV0ZXMpIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBxdWVyeQorICAgKiBhbmQgY2FuIGJlIGEgbGFyZ2UgYW1vdW50LiBUaGVyZWZvcmUgb25seSBvbmUgaXRlcmF0b3IgZm9yIHRoZQorICAgKiBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBkZWZpbmVkLgorICAgKiAKKyAgICogVGhlIHJldHVybiBpcyBhIHNlcXVlbmNlIG9mIHRoZSBzdHJ1Y3R1cmUgUmVzdWx0U2V0RXh0IC4gVGhpcworICAgKiBzZXF1ZW5jZSB3aWxsIGFsd2F5cyBoYXZlIHRoZSBsZW5ndGggb2YgMS4gVGhpcworICAgKiBlbGVtZW50IGluIHRoZSBzdHJ1Y3R1cmUgaGF2ZSB0d28gZmllbGRzIAorICAgKiAgIC0gZmlyc3RFbGVtcyBvZiB0eXBlIEVsZW1SZXN1bHRTZXRFeHRTZXF1ZW5jZQorICAgKiAgIC0gcmVzdEVsZW1zIG9mIHR5cGUgRWxlbVJlc3VsdFNldEV4dFNlcUl0ZXJhdG9yCisgICAqIAorICAgKiBmaXJzdEVsZW1zCisgICAqIFRoZSBmaXJzdEVsZW1zIGlzIGEgc2VxdWVuY2Ugb2YgRWxlbVJlc3VsdFNldEV4dCwgdGhlIGxlbmd0aCBvZiB0aGUKKyAgICogc2VxdWVuY2UgY29ycmVzcG9uZHMgd2l0aCB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBhcHBsaWNhdGlvbgorICAgKiBlbGVtZW50cyByZXF1ZXN0ZWQgaW4gdGhlIGFudVNlcSBvZiB0aGUgUXVlcnlTdHJ1Y3RydWVFeHQuIFRoZQorICAgKiBzdHJ1Y3R1cmUgRWxlbVJlc3VsdFNldEV4dCBoYXMgdGhlIGZpZWxkcyBhaWQgYW5kIHZhbHVlcy4gVGhlIGFpZCBpcworICAgKiB0aGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQsIHRoZSB2YWx1ZXMsIGEgc2VxdWVuY2Ugb2YgdGhlCisgICAqIHN0cnVjdHVyZSBOYW1lVmFsdWVTZXFVbml0SWQgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMuIEZvcgorICAgKiBlYWNoIHJlcG9ydGVkIGF0dHJpYnV0ZSBhbiBlbnRyeSBpcyBnaXZlbiBpbiB0aGUgc2VxdWVuY2UsIHRoZSBuYW1lCisgICAqIG9mIHRoZSBhdHRyaWJ1dGUgaXMgZ2l2ZW4gaW4gdGhlIGZpZWxkIHZhbE5hbWUuIFRoZSBJZCBvZiB0aGUgdW5pdAorICAgKiBpcyBnaXZlbiBpbiB0aGUgZmllbGQgdW5pdElkLCB0aGlzIGlzIHRoZSBJZCBvZiB0aGUgaW5zdGFuY2Ugb2YgdGhlCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgZGVyaXZlZCBmcm9tIHRoZSBiYXNlIGVsZW1lbnQgQW9Vbml0LiBUaGUgdmFsdWVzCisgICAqIGFyZSBnaXZlbiBpbiB0aGUgZmllbGQgdmFsdWUgd2l0aCB0aGUgdHlwZSBUU19WYWx1ZVNlcS4gRWFjaCB2YWx1ZQorICAgKiBzZXF1ZW5jZSBoYXMgdGhlIHNhbWUgbGVuZ3RoLCB0aGlzIGxlbmd0aCBpcyBtYXhpbXVtIGhvd19tYW55IHRoZQorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIG1ldGhvZC4gSWYgbm8gdmFsdWVzIGFyZSBmb3VuZCB0aGUgbGVuZ3RoIG9mIHRoZQorICAgKiBzZXF1ZW5jZSBpcyAwLiBUaGUgdmFsdWVzIHdpdGggdGhlIHNhbWUgaW5kZXggaW4gdGhlIGRpZmZlcmVudAorICAgKiBzZXF1ZW5jZXMgb2YgdGhlIGVudHJ5IGluIHRoZSBOYW1lVmFsdWVTZXFVbml0SWRTZXF1ZW5jZSBiZWxvbmdzIHRvCisgICAqIHRoZSBzYW1lIGluc3RhbmNlIGVsZW1lbnQuIAorICAgKiAKKyAgICogcmVzdEVsZW1zCisgICAqIFRoZSByZXN0RWxlbXMgaXMgYW4gaXRlcmF0b3IgZm9yIHRoZSByZW1haW5pbmcgc2VxdWVuY2Ugb2YKKyAgICogRWxlbVJlc3VsdFNldEV4dC4gVGhpcyBpdGVyYXRvciBhbGxvd3MgdG8gbG9hZCB0aGUgbmV4dCBOIHZhbHVlcworICAgKiBmcm9tIHRoZSBSZXN1bHRTZXQuIFRoZSByZXN1bHQgb2YgdGhlIGVsZW1lbnQgaXMgdGhlIHNhbWUgd2F5IHN0b3JlZAorICAgKiBhcyBhdCB0aGUgZmllbGQgZmlyc3RFbGVtcywgdGhlIG5leHQgTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQorICAgKiBvZiB0aGUgZmllbGQgdmFsdWUgb2YgdGhlIE5hbWVWYWx1ZVNlcVVuaXRJZC4gVGhlIG1ldGhvZCBuZXh0T25lIGlzCisgICAqIHdyb25nIHNwZWNpZmllZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLCB1c2UgaW5zdGVhZCB0aGUgbWV0aG9kIG5leHROCisgICAqIHdpdGggbj0xLiBUaGUgbWV0aG9kIGdldENvdW50IHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGZvdW5kCisgICAqIGVsZW1lbnQsIGFsc28gdGhlIG51bWJlciBhbHJlYWR5IHJldHVybmVkIGluIGZpcnN0RWxlbXMuIFRoZSBtZXRob2QKKyAgICogcmVzZXQgc2V0IHRoZSBpdGVyYXRvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBSZXN1bHRTZXQsIHRoaXMgaXMgdGhlCisgICAqIGJlZ2lubmluZyBvZiB0aGUgZmlyc3RFbGVtcy4KKyAgICogCisgICAqIFRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsY29sdW1uIGluc3RhbmNlcyBpcyBwYXJ0IG9mIHRoZSByZXN1bHRzZXQKKyAgICogd2hlbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhIGFsbCBmaXQ6CisgICAqIAorICAgKiAtIE9ubHkgd2hlbiB0aGUgYXR0cmlidXRlcyBpZCwgZ2VuZXJhdGlvbl9wYXJhbWV0ZXJzLCB2YWx1ZXMsIGZsYWdzCisgICAqIGFyZSByZXF1ZXN0ZWQsIGFzIHNvb24gYXMgYW55IG90aGVyIGF0dHJpYnV0ZXMgaXMgcmVxdWVzdGVkIHRoZQorICAgKiB2YWx1ZXMgYXJlIG5vdCByZXBvcnRlZC4KKyAgICogLSBUaGUgdmFsdWVzIG9mIHRoZSBsb2NhbGNvbHVtbiBtdXN0IGFsbCBiZWxvbmcgdG8gZXhhY3RseSBvbmUKKyAgICogaW5zdGFuY2VzIG9mIEFvTWVhc3VyZW1lbnQKKyAgICogLSBUaGUgc2VydmVyIGhhdmUgYSBsaW1pdGF0aW9uIG9mIHRoZSBtZW1vcnksIG5vdCB0aGUgc3lzdGVtIG1lbW9yeQorICAgKiBsaW1pdGF0aW9uLCBhcyBzb29uIGFzIHRoZSByZXN1bHQgc2V0IHdpbGwgYnJlYWsgdGhlIGxpbWl0YXRpb24gYW4KKyAgICogZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKiAtIE5vIGl0ZXJhdG9yIGZvciB0aGUgcmVzdCBpcyByZXF1aXJlZC4KKyAgICogCisgICAqIEluIGNhc2UgYW4gYXR0cmlidXRlIG9mIGJsb2IgdHlwZSBpcyBhbW9uZyB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMsCisgICAqIHRoZSBjb250ZW50IG9mIHRoZSByZXR1cm4gc3RydWN0dXJlIHdpbGwgZGVwZW5kIG9uIHRoZSBudW1iZXIgb2YKKyAgICogaW5zdGFuY2VzIHRoYXQgYXJlIHJldHVybmVkOgorICAgKiAtIEluIGNhc2UgYXR0cmlidXRlcyBvZiBvbmx5IG9uZSBpbnN0YW5jZSBhcmUgcmV0dXJuZWQgKGVpdGhlcgorICAgKiBiZWNhdXNlICdob3dfbWFueScgd2FzIHNldCB0byAxIG9yIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlCisgICAqIGF2YWlsYWJsZSBhdCB0aGUgc2VydmVyKSwgdGhlIHJldHVybiBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGJsb2IKKyAgICogaXRzZWxmLgorICAgKiAtIEluIGNhc2UgYXR0cmlidXRlcyBvZiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIGFyZSByZXR1cm5lZCwgdGhlCisgICAqIHJldHVybiBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiB0aGUgYmxvYnM7IGluc3RlYWQgaXQgY29udGFpbnMgdGhlCisgICAqIGhlYWRlcnMgb2YgdGhlIHJlc3BlY3RpdmUgYmxvYnMuCisgICAqIAorICAgKiBUaGUgdmFsdWUgb2YgdmFsTmFtZSBvZiBxdWVyeSByZXN1bHQgdmFsdWVzIHNoYWxsIGJlIHRoZSBhYU5hbWUgaW4KKyAgICogY2FzZSBBZ2dyRnVuYz0nTk9ORScgYW5kIHNoYWxsIGJlIGNvbnN0cnVjdGVkIGZvciBhbGwgb3RoZXIgQWdnckZ1bmMKKyAgICogdmFsdWVzIGFzIHN0cmluZyBjb25jYXRlbmF0aW9uIG9mIHRoZSBBZ2dyRnVuYyB2YWx1ZSBmb2xsb3dlZCBieSBhCisgICAqICcoJyBjaGFyYWN0ZXIsIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGF0dHJpYnV0ZSAoYWFOYW1lKSBmb2xsb3dlZAorICAgKiBieSBhICcpJyBjaGFyYWN0ZXIuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYW9xICBUaGUgcXVlcnkgZGVmaW5pdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICBob3dfbWFueSAgTWF4aW11bSBudW1iZXIgb2YgdmFsdWVzIGluIGVhY2ggcmVzdWx0IHNldC4gVmFsaWQKKyAgICogICAgICAgICAgICAgICAgICAgYXJndW1lbnRzIGFyZTogCisgICAqICAgICAgICAgICAgICAgICAgIGhvd19tYW55ID0gMCA6IHJlcG9ydCBhbGwgZm91bmQgdmFsdWVzLAorICAgKiAgICAgICAgICAgICAgICAgICBob3dfbWFueSA+IDAgOiByZXBvcnQgYSBtYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXN1bHQgc2V0IHdpdGggdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUgdmFsdWVzLgorICAgKi8KKyAgIFJlc3VsdFNldEV4dFNlcXVlbmNlIGdldEluc3RhbmNlc0V4dCgKKyAgICAgIGluIFF1ZXJ5U3RydWN0dXJlRXh0IGFvcSwKKyAgICAgIGluIFRfTE9ORyBob3dfbWFueSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDIxKQorICAgKiBHZXQgdGhlIHZhbHVlIG1hdHJpeCBvZiBhIG1lYXN1cmVtZW50IG9yIGEgc3VibWF0cml4LiBJZiB0aGUgdmFsdWUKKyAgICogbWF0cml4IHdpbGwgYmUgYnVpbHQgdXAgd2l0aCBzcGVjaWFsIHN1Ym1hdHJpeCBsaW5rLCB1c2UgdGhlCisgICAqIGludGVyZmFjZSBNZWFzdXJlbWVudC4KKyAgICogVGhlIGJlaGF2aW9yIG9mIHRoZSBBU0FNIE9EUyBzZXJ2ZXIgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZQorICAgKiByZWZlcmVuY2VkIGVsZW1lbnQgaXMgYSBzdWJtYXRyaXggb3IgYSBtZWFzdXJlbWVudC4gRm9yIG1vcmUKKyAgICogaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlciBiZWhhdmlvciBzZWUgZGVzY3JpcHRpb24gYXQgdGhlIG1ldGhvZAorICAgKiBnZXRWYWx1ZU1hdHJpeEluTW9kZSgpIG9mIHRoZSBpbnRlcmZhY2VzICdNZWFzdXJlbWVudCcgYW5kCisgICAqICdTdWJNYXRyaXgnLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqICAgIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFCisgICAqCisgICAqIEBwYXJhbSAgZWxlbSAgVGhlIGVsZW1lbnQgaWQuIFRoZSBhaWQgaGFzIHRvIGJlIHRoZSBhcHBsaWNhdGlvbgorICAgKiAgICAgICAgICAgICAgIGVsZW1lbnQgSWQgb2YgdGhlIEFvTWVhc3VyZW1lbnQgb3IgQW9TdWJtYXRyaXguCisgICAqCisgICAqIEBwYXJhbSAgdm1Nb2RlICBUaGUgcmVxdWVzdGVkIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZhbHVlIG1hdHJpeC4KKyAgICovCisgICBWYWx1ZU1hdHJpeCBnZXRWYWx1ZU1hdHJpeEluTW9kZSgKKyAgICAgIGluIEVsZW1JZCBlbGVtLAorICAgICAgaW4gVmFsdWVNYXRyaXhNb2RlIHZtTW9kZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDIyKQorICAgKiBHZXQgdGhlIE9EU0ZpbGUgaW50ZXJmYWNlIGZvciBhbiBpbnN0YW5jZSBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50CisgICAqIGRlcml2ZWQgZnJvbSBBb0ZpbGUuCisgICAqIAorICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIE9EU0ZpbGUgaW50ZXJmYWNlLgorICAgKiAKKyAgICogT25lIHBhcmFtZXRlciBjb250cm9scyB0aGUgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2Q6CisgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyICdlbGVtJyAod2l0aCBpdHMgY29tcG9uZW50cyAnYWlkJyBhbmQKKyAgICogJ2lpZCcpIHVuaXF1ZWx5IGlkZW50aWZpZXMKKyAgICogYW4gaW5zdGFuY2Ugd2l0aGluIHRoZSBPRFMgc3RvcmFnZS4gSWYgbm8gc3VjaCBpbnN0YW5jZSBleGlzdHMsIG9yCisgICAqIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QKKyAgICogYW4gaW5zdGFuY2Ugb2YgYW4gYXBwbGljYXRpb24gZWxlbWVudCBkZXJpdmVkIGZyb20gQW9GaWxlLCB0aGUKKyAgICogZXhjZXB0aW9uCisgICAqIEFPX0lOVkFMSURfQkFTRVRZUEUgaXMgdGhyb3duLgorICAgKiAKKyAgICogTm90ZSB0aGF0IGFuIE9EUyBzZXJ2ZXIgbWF5IGJlIHNldCB1cCB0byBzdXBwb3J0IHRoZSBPRFMgc2VjdXJpdHkKKyAgICogY29uY2VwdHMgYW5kIHRoYXQgaW4KKyAgICogc3VjaCBjYXNlIGFjY2VzcyB0byBhIGZpbGUgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBhY2Nlc3MgcmlnaHRzIG9mCisgICAqIHRoZSBhY2Nlc3NpbmcgdXNlciBhcmUKKyAgICogc3VmZmljaWVudC4gSWYgdGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCBSRUFEIHJpZ2h0cyBmb3IgdGhlCisgICAqIGluc3RhbmNlIHNwZWNpZmllZCBieQorICAgKiAnZWxlbScgYW4gZXhjZXB0aW9uIEFPX0FDQ0VTU19ERU5JRUQgd2lsbCBiZSB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0lOVkFMSURfQkFTRVRZUEUKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKgorICAgKiBAcGFyYW0gIGVsZW0gIFRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgZmlsZSBiZWxvbmdzLCB3aG9zZSBhY2Nlc3MKKyAgICogICAgICAgICAgICAgICBpcyBpbnRlbmRlZC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIE9EU0ZpbGUgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGUgZGVzaXJlZCBmaWxlLgorICAgKi8KKyAgIE9EU0ZpbGUgZ2V0T0RTRmlsZSgKKyAgICAgIGluIEVsZW1JZCBlbGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBBcHBsRWxlbUFjY2Vzcy4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBxdWVyeSBldmFsdWF0b3IgaW50ZXJmYWNlIGFsbG93cyB0byBwZXJmb3JtIHF1ZXJpZXMgaW4KKyogc3luY2hyb25vdXMgbW9kZSBhbmQgdG8gY3JlYXRlIFF1ZXJ5IG9iamVjdHMgZm9yIGFzeW5jaHJvbm91cworKiBleGVjdXRpb24uCisqLworaW50ZXJmYWNlIFF1ZXJ5RXZhbHVhdG9yIHsKKworICAgLyoqICgyNTAwMCkKKyAgICogRXZhbHVhdGUgYSBxdWVyeSBpbiBzeW5jaHJvbm91cyBtb2RlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fUVVFUllfVFlQRV9JTlZBTElECisgICAqICAgIEFPX1FVRVJZX0lOVkFMSUQKKyAgICogICAgQU9fUVVFUllfUFJPQ0VTU0lOR19FUlJPUgorICAgKiAgICBBT19RVUVSWV9USU1FT1VUX0VYQ0VFREVECisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBxdWVyeVN0ciAgVGhlIHF1ZXJ5IHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtICBwYXJhbXMgIFNlcXVlbmNlIG9mIHBhcmFtZXRlciBuYW1lcyBhbmQgdmFsdWVzLiBUaGUKKyAgICogICAgICAgICAgICAgICAgIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHNob3VsZCBiZSBwYXNzZWQ6CisgICAqICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAgIE5hbWU6ICJNYXhEdXJhdGlvbiI7IAorICAgKiAgICAgICAgICAgICAgICAgVHlwZTogVF9MT05HCisgICAqICAgICAgICAgICAgICAgICBDb21tZW50OiBDYW4gYmUgdXNlZCB0byByZXN0cmljdCB0aGUgcHJvY2Vzc2luZworICAgKiAgICAgICAgICAgICAgICAgdGltZS4gVGhlIHRpbWUgaXMgZ2l2ZW4gaW4gIG1pbGxpc2Vjb25kcywKKyAgICogICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWU6IDAgKG5vIHJlc3RyaWN0aW9uKQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVzdWx0IG9mIHRoZSBxdWVyeSBhcyBhbiBpbnN0YW5jZSBlbGVtZW50IGl0ZXJhdG9yLgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudEl0ZXJhdG9yIGdldEluc3RhbmNlcygKKyAgICAgIGluIFRfU1RSSU5HIHF1ZXJ5U3RyLAorICAgICAgaW4gTmFtZVZhbHVlU2VxdWVuY2UgcGFyYW1zKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjUwMDEpCisgICAqIEV2YWx1YXRlIGEgcXVlcnkgaW4gc3luY2hyb25vdXMgbW9kZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX1FVRVJZX1RZUEVfSU5WQUxJRAorICAgKiAgICBBT19RVUVSWV9JTlZBTElECisgICAqICAgIEFPX1FVRVJZX1BST0NFU1NJTkdfRVJST1IKKyAgICogICAgQU9fUVVFUllfVElNRU9VVF9FWENFRURFRAorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgcXVlcnlTdHIgIFRoZSBxdWVyeSBzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSAgcGFyYW1zICBTZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHZhbHVlcy4gVGhlCisgICAqICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgcGFyYW1ldGVycyBzaG91bGQgYmUgcGFzc2VkOgorICAgKiAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICBOYW1lOiAiTWF4RHVyYXRpb24iOyAKKyAgICogICAgICAgICAgICAgICAgIFR5cGU6IFRfTE9ORworICAgKiAgICAgICAgICAgICAgICAgQ29tbWVudDogQ2FuIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHByb2Nlc3NpbmcKKyAgICogICAgICAgICAgICAgICAgIHRpbWUuIFRoZSB0aW1lIGlzIGdpdmVuIGluICBtaWxsaXNlY29uZHMsCisgICAqICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiAwIChubyByZXN0cmljdGlvbikKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlc3VsdCBvZiB0aGUgcXVlcnkgYXMgYSBuYW1lIHZhbHVlIHVuaXQgc2VxdWVuY2UKKyAgICogICAgICAgICAgaXRlcmF0b3IuIEVhY2ggbmFtZSB2YWx1ZSB1bml0IHR1cGxlIGlzIG9uZSBjZWxsIG9mIHRoZQorICAgKiAgICAgICAgICB0YWJsZS4gVGhlIG5hbWUgdmFsdWUgdW5pdCBzZXF1ZW5jZSBpcyBvbmUgcm93IG9mIHRoZQorICAgKiAgICAgICAgICB0YWJsZS4KKyAgICovCisgICBOYW1lVmFsdWVVbml0U2VxdWVuY2VJdGVyYXRvciBnZXRUYWJsZVJvd3MoCisgICAgICBpbiBUX1NUUklORyBxdWVyeVN0ciwKKyAgICAgIGluIE5hbWVWYWx1ZVNlcXVlbmNlIHBhcmFtcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI1MDAyKQorICAgKiBFdmFsdWF0ZSBhIHF1ZXJ5IGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19RVUVSWV9UWVBFX0lOVkFMSUQKKyAgICogICAgQU9fUVVFUllfSU5WQUxJRAorICAgKiAgICBBT19RVUVSWV9QUk9DRVNTSU5HX0VSUk9SCisgICAqICAgIEFPX1FVRVJZX1RJTUVPVVRfRVhDRUVERUQKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHF1ZXJ5U3RyICBUaGUgcXVlcnkgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gIHBhcmFtcyAgU2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzIGFuZCB2YWx1ZXMuIFRoZQorICAgKiAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHBhc3NlZDoKKyAgICogICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgTmFtZTogIk1heER1cmF0aW9uIjsgCisgICAqICAgICAgICAgICAgICAgICBUeXBlOiBUX0xPTkcKKyAgICogICAgICAgICAgICAgICAgIENvbW1lbnQ6IENhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSBwcm9jZXNzaW5nCisgICAqICAgICAgICAgICAgICAgICB0aW1lLiBUaGUgdGltZSBpcyBnaXZlbiBpbiAgbWlsbGlzZWNvbmRzLAorICAgKiAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZTogMCAobm8gcmVzdHJpY3Rpb24pCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXN1bHQgb2YgdGhlIHF1ZXJ5IGFzIGEgbmFtZSB2YWx1ZSBzZXF1ZW5jZSB1bml0CisgICAqICAgICAgICAgIHNlcXVlbmNlLiBFYWNoIG5hbWUgdmFsdWUgc2VxdWVuY2UgdW5pdCB0dXBsZSBpcyBvbmUgY29sdW1uCisgICAqICAgICAgICAgIG9mIHRoZSB0YWJsZS4gVGhlIG5hbWUgdmFsdWUgc2VxdWVuY2UgdW5pdCBzZXF1ZW5jZSBpcyAgdGhlCisgICAqICAgICAgICAgIHRhYmxlLiBUaGUgcmVzdWx0IHN0cnVjdHVyZSBjYW4gYmUgdmVyeSBodWdlLgorICAgKi8KKyAgIE5hbWVWYWx1ZVNlcVVuaXRTZXF1ZW5jZSBnZXRUYWJsZSgKKyAgICAgIGluIFRfU1RSSU5HIHF1ZXJ5U3RyLAorICAgICAgaW4gTmFtZVZhbHVlU2VxdWVuY2UgcGFyYW1zKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjUwMDMpCisgICAqIENyZWF0ZSBhIHF1ZXJ5IG9iamVjdCB0byBleGVjdXRlIGl0IGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fUVVFUllfVFlQRV9JTlZBTElECisgICAqICAgIEFPX1FVRVJZX0lOVkFMSUQKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHF1ZXJ5U3RyICBUaGUgcXVlcnkgc3RyaW5nCisgICAqCisgICAqIEBwYXJhbSAgcGFyYW1zICBTZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHZhbHVlcy4gVGhlCisgICAqICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgcGFyYW1ldGVycyBzaG91bGQgYmUgcGFzc2VkOgorICAgKiAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICBOYW1lOiAiUXVlcnlSZXN1bHRUeXBlIjsgCisgICAqICAgICAgICAgICAgICAgICBUeXBlOiBSZXN1bHRUeXBlLgorICAgKiAgICAgICAgICAgICAgICAgQ29tbWVudDogU3BlY2lmaWVzIHdoYXQga2luZCBvZiByZXN1bHQgaXMgZXhwZWN0ZWQKKyAgICogICAgICAgICAgICAgICAgIGJ5IHRoZSBjbGllbnQuCisgICAqICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiBJTlNURUxFTV9JVEVSQVRPUl9BU19SRVNVTFQKKyAgICogICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgTmFtZTogIk1heER1cmF0aW9uIjsgCisgICAqICAgICAgICAgICAgICAgICBUeXBlOiBUX0xPTkcKKyAgICogICAgICAgICAgICAgICAgIENvbW1lbnQ6IENhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSBwcm9jZXNzaW5nCisgICAqICAgICAgICAgICAgICAgICB0aW1lLiBUaGUgdGltZSBpcyBnaXZlbiBpbiAgbWlsbGlzZWNvbmRzLAorICAgKiAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZTogMCAobm8gcmVzdHJpY3Rpb24pCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBxdWVyeSBvYmplY3QuCisgICAqLworICAgUXVlcnkgY3JlYXRlUXVlcnkoCisgICAgICBpbiBUX1NUUklORyBxdWVyeVN0ciwKKyAgICAgIGluIE5hbWVWYWx1ZVNlcXVlbmNlIHBhcmFtcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgUXVlcnlFdmFsdWF0b3IuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgaW50ZXJmYWNlIFF1ZXJ5LgorKi8KK2ludGVyZmFjZSBRdWVyeSB7CisKKyAgIC8qKiAoMjYwMDApCisgICAqIEdldCB0aGUgUXVlcnlFdmFsdWF0b3Igb2JqZWN0IHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHF1ZXJ5LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgUXVlcnlFdmFsdWF0b3Igb2JqZWN0IHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzCisgICAqICAgICAgICAgIHF1ZXJ5LgorICAgKi8KKyAgIFF1ZXJ5RXZhbHVhdG9yIGdldFF1ZXJ5RXZhbHVhdG9yKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI2MDAxKQorICAgKiBEbyB0aGUgcXVlcnkgcHJlLXByb2Nlc3NpbmcgKG9wdGltaXphdGlvbiwgZXRjLikgIENhbGwgY2FuIGJlCisgICAqIG9taXR0ZWQgYnkgdGhlIGNsaWVudC4gSW4gdGhpcyBjYXNlIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGV4ZWN1dGVkIG9uCisgICAqIHRoZSBjYWxsIG9mIGV4ZWN1dGVRdWVyeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fUVVFUllfUFJPQ0VTU0lOR19FUlJPUgorICAgKiAgICBBT19RVUVSWV9JTlZBTElEX1JFU1VMVFRZUEUKKyAgICoKKyAgICogQHBhcmFtICBwYXJhbXMgIFNlcXVlbmNlIG9mIHBhcmFtZXRlciBuYW1lcyBhbmQgdmFsdWVzLiBUaGUKKyAgICogICAgICAgICAgICAgICAgIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHNob3VsZCBiZSBwYXNzZWQ6CisgICAqICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAgIE5hbWU6ICJRdWVyeVJlc3VsdFR5cGUiOyAKKyAgICogICAgICAgICAgICAgICAgIFR5cGU6IFJlc3VsdFR5cGUuCisgICAqICAgICAgICAgICAgICAgICBDb21tZW50OiBTcGVjaWZpZXMgd2hhdCBraW5kIG9mIHJlc3VsdCBpcyBleHBlY3RlZAorICAgKiAgICAgICAgICAgICAgICAgYnkgdGhlIGNsaWVudCwgdGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgaWYgdGhlCisgICAqICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzbid0IGdpdmVuIGF0IHRoZSBtZXRob2QgY3JlYXRlUXVlcnkgb2YKKyAgICogICAgICAgICAgICAgICAgIHRoZSBpbnRlcmZhY2UgUXVlcnlFdmFsdWF0b3IuCisgICAqICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiBJTlNURUxFTV9JVEVSQVRPUl9BU19SRVNVTFQKKyAgICovCisgICB2b2lkIHByZXBhcmVRdWVyeSgKKyAgICAgIGluIE5hbWVWYWx1ZVNlcXVlbmNlIHBhcmFtcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI2MDAyKQorICAgKiBFeGVjdXRlIHF1ZXJ5IGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19RVUVSWV9QUk9DRVNTSU5HX0VSUk9SCisgICAqICAgIEFPX1FVRVJZX0lOVkFMSURfUkVTVUxUVFlQRQorICAgKgorICAgKiBAcGFyYW0gIHBhcmFtcyAgU2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzIGFuZCB2YWx1ZXMuIFRoZQorICAgKiAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHBhcmFtZXRlciBzaG91bGQgYmUgcGFzc2VkOgorICAgKiAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICBOYW1lOiAiUXVlcnlSZXN1bHRUeXBlIjsgCisgICAqICAgICAgICAgICAgICAgICBUeXBlOiBSZXN1bHRUeXBlLgorICAgKiAgICAgICAgICAgICAgICAgQ29tbWVudDogU3BlY2lmaWVzIHdoYXQga2luZCBvZiByZXN1bHQgaXMgZXhwZWN0ZWQKKyAgICogICAgICAgICAgICAgICAgIGJ5IHRoZSBjbGllbnQsIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGlmIHRoZQorICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpc24ndCBnaXZlbiBhdCB0aGUgbWV0aG9kIHByZXBhcmVRdWVyeSBvcgorICAgKiAgICAgICAgICAgICAgICAgdGhlIG1ldGhvZCBjcmVhdGVRdWVyeSBvZiB0aGUgaW50ZXJmYWNlCisgICAqICAgICAgICAgICAgICAgICBRdWVyeUV2YWx1YXRvci4KKyAgICogICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWU6IElOU1RFTEVNX0lURVJBVE9SX0FTX1JFU1VMVAorICAgKiAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICBOYW1lOiAiU3luY2hyb25vdXMiOworICAgKiAgICAgICAgICAgICAgICAgVHlwZTogVF9CT09MRUFOCisgICAqICAgICAgICAgICAgICAgICBDb21tZW50OiBJbiBjYXNlIG9mICJ0cnVlIiBndWFyYW50ZWVzIHN5bmNocm9ub3VzCisgICAqICAgICAgICAgICAgICAgICBleGVjdXRpb24uCisgICAqICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiAiZmFsc2UiCisgICAqLworICAgdm9pZCBleGVjdXRlUXVlcnkoCisgICAgICBpbiBOYW1lVmFsdWVTZXF1ZW5jZSBwYXJhbXMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNjAwMykKKyAgICogUmV0dXJuIHF1ZXJ5IHN0YXR1cy4KKyAgICogCisgICAqIFJldHVybnMgSU5DT01QTEVURSBpZiB0aGUgcXVlcnkgaXMgc3RpbGwgZXhlY3V0aW5nLgorICAgKiAKKyAgICogUmV0dXJucyBDT01QTEVURSBpZiB0aGUgcXVlcnkgZmluaXNoZWQgZXhlY3V0aW9uIG9yIGlmIHRoZSBxdWVyeQorICAgKiBleGVjdXRpb24gc3RvcHBlZCBiZWNhdXNlIG9mIGFuIGVycm9yIG9yIGJlY2F1c2UgdGhlIHRpbWVvdXQgd2FzCisgICAqIGV4Y2VlZGVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc3RhdHVzIG9mIHRoZSBxdWVyeS4KKyAgICovCisgICBRdWVyeVN0YXR1cyBnZXRTdGF0dXMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjYwMDQpCisgICAqIEdldCB0aGUgcXVlcnkgcmVzdWx0LiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlCisgICAqIHF1ZXJ5IGhhcyBiZWVuIGV4ZWN1dGVkLiBJdCByZXR1cm5zIGFuIGl0ZXJhdG9yIG9uIHRoZSBpbnN0YW5jZXMKKyAgICogdGhhdCB3ZXJlIGZvdW5kIGJ5IHRoZSBxdWVyeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fUVVFUllfUFJPQ0VTU0lOR19FUlJPUgorICAgKiAgICBBT19RVUVSWV9USU1FT1VUX0VYQ0VFREVECisgICAqICAgIEFPX1FVRVJZX0lOQ09NUExFVEUKKyAgICogICAgQU9fUVVFUllfSU5WQUxJRF9SRVNVTFRUWVBFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXN1bHQgb2YgdGhlIHF1ZXJ5IGFzIGFuIGluc3RhbmNlIGVsZW1lbnQgaXRlcmF0b3IuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3IgZ2V0SW5zdGFuY2VzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI2MDA1KQorICAgKiBHZXQgdGhlIHF1ZXJ5IHJlc3VsdC4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZQorICAgKiBxdWVyeSBoYXMgYmVlbiBleGVjdXRlZC4gSXQgcmV0dXJucyBhbiBpdGVyYXRvciBvbiB0aGUgbmFtZSB2YWx1ZQorICAgKiB1bml0IHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19RVUVSWV9QUk9DRVNTSU5HX0VSUk9SCisgICAqICAgIEFPX1FVRVJZX1RJTUVPVVRfRVhDRUVERUQKKyAgICogICAgQU9fUVVFUllfSU5DT01QTEVURQorICAgKiAgICBBT19RVUVSWV9JTlZBTElEX1JFU1VMVFRZUEUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlc3VsdCBvZiB0aGUgcXVlcnkgYXMgYSBuYW1lIHZhbHVlIHVuaXQgc2VxdWVuY2UKKyAgICogICAgICAgICAgaXRlcmF0b3IuIEVhY2ggbmFtZSB2YWx1ZSB1bml0IHR1cGxlIGlzIG9uZSBjZWxsIG9mIHRoZQorICAgKiAgICAgICAgICB0YWJsZS4gVGhlIG5hbWUgdmFsdWUgdW5pdCBzZXF1ZW5jZSBpcyBvbmUgcm93IG9mIHRoZQorICAgKiAgICAgICAgICB0YWJsZS4KKyAgICovCisgICBOYW1lVmFsdWVVbml0U2VxdWVuY2VJdGVyYXRvciBnZXRUYWJsZVJvd3MoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjYwMDYpCisgICAqIEdldCB0aGUgcXVlcnkgcmVzdWx0LiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlCisgICAqIHF1ZXJ5IGhhcyBiZWVuIGV4ZWN1dGVkLiBJdCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gc3RydWN0dXJlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19RVUVSWV9QUk9DRVNTSU5HX0VSUk9SCisgICAqICAgIEFPX1FVRVJZX1RJTUVPVVRfRVhDRUVERUQKKyAgICogICAgQU9fUVVFUllfSU5DT01QTEVURQorICAgKiAgICBBT19RVUVSWV9JTlZBTElEX1JFU1VMVFRZUEUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlc3VsdCBvZiB0aGUgcXVlcnkgYXMgYSBuYW1lIHZhbHVlIHNlcXVlbmNlIHVuaXQKKyAgICogICAgICAgICAgc2VxdWVuY2UuIEVhY2ggbmFtZSB2YWx1ZSBzZXF1ZW5jZSB1bml0IHR1cGxlIGlzIG9uZSBjb2x1bW4KKyAgICogICAgICAgICAgb2YgdGhlIHRhYmxlLiBUaGUgbmFtZSB2YWx1ZSBzZXF1ZW5jZSB1bml0IHNlcXVlbmNlIGlzICB0aGUKKyAgICogICAgICAgICAgdGFibGUuIFRoZSByZXN1bHQgc3RydWN0dXJlIGNhbiBiZSB2ZXJ5IGh1Z2UuCisgICAqLworICAgTmFtZVZhbHVlU2VxVW5pdFNlcXVlbmNlIGdldFRhYmxlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgUXVlcnkuCisKKy8qKgorKiBUaGUgbmFtZSB2YWx1ZSB1bml0IHNlcXVlbmNlIGl0ZXJhdG9yLiBUaGUgdGFibGUgaXRlcmF0b3IgYXMgcXVlcnkKKyogcmVzdWx0LgorKi8KK2ludGVyZmFjZSBOYW1lVmFsdWVVbml0U2VxdWVuY2VJdGVyYXRvciB7CisKKyAgIC8qKiAoMjcwMDEpCisgICAqIERlc3Ryb3kgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIG1lbW9yeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBkZXN0cm95KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI3MDAyKQorICAgKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqLworICAgVF9MT05HIGdldENvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI3MDAzKQorICAgKiBHZXQgdGhlIG5leHQgbiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBob3dfbWFueSAgVGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IG4gdmFsdWVzIG9mIHRoZSBuYW1lLXZhbHVlLXVuaXQgIHNlcXVlbmNlLiBGb3IKKyAgICogICAgICAgICAgZWFjaCBOYW1lVmFsdVVuaXQgdGhlIG5leHQgbiB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgdmFsdWUKKyAgICogICAgICAgICAgc2VxdWVuY2UuCisgICAqLworICAgTmFtZVZhbHVlU2VxVW5pdFNlcXVlbmNlIG5leHROKAorICAgICAgaW4gVF9MT05HIGhvd19tYW55KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjcwMDQpCisgICAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbmFtZS12YWx1ZS11bml0IHR1cGxlIHNlcXVlbmNlIGZyb20gdGhlCisgICAqICAgICAgICAgIG5hbWUtdmFsdWUtdW5pdCB0dXBsZS4KKyAgICovCisgICBOYW1lVmFsdWVTZXFVbml0IG5leHRPbmUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjcwMDUpCisgICAqIFJlc2V0IHRoZSBwb2ludGVyIGluIHRoZSBlbGVtZW50IGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIHJlc2V0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgTmFtZVZhbHVlVW5pdFNlcXVlbmNlSXRlcmF0b3IuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgZW51bWVyYXRpb24gaW50ZXJmYWNlLgorKi8KK2ludGVyZmFjZSBFbnVtZXJhdGlvbkRlZmluaXRpb24geworCisgICAvKiogKDI4MDAwKQorICAgKiBMaXN0IHRoZSBwb3NzaWJsZSBuYW1lcyBvZiB0aGUgZW51bWVyYXRpb24uIFRoZSBzb3J0IG9yZGVyIG9mIHRoZQorICAgKiBsaXN0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbS4gVGhlIGZpcnN0IGl0ZW0gaGFzIHRoZSB2YWx1ZSB6ZXJvLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBMaXN0IHdpdGggYWxsIHBvc3NpYmxlIG5hbWVzIG9mIHRoZSBlbnVtZXJhdGlvbiBpdGVtcy4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdEl0ZW1OYW1lcygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyODAwMSkKKyAgICogR2V0IHRoZSB2YWx1ZSBvZiBhbiBpdGVtLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICoKKyAgICogQHBhcmFtICBpdGVtTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGl0ZW0uCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgdGhlIGl0ZW0uCisgICAqLworICAgVF9MT05HIGdldEl0ZW0oCisgICAgICBpbiBUX1NUUklORyBpdGVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI4MDAyKQorICAgKiBHZXQgdGhlIG5hbWUgb2YgYW4gaXRlbS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqCisgICAqIEBwYXJhbSAgaXRlbSAgVGhlIHZhbHVlIG9mIHRoZSBpdGVtLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgaXRlbS4KKyAgICovCisgICBUX1NUUklORyBnZXRJdGVtTmFtZSgKKyAgICAgIGluIFRfTE9ORyBpdGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjgwMDMpCisgICAqIEFkZCBhIG5ldyBpdGVtIHRvIHRoZSBlbnVtZXJhdGlvbi4gVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlCisgICAqIGFwcGxpY2F0aW9uIG1vZGVsIGFuZCBpcyBvbmx5IGFsbG93ZWQgZm9yIHRoZSBzdXBlciB1c2VyLgorICAgKiAKKyAgICogVGhlIG5hbWUgb2YgYW4gaXRlbSBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbmFtZSBsZW5ndGggb2YgdGhlCisgICAqIHVuZGVybHlpbmcgcGh5c2ljYWwgc3RvcmFnZS4gQ3VycmVudCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIHJlc3RyaWN0CisgICAqIGl0IHRvIDEyOCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fRFVQTElDQVRFX05BTUUKKyAgICogICAgQU9fRFVQTElDQVRFX1ZBTFVFCisgICAqCisgICAqIEBwYXJhbSAgaXRlbU5hbWUgIFRoZSBuYW1lIG9mIHRoZSBuZXcgaXRlbS4KKyAgICovCisgICB2b2lkIGFkZEl0ZW0oCisgICAgICBpbiBUX1NUUklORyBpdGVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI4MDA0KQorICAgKiBSZW5hbWUgdGhlIGl0ZW0gb2YgdGhlIGVudW1lcmF0aW9uLiBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUKKyAgICogYXBwbGljYXRpb24gbW9kZWwgYW5kIGlzIG9ubHkgYWxsb3dlZCBmb3IgdGhlIHN1cGVyIHVzZXIuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqCisgICAqIEBwYXJhbSAgb2xkSXRlbU5hbWUgIFRoZSBleGlzdGluZyBuYW1lIG9mIHRoZSBpdGVtLgorICAgKgorICAgKiBAcGFyYW0gIG5ld0l0ZW1OYW1lICB0aGUgbmV3IG5hbWUgb2YgdGhlIGl0ZW0uCisgICAqLworICAgdm9pZCByZW5hbWVJdGVtKAorICAgICAgaW4gVF9TVFJJTkcgb2xkSXRlbU5hbWUsCisgICAgICBpbiBUX1NUUklORyBuZXdJdGVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI4MDA1KQorICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBOYW1lIG9mIHRoZSBlbnVtZXJhdGlvbi4KKyAgICovCisgICBUX1NUUklORyBnZXROYW1lKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI4MDA2KQorICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0aW9uLiBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUKKyAgICogYXBwbGljYXRpb24gbW9kZWwgYW5kIGlzIG9ubHkgYWxsb3dlZCBmb3IgdGhlIHN1cGVyIHVzZXIuCisgICAqIAorICAgKiBUaGUgbmFtZSBvZiBhbiBlbnVtZXJhdGlvbiBkZWZpbml0aW9uIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bQorICAgKiBuYW1lIGxlbmd0aCBvZiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBzdG9yYWdlLiBDdXJyZW50IHNlcnZlcgorICAgKiBpbXBsZW1lbnRhdGlvbnMgcmVzdHJpY3QgaXQgdG8gMzAgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqCisgICAqIEBwYXJhbSAgZW51bU5hbWUgIE5hbWUgb2YgdGhlIGVudW1lcmF0aW9uLgorICAgKi8KKyAgIHZvaWQgc2V0TmFtZSgKKyAgICAgIGluIFRfU1RSSU5HIGVudW1OYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjgwMDcpCisgICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIGVudW1lcmF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgaW5kZXggb2YgdGhlIGVudW1lcmF0aW9uLgorICAgKi8KKyAgIFRfTE9ORyBnZXRJbmRleCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEVudW1lcmF0aW9uRGVmaW5pdGlvbi4KKworLyoqCisqIEZvciBpdGVyYXRpb24gdGhyb3VnaCB0aGUgcmVzdWx0IGVsZW1lbnRzLCB0aGVyZSBpcyBhbHNvIGEgbmV3IGl0ZXJhdG9yCisqIG5lY2Vzc2FyeSBjYWxsZWQgRWxlbVJlc3VsdFNldEV4dFNlcUl0ZXJhdG9yLiBJdJJzIGZ1bmN0aW9uYWxpdHkgaXMKKyogc3RpbGwgdGhlIHNhbWUgYXMgYWxsIG90aGVyIGl0ZXJhdG9ycyBhbmQgbmVlZHMgdGhlcmVmb3JlIG5vIGZ1cnRoZXIKKyogZXhwbGFuYXRpb24uCisqIFRoZXJlIGlzIG9ubHkgb25lIGRpZmZlcmVuY2UgdG8gdGhlIG90aGVyIGl0ZXJhdGlvbnMuIFRoZSBpdGVyYXRpb24gaXMKKyogZG9uZSBvbiB0aGUgbG93ZXN0IGxldmVsIGluIHRoYXQgY2FzZSBvbiB0aGUgVFNfVW5pb25TZXEuCisqLworaW50ZXJmYWNlIEVsZW1SZXN1bHRTZXRFeHRTZXFJdGVyYXRvciB7CisKKyAgIC8qKiAoMjkwMDApCisgICAqIERlc3Ryb3kgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIG1lbW9yeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBkZXN0cm95KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI5MDAxKQorICAgKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqLworICAgVF9MT05HIGdldENvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI5MDAyKQorICAgKiBHZXQgdGhlIG5leHQgbiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaG93X21hbnkgIFRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIGVsZW1lbnRzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBuIGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSB0aGUgZWxlbWVudCByZXN1bHQgc2V0CisgICAqICAgICAgICAgIHNlcXVlbmNlLgorICAgKi8KKyAgIEVsZW1SZXN1bHRTZXRFeHRTZXF1ZW5jZSBuZXh0TigKKyAgICAgIGluIFRfTE9ORyBob3dfbWFueSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI5MDAzKQorICAgKiBHZXQgdGhlIG5leHQgIGVsZW1lbnQgZnJvbSB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gdGhlIGVsZW1lbnQgcmVzdWx0IHNldAorICAgKiAgICAgICAgICBzZXF1ZW5jZS4KKyAgICovCisgICBFbGVtUmVzdWx0U2V0RXh0IG5leHRPbmUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjkwMDQpCisgICAqIFJlc2V0IHRoZSBwb2ludGVyIGluIHRoZSBlbGVtZW50IHNlcXVlbmNlIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIHJlc2V0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgRWxlbVJlc3VsdFNldEV4dFNlcUl0ZXJhdG9yLgorCisvKioKKyogVGhlIGludGVyZmFjZSBPRFNGaWxlIGV4dGVuZHMgdGhlIGludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQuIFRodXMgYWxsCisqIG1ldGhvZHMgb2YgdGhlIGludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQgZG8gYWxzbyB3b3JrIGhlcmUuIAorKiAKKyogT0RTRmlsZSBhbGxvd3MgdG8gY3JlYXRlIGEgZmlsZSB0aGF0IGlzIHVuZGVyIGNvbnRyb2wgb2YgdGhlIE9EUyBzZXJ2ZXIKKyogKGEgJ21hbmFnZWQgZmlsZScpLiBPRFNGaWxlIGZ1cnRoZXJtb3JlIGFsbG93cyByZWFkLCB3cml0ZSwgYXBwZW5kIG9yCisqIHJlbW92ZSBvcGVyYXRpb25zIHRvIGEgbWFuYWdlZCBmaWxlLgorKiAKKyogR2VuZXJhbCBpbmZvcm1hdGlvbiBvZiB0aGUgZmlsZSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhpcyBpbnRlcmZhY2UgYXMKKyogd2VsbC4gTm90ZSwgdGhhdCBubyByYW5kb20gYWNjZXNzIG9uIGEgZmlsZSBpcyBwcm92aWRlZDsgb25seSBhCisqIHNlcXVlbnRpYWwgcmVhZCBhbmQgYSB3cml0ZSBieSBhcHBlbmRpbmcgYXQgdGhlIGVuZCBpcyBwb3NzaWJsZS4KKyogCisqIFJlcGxhY2luZyBhbiBleGlzdGluZyBmaWxlIGJ5IGEgbmV3IG9uZSByZXF1aXJlcyB0byBmaXJzdCByZW1vdmUgdGhlCisqIG9sZCBvbmUgYW5kIHRoZW4gY3JlYXRlIHRoZSBuZXcgb25lLgorKi8KK2ludGVyZmFjZSBPRFNGaWxlIDogSW5zdGFuY2VFbGVtZW50IHsKKworICAgLyoqICgzMDAwMCkKKyAgICogR2V0IHRoZSBPRFNXcml0ZVRyYW5zZmVyIGludGVyZmFjZSBmb3IgdGhlIGZpbGUsIHRvIGFsbG93IGFwcGVuZGluZworICAgKiBmdXJ0aGVyIGJ5dGVzIHRvIHRoZSBmaWxlLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgT0RTV3JpdGVUcmFuc2ZlciBpbnRlcmZhY2UgZm9yIHRoZSBmaWxlCisgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QuIFRoYXQgaW50ZXJmYWNlIGFsbG93cyB0byB3cml0ZQorICAgKiBzZXF1ZW50aWFsbHkgdG8gdGhlIGZpbGUsIGJlZ2lubmluZyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50bHkKKyAgICogZXhpc3RpbmcgZmlsZS4KKyAgICogQmVmb3JlIHJldHVybmluZyB0aGUgaW50ZXJmYWNlIE9EU1dyaXRlVHJhbnNmZXIsIHRoZSBwaHlzaWNhbCBmaWxlCisgICAqIHdpbGwgYmUgb3BlbmVkIGZvciBzdWJzZXF1ZW50IHdyaXRlIG9wZXJhdGlvbnMuCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBjdXJyZW50IHVzZXIgaGFzIG5vIFVQREFURSByaWdodCBmb3IgdGhlIGluc3RhbmNlIChyZXNwLgorICAgKiBmb3IgYWxsIG9mIGl0cyBhdHRyaWJ1dGVzIGluIGNhc2Ugb2YgYXR0cmlidXRlIHNlY3VyaXR5KSBmcm9tIHdoaWNoCisgICAqIHRoaXMgT0RTRmlsZSBvYmplY3Qgd2FzIGNyZWF0ZWQsIHRoZSBleGNlcHRpb24gQU9fQUNDRVNTX0RFTklFRCB3aWxsCisgICAqIGJlIHRocm93bi4KKyAgICogCisgICAqIEluIGNhc2UgdGhlIHBoeXNpY2FsIGZpbGUgcmVmZXJlbmNlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0IGNhbm5vdAorICAgKiBiZSBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duLgorICAgKiAKKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgaXMKKyAgICogY3VycmVudGx5IG9wZW5lZCBieSBhbiBPRFNSZWFkVHJhbnNmZXIgb3IgYW4gT0RTV3JpdGVUcmFuc2ZlcgorICAgKiBvYmplY3QsIHRoZSBleGNlcHRpb24gQU9fRklMRV9MT0NLRUQgd2lsbCBiZSB0aHJvd24uCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19TWVNURU1fUFJPQkxFTSB3aWxsIGJlIHRocm93bi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0ZJTEVfTE9DS0VECisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgT0RTV3JpdGVUcmFuc2ZlciBpbnRlcmZhY2UgdG8gYXBwZW5kIHRvIHRoZSBmaWxlLgorICAgKi8KKyAgIE9EU1dyaXRlVHJhbnNmZXIgYXBwZW5kKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDAxKQorICAgKiBDaGVjayB3aGV0aGVyIHRoZSBmaWxlIG1heSBiZSBvcGVuZWQgZm9yIHJlYWRpbmcuCisgICAqIAorICAgKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzIE9EU0ZpbGUKKyAgICogb2JqZWN0IG1heSBiZSBvcGVuZWQgYnkgdGhlIE9EUyBzZXJ2ZXIgZm9yIHJlYWRpbmcgYWNjZXNzLgorICAgKiAKKyAgICogVGhlIG1ldGhvZCByZXR1cm5zIGEgYm9vbGVhbiBUUlVFIGluIGNhc2UgdGhlIGZpbGUgbWF5IGJlIG9wZW5lZCBmb3IKKyAgICogcmVhZGluZywgYW5kIGEgYm9vbGVhbiBGQUxTRSBpbiBjYXNlIGl0IGNhbm5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmcKKyAgICogb3IgaXQgaXMgYWxyZWFkeSBvcGVuZWQgZm9yIHdyaXRlIGFjY2VzcyAoaS5lLiBhbiBPRFNXcml0ZVRyYW5zZmVyCisgICAqIG9iamVjdCBmb3IgdGhpcyBmaWxlIGV4aXN0cykuCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBwaHlzaWNhbCBmaWxlIHJlZmVyZW5jZWQgYnkgdGhpcyBPRFNGaWxlIG9iamVjdCBjYW5ub3QKKyAgICogYmUgZm91bmQsIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBJbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIHRoZSBmaWxlIGNhbiBiZSBvcGVuZWQgZm9yCisgICAqICAgICAgICAgIHJlYWRpbmcKKyAgICovCisgICBUX0JPT0xFQU4gY2FuUmVhZCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwMikKKyAgICogQ2hlY2sgd2hldGhlciB0aGUgZmlsZSBtYXkgYmUgb3BlbmVkIGZvciB3cml0aW5nLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgY2hlY2tzIHdoZXRoZXIgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBPRFNGaWxlCisgICAqIG9iamVjdCBtYXkgYmUgb3BlbmVkIGJ5IHRoZSBPRFMgc2VydmVyIGZvciB3cml0aW5nIGFjY2Vzcy4KKyAgICogCisgICAqIFRoZSBtZXRob2QgcmV0dXJucyBhIGJvb2xlYW4gVFJVRSBpbiBjYXNlIHRoZSB1c2VyIGhhcyBhcHByb3ByaWF0ZQorICAgKiByaWdodHMgYW5kIHRoZSBmaWxlIGNhbiBiZSBvcGVuZWQgZm9yIHdyaXRpbmcsIGFuZCBhIGJvb2xlYW4gRkFMU0UKKyAgICogaW4gY2FzZSBpdCBpcyBhbHJlYWR5IG9wZW5lZCBmb3Igd3JpdGUgYWNjZXNzIChpLmUuIGFuCisgICAqIE9EU1dyaXRlVHJhbnNmZXIgb2JqZWN0IGZvciB0aGlzIGZpbGUgZXhpc3RzKSBvciBmb3IgcmVhZCBhY2Nlc3MKKyAgICogKGkuZS4gb25lIG9yIG1vcmUgT0RTUmVhZFRyYW5zZmVyIG9iamVjdHMgZm9yIHRoaXMgZmlsZSBleGlzdCkuCisgICAqIAorICAgKiBJbiBjYXNlIGFvX2xvY2F0aW9uIGlzIGRlZmluZWQgYW5kIHRoZSBjdXJyZW50IHVzZXIgaGFzIG5vIFVQREFURQorICAgKiByaWdodCBmb3IgdGhlIGluc3RhbmNlIGZyb20gd2hpY2ggdGhpcyBPRFNGaWxlIG9iamVjdCB3YXMgY3JlYXRlZCwgYQorICAgKiBib29sZWFuIEZBTFNFIHdpbGwgYmUgcmV0dXJuZWQuCisgICAqIAorICAgKiBJbiBjYXNlIGFvX2xvY2F0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIGN1cnJlbnQgdXNlciBoYXMgbm8gSU5TRVJUCisgICAqIHJpZ2h0IGZvciB0aGUgaW5zdGFuY2UgZnJvbSB3aGljaCB0aGlzIE9EU0ZpbGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBhCisgICAqIGJvb2xlYW4gRkFMU0Ugd2lsbCBiZSByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIEluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgdGhlIGZpbGUgY2FuIGJlIG9wZW5lZCBmb3IKKyAgICogICAgICAgICAgd3JpdGluZworICAgKi8KKyAgIFRfQk9PTEVBTiBjYW5Xcml0ZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwMykKKyAgICogQ3JlYXRlIGEgbmV3IGZpbGUgYXQgdGhlIE9EUyBzZXJ2ZXIgYW5kIGdldCB0aGUgT0RTV3JpdGVUcmFuc2ZlcgorICAgKiBpbnRlcmZhY2UgZm9yIHRoYXQgZmlsZSwgdG8gYWxsb3cgc3RvcmluZyBieXRlcyB0byB0aGUgZmlsZS4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIE9EU1dyaXRlVHJhbnNmZXIgaW50ZXJmYWNlIGZvciB0aGUgZmlsZQorICAgKiByZXByZXNlbnRlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0LiBUaGF0IGludGVyZmFjZSBhbGxvd3MgdG8gd3JpdGUKKyAgICogc2VxdWVudGlhbGx5IHRvIHRoZSAoaW5pdGlhbGx5IGVtcHR5KSBmaWxlLiAKKyAgICogCisgICAqIEJlZm9yZSByZXR1cm5pbmcgdGhlIGludGVyZmFjZSBPRFNXcml0ZVRyYW5zZmVyLCB0aGUgcGh5c2ljYWwgZmlsZQorICAgKiB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIE9EUyBzZXJ2ZXIgYW5kIG9wZW5lZCBmb3Igc3Vic2VxdWVudCB3cml0ZQorICAgKiBvcGVyYXRpb25zLiBUaGUgZmlsZSBuYW1lIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgT0RTIHNlcnZlciBhbmQgc2V0CisgICAqIGFzIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgZGVyaXZlZCBmcm9tIHRoZSBiYXNlIGF0dHJpYnV0ZQorICAgKiAnYW9fbG9jYXRpb24nIG9mIHRoZSBpbnN0YW5jZSBmcm9tIHdoaWNoIHRoaXMgT0RTRmlsZSBvYmplY3Qgd2FzCisgICAqIGNyZWF0ZWQuCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBjdXJyZW50IHVzZXIgaGFzIG5vIElOU0VSVCByaWdodCBmb3IgdGhlIGluc3RhbmNlIGZyb20KKyAgICogd2hpY2ggdGhpcyBPRFNGaWxlIG9iamVjdCB3YXMgY3JlYXRlZCwgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19BQ0NFU1NfREVOSUVEIHdpbGwgYmUgdGhyb3duLgorICAgKiAKKyAgICogSWYgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20gJ2FvX2xvY2F0aW9uJyBvZiB0aGUgaW5zdGFuY2UgZnJvbQorICAgKiB3aGljaCB0aGlzIE9EU0ZpbGUgb2JqZWN0IHdhcyBjcmVhdGVkIGFscmVhZHkgaGFzIGEgdmFsdWUsIHRoZQorICAgKiBpbnN0YW5jZSBwb3RlbnRpYWxseSBhbHJlYWR5IHJlZmVyZW5jZXMgYSBmaWxlIHdoaWNoIHdhcyBub3QgeWV0CisgICAqIHJlbW92ZWQsIGFuZCB0aGUgc2VydmVyIHdpbGwgY2hlY2sgd2hldGhlciB0aGF0IGZvcm1lciBmaWxlIHN0aWxsCisgICAqIGV4aXN0cy4gSWYgc28gdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duIGFuZCBubworICAgKiBuZXcgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19TWVNURU1fUFJPQkxFTSB3aWxsIGJlIHRocm93bi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgT0RTV3JpdGVUcmFuc2ZlciBpbnRlcmZhY2UgdG8gYSBuZXcgZmlsZS4KKyAgICovCisgICBPRFNXcml0ZVRyYW5zZmVyIGNyZWF0ZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwNCkKKyAgICogQ2hlY2sgd2hldGhlciB0aGUgZmlsZSBwaHlzaWNhbGx5IGV4aXN0cyBhdCB0aGUgT0RTIHNlcnZlci4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgT0RTRmlsZQorICAgKiBvYmplY3QgdHJ1bHkgZXhpc3RzIGF0IHRoZSBleHBlY3RlZCBsb2NhdGlvbiAoZS5nLiBvbiBhIHNwZWNpZmljCisgICAqIGRyaXZlL2RpcmVjdG9yeSkgd2l0aGluIHJlYWNoIG9mICB0aGUgT0RTIHNlcnZlci4KKyAgICogCisgICAqIFRoZSBtZXRob2QgcmV0dXJucyBhIGJvb2xlYW4gVFJVRSBpbiBjYXNlIHRoZSBmaWxlIGV4aXN0cywgYW5kIGEKKyAgICogYm9vbGVhbiBGQUxTRSBpbiBjYXNlIGl0IGRvZXMgbm90IGV4aXN0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgSW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciB0aGUgZmlsZSBleGlzdHMuCisgICAqLworICAgVF9CT09MRUFOIGV4aXN0cygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwNSkKKyAgICogR2V0IHRoZSBkYXRlIG9mIHRoZSBmaWxlLgorICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBkYXRlIG9mIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgT0RTRmlsZQorICAgKiBvYmplY3QuIFRoZSByZXR1cm5lZCBzdHJpbmcgZm9sbG93cyB0aGUgcnVsZXMgZm9yIE9EUyBkYXRlIGFuZCB0aW1lCisgICAqIHNwZWNpZmljYXRpb24gc3RyaW5ncy4KKyAgICogVGhlIGRhdGUgcmV0dXJuZWQgc2hhbGwgc3BlY2lmeSB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXRlc3QgY2hhbmdlCisgICAqIG9mIHRoZSBmaWxlLiBJdCBpcyB0aGUgaW5mb3JtYXRpb24gdGhlIG9wZXJhdGluZyBzeXN0ZW0gb2YgdGhlIE9EUworICAgKiBzZXJ2ZXIgcHJvdmlkZXM7IGlmIHRoZXJlIGlzIG5vIGRhdGUgYXZhaWxhYmxlIGZyb20gdGhlIG9wZXJhdGluZworICAgKiBzeXN0ZW0gd2l0aCBleGFjdGx5IHRoaXMgbWVhbmluZywgdGhlIE9EUyBzZXJ2ZXIgc2hhbGwgcmV0dXJuIHRoZQorICAgKiBjbG9zZXN0IGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgY2Fubm90CisgICAqIGJlIGZvdW5kLCB0aGUgZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZSBwaHlzaWNhbCBmaWxlIHJlZmVyZW5jZWQgYnkgdGhpcyBPRFNGaWxlIG9iamVjdCBpcworICAgKiBjdXJyZW50bHkgb3BlbmVkIGJ5IGFuIE9EU1dyaXRlVHJhbnNmZXIgb2JqZWN0IG9mIGFub3RoZXIgc2Vzc2lvbiwKKyAgICogdGhlIGV4Y2VwdGlvbiBBT19GSUxFX0xPQ0tFRCB3aWxsIGJlIHRocm93bi4KKyAgICogSW4gY2FzZSB0aGVyZSBpcyBubyBmaWxlIGRlZmluZWQgYnkgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20KKyAgICogJ2FvX2xvY2F0aW9uJywgdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKiAgICBBT19GSUxFX0xPQ0tFRAorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZGF0ZSBvZiBsYXN0IGNoYW5nZSBvZiB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzCisgICAqICAgICAgICAgIE9EU0ZpbGUgb2JqZWN0LgorICAgKi8KKyAgIFRfREFURSBnZXREYXRlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDA2KQorICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGZpbGUuCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBPRFNGaWxlCisgICAqIG9iamVjdC4gCisgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBzaGFsbCBzcGVjaWZ5IHRoZSBleGFjdCBmaWxlIHNpemUgaW4gYnl0ZXMuIEl0IGlzCisgICAqIHRoZSBpbmZvcm1hdGlvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvZiB0aGUgT0RTIHNlcnZlciBwcm92aWRlcy4KKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgY2Fubm90CisgICAqIGJlIGZvdW5kLCB0aGUgZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZXJlIGlzIG5vIGZpbGUgZGVmaW5lZCBieSB0aGUgYXR0cmlidXRlIGRlcml2ZWQgZnJvbQorICAgKiAnYW9fbG9jYXRpb24nLCB0aGUgZXhjZXB0aW9uIEFPX0JBRF9PUEVSQVRJT04gd2lsbCBiZSB0aHJvd24uCisgICAqIEluIGNhc2UgdGhlIHBoeXNpY2FsIGZpbGUgcmVmZXJlbmNlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0IGlzCisgICAqIGN1cnJlbnRseSBvcGVuZWQgYnkgYW4gT0RTV3JpdGVUcmFuc2ZlciBvYmplY3Qgb2YgYW5vdGhlciBzZXNzaW9uLAorICAgKiB0aGUgZXhjZXB0aW9uIEFPX0ZJTEVfTE9DS0VEIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fRklMRV9MT0NLRUQKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzIE9EU0ZpbGUKKyAgICogICAgICAgICAgb2JqZWN0LgorICAgKi8KKyAgIFRfTE9OR0xPTkcgZ2V0U2l6ZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwNykKKyAgICogUmVtb3ZlIGEgZmlsZSBmcm9tIHRoZSBPRFMgc2VydmVyLgorICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgZnJvbQorICAgKiB0aGUgT0RTIHNlcnZlciBpZiB0aGUgdXNlciBoYXMgYXBwcm9wcmlhdGUgcmlnaHRzLiBUaGUgYXR0cmlidXRlCisgICAqIGRlcml2ZWQgZnJvbSB0aGUgYmFzZSBhdHRyaWJ1dGUgJ2FvX2xvY2F0aW9uJyBvZiB0aGUgaW5zdGFuY2UgZnJvbQorICAgKiB3aGljaCB0aGlzIE9EU0ZpbGUgb2JqZWN0IHdhcyBjcmVhdGVkIHdpbGwgYmVjb21lIHVuZGVmaW5lZCBhbmQKKyAgICogYW9fc2l6ZSB3aWxsIGJlIHNldCB0byAwLgorICAgKiBJbiBjYXNlIHRoZSBjdXJyZW50IHVzZXIgaGFzIG5vIERFTEVURSByaWdodCBmb3IgdGhlIGluc3RhbmNlIGZyb20KKyAgICogd2hpY2ggdGhpcyBPRFNGaWxlIG9iamVjdCB3YXMgY3JlYXRlZCwgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19BQ0NFU1NfREVOSUVEIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZSBmaWxlIGlzIGN1cnJlbnRseSBvcGVuZWQgZm9yIHdyaXRlIGFjY2VzcyAoaS5lLiBhbgorICAgKiBPRFNXcml0ZVRyYW5zZmVyIG9iamVjdCBmb3IgdGhpcyBmaWxlIGV4aXN0cykgb3IgZm9yIHJlYWQgYWNjZXNzCisgICAqIChpLmUuIG9uZSBvciBtb3JlIE9EU1JlYWRUcmFuc2ZlciBvYmplY3RzIGZvciB0aGlzIGZpbGUgZXhpc3QpIGFuCisgICAqIGV4Y2VwdGlvbiBBT19GSUxFX0xPQ0tFRCB3aWxsIGJlIHRocm93bi4KKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgZG9lcyBub3QKKyAgICogZXhpc3QsIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gd2l0aG91dCBhbnkgZnVydGhlciBmaWxlIGFjdGlvbjsgaXQKKyAgICogd2lsbCBzZXQgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20gdGhlIGJhc2UgYXR0cmlidXRlICdhb19sb2NhdGlvbicKKyAgICogdG8gdW5kZWZpbmVkIGFuZCAnYW9fc2l6ZScgdG8gMDsgaXQgd2lsbCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIHRvCisgICAqIHNpZ25hbCB0aGUgbm9uLWV4aXN0ZW5jZSBvZiB0aGUgZmlsZS4KKyAgICogSW4gY2FzZSB0aGUgZmlsZSBjYW5ub3QgYmUgcGh5c2ljYWxseSBkZWxldGVkIGZyb20gaXRzIGxvY2F0aW9uLCB0aGUKKyAgICogZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fRklMRV9MT0NLRUQKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKi8KKyAgIHZvaWQgcmVtb3ZlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDA4KQorICAgKiBHZXQgdGhlIE9EU1JlYWRUcmFuc2ZlciBpbnRlcmZhY2UgZm9yIHRoZSBmaWxlLgorICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBPRFNSZWFkVHJhbnNmZXIgaW50ZXJmYWNlIGZvciB0aGUgZmlsZQorICAgKiByZXByZXNlbnRlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0LiBUaGF0IGludGVyZmFjZSBhbGxvd3MgdG8gcmVhZAorICAgKiBzZXF1ZW50aWFsbHkgZnJvbSB0aGUgZmlsZSwgZWl0aGVyIHN0YXJ0aW5nIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvcgorICAgKiBhdCBhIHVzZXItc3BlY2lmaWVkIGJ5dGUgbG9jYXRpb24gd2l0aGluIHRoZSBmaWxlLgorICAgKiBCZWZvcmUgcmV0dXJuaW5nIHRoZSBpbnRlcmZhY2UgT0RTUmVhZFRyYW5zZmVyLCB0aGUgcGh5c2ljYWwgZmlsZQorICAgKiB3aWxsIGJlIG9wZW5lZCBmb3IgcmVhZGluZy4KKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgaXMKKyAgICogY3VycmVudGx5IG9wZW5lZCBieSBhbiBPRFNXcml0ZVRyYW5zZmVyIG9iamVjdCwgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19GSUxFX0xPQ0tFRCB3aWxsIGJlIHRocm93bi4KKyAgICogSW4gY2FzZSB0aGVyZSBpcyBubyBmaWxlIGRlZmluZWQgYnkgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20KKyAgICogJ2FvX2xvY2F0aW9uJywgdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZSBhdHRyaWJ1dGUgZGVyaXZlZCBmcm9tICdhb19sb2NhdGlvbicgaXMgZGVmaW5lZCBidXQgdGhlCisgICAqIHBoeXNpY2FsIGZpbGUgcmVmZXJlbmNlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0IGNhbm5vdCBiZSBmb3VuZCBvcgorICAgKiBjYW5ub3QgYmUgb3BlbmVkIGZvciByZWFkaW5nLCB0aGUgZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwKKyAgICogYmUgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fRklMRV9MT0NLRUQKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgT0RTUmVhZFRyYW5zZmVyIGludGVyZmFjZSB0byByZWFkIGZyb20gdGhlIGZpbGUuCisgICAqLworICAgT0RTUmVhZFRyYW5zZmVyIHJlYWQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAwMDkpCisgICAqIFB1dCBhIGZpbGUgdGhhdCBpcyBhbHJlYWR5IHJlc2lkaW5nIHdpdGhpbiByZWFjaCBvZiB0aGUgT0RTIHNlcnZlcgorICAgKiB1bmRlciBjb250cm9sIG9mIHRoZSBPRFMgc2VydmVyLgorICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdG8gcHV0IGZpbGVzIHVuZGVyIGNvbnRyb2wgb2YgdGhlIE9EUyBzZXJ2ZXIKKyAgICogKG1ha2UgdGhlbSBhICdtYW5hZ2VkIGZpbGUnKSB3aXRob3V0IHRoZSBuZWVkIHRvIHN0cmVhbSB0aGVpciBieXRlcworICAgKiB0aHJvdWdoIHRoZSBPRFNXcml0ZVRyYW5zZmVyIGludGVyZmFjZS4KKyAgICogVGhlIHBhcmFtZXRlciAnc291cmNlVXJsJyBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRoYXQKKyAgICogc2hhbGwgYmVjb21lIGEgbWFuYWdlZCBmaWxlLiBUaGlzIGxvY2F0aW9uIG11c3QgcmVmZXJlbmNlIGEgZmlsZQorICAgKiB3aGljaCBpcyBhY2Nlc3NpYmxlIGJ5IHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgd2lsbCBtb3ZlIHRoZSBmaWxlIHRvCisgICAqIGEgbG9jYXRpb24gd2hlcmUgbWFuYWdlZCBmaWxlcyByZXNpZGUgYW5kIGdpdmUgaXQgYSBuYW1lIG9mIGl0cyBvd24KKyAgICogY2hvaWNlOyB0aGUgZmlsZSB3aWxsIG5vIGxvbmdlciBleGlzdCBhdCBpdHMgcHJldmlvdXMgbG9jYXRpb24uIFRoZQorICAgKiBzZXJ2ZXIgd2lsbCBzdG9yZSBmaWxlIG5hbWUgYW5kIGxvY2F0aW9uIGluIHRoZSBhdHRyaWJ1dGUgZGVyaXZlZAorICAgKiBmcm9tICdhb19sb2NhdGlvbicgYW5kIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBmaWxlIGluIHRoZSBhdHRyaWJ1dGUKKyAgICogZGVyaXZlZCBmcm9tICdhb19zaXplJy4KKyAgICogVGhlIHN0cmluZyB2YWx1ZSBvZiAnc291cmNlVXJsJyBtdXN0IGNvbXBseSB0byB0aGUgVVJMIHNwZWNpZmljYXRpb24KKyAgICogZ2l2ZW4gaW4gUkZDIDIzOTYgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdCBBU0FNIE9EUyBvbmx5IHN1cHBvcnRzCisgICAqIGFic29sdXRlIFVSTHMgd2l0aCB0aGUgYWNjZXNzIHNjaGVtZSAiZmlsZToiLCBvdGhlcndpc2UgdGhlCisgICAqIGV4Y2VwdGlvbiBBT19CQURfUEFSQU1FVEVSICB3aWxsIGJlIHRocm93bi4KKyAgICogSW4gY2FzZSB0aGVyZSBpcyBubyBmaWxlIGRlZmluZWQgYnkgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20KKyAgICogJ2FvX2xvY2F0aW9uJywgdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZSBmaWxlIGNhbm5vdCBiZSBwaHlzaWNhbGx5IG1vdmVkIGZyb20gaXRzIG9yaWdpbmFsCisgICAqIGxvY2F0aW9uIHRvIGEgc2VydmVyLWxvY2F0aW9uIHdoZXJlIG1hbmFnZWQgZmlsZXMgcmVzaWRlLCB0aGUKKyAgICogZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwgYmUgdGhyb3duIChlLmcuIGlmIHRoZSBmaWxlCisgICAqIHNwZWNpZmllZCBieSAnc291cmNlVXJsJyBkb2VzIG5vdCBleGlzdCwgb3IgaWYgaXQgY2Fubm90IGJlCisgICAqIHBoeXNpY2FsbHkgbW92ZWQsIGV0Yy4pLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19CQURfT1BFUkFUSU9OCisgICAqICAgIEFPX1NZU1RFTV9QUk9CTEVNCisgICAqCisgICAqIEBwYXJhbSAgc291cmNlVXJsICBGaWxlbmFtZSBVUkwgb2YgdGhlIGZpbGUgdG8gdGFrZSB1bmRlciBjb250cm9sIGFzCisgICAqICAgICAgICAgICAgICAgICAgICBhIG1hbmFnZWQgZmlsZS4KKyAgICovCisgICB2b2lkIHRha2VVbmRlckNvbnRyb2woCisgICAgICBpbiBUX1NUUklORyBzb3VyY2VVcmwpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAxMCkKKyAgICogUmVtb3ZlIGEgZmlsZSB0aGF0IGlzIGN1cnJlbnRseSB1bmRlciBjb250cm9sIG9mIHRoZSBPRFMgc2VydmVyIG91dAorICAgKiBvZiBjb250cm9sIG9mIHRoZSBzZXJ2ZXIgYW5kIG1vdmUgaXQgdG8gYSBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aGluCisgICAqIHJlYWNoIG9mIHRoZSBzZXJ2ZXIuCisgICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0byB0YWtlIGZpbGVzIG91dCBvZiBjb250cm9sIG9mIHRoZSBPRFMgc2VydmVyCisgICAqIGFuZCBwbGFjZSB0aGVtIGF0IGEgc3BlY2lmaWVkIGxvY2F0aW9uLCB3aXRob3V0IHRoZSBuZWVkIHRvIHN0cmVhbQorICAgKiB0aGVpciBieXRlcyB0aHJvdWdoIHRoZSBPRFNSZWFkVHJhbnNmZXIgaW50ZXJmYWNlLgorICAgKiBUaGUgcGFyYW1ldGVyICd0YXJnZXRVcmwnIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gdG8gd2hpY2ggdGhlCisgICAqIGN1cnJlbnRseSBtYW5hZ2VkIGZpbGUgc2hhbGwgYmUgbW92ZWQuIFRoaXMgbG9jYXRpb24gbXVzdCBiZQorICAgKiBhY2Nlc3NpYmxlIGJ5IHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgd2lsbCBtb3ZlIHRoZSBmaWxlIGZyb20gdGhlCisgICAqIGxvY2F0aW9uIHdoZXJlIG1hbmFnZWQgZmlsZXMgcmVzaWRlIHRvIHRoZSBsb2NhdGlvbiBnaXZlbiBieQorICAgKiAndGFyZ2V0VXJsJzsgdGhlIGZpbGUgd2lsbCBubyBsb25nZXIgZXhpc3QgYXQgaXRzIHByZXZpb3VzIGxvY2F0aW9uLgorICAgKiBUaGUgc2VydmVyIHdpbGwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGRlcml2ZWQgZnJvbQorICAgKiAnYW9fbG9jYXRpb24nIHRvIHVuZGVmaW5lZCBhbmQgb2YgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20KKyAgICogJ2FvX3NpemUnIHRvIDAuCisgICAqIFRoZSBzdHJpbmcgdmFsdWUgb2YgJ3RhcmdldFVybCcgbXVzdCBjb21wbHkgdG8gdGhlIFVSTCBzcGVjaWZpY2F0aW9uCisgICAqIGdpdmVuIGluIFJGQyAyMzk2IHdpdGggdGhlIHJlc3RyaWN0aW9uIHRoYXQgQVNBTSBPRFMgb25seSBzdXBwb3J0cworICAgKiBhYnNvbHV0ZSBVUkxzIHdpdGggdGhlIGFjY2VzcyBzY2hlbWUgImZpbGU6Ijsgb3RoZXJ3aXNlIHRoZQorICAgKiBleGNlcHRpb24gQU9fQkFEX1BBUkFNRVRFUiAgd2lsbCBiZSB0aHJvd24uCisgICAqIEluIGNhc2UgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5ICd0YXJnZXRVcmwnIGFscmVhZHkgZXhpc3RzIHRoZQorICAgKiBleGNlcHRpb24gQU9fQkFEX1BBUkFNRVRFUiB3aWxsIGJlIHRocm93biBhbmQgbm8gYWN0aW9uIHdpbGwgYmUKKyAgICogcGVyZm9ybWVkIGJ5IHRoaXMgbWV0aG9kLgorICAgKiBJbiBjYXNlIHRoZSBmaWxlIHNwZWNpZmllZCBieSAndGFyZ2V0VXJsJyBjYW5ub3QgYmUgcGh5c2ljYWxseSBtb3ZlZAorICAgKiB0byB0aGUgaW50ZW5kZWQgbG9jYXRpb24sIHRoZSBleGNlcHRpb24gQU9fU1lTVEVNX1BST0JMRU0gd2lsbCBiZQorICAgKiB0aHJvd24gYW5kIG5vIGFjdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBieSB0aGlzIG1ldGhvZC4KKyAgICogSW4gY2FzZSB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgaXMgY3VycmVudGx5CisgICAqIG9wZW5lZCBmb3Igd3JpdGUgYWNjZXNzIChpLmUuIGFuIE9EU1dyaXRlVHJhbnNmZXIgb2JqZWN0IGZvciB0aGlzCisgICAqIGZpbGUgZXhpc3RzKSBvciBmb3IgcmVhZCBhY2Nlc3MgKGkuZS4gb25lIG9yIG1vcmUgT0RTUmVhZFRyYW5zZmVyCisgICAqIG9iamVjdHMgZm9yIHRoaXMgZmlsZSBleGlzdCkgYW4gZXhjZXB0aW9uIEFPX0ZJTEVfTE9DS0VEIHdpbGwgYmUKKyAgICogdGhyb3duIGFuZCBubyBhY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQgYnkgdGhpcyBtZXRob2QuCisgICAqIEluIGNhc2UgdGhlcmUgaXMgbm8gZmlsZSBkZWZpbmVkIGJ5IHRoZSBhdHRyaWJ1dGUgZGVyaXZlZCBmcm9tCisgICAqICdhb19sb2NhdGlvbicsIHRoZSBleGNlcHRpb24gQU9fQkFEX09QRVJBVElPTiB3aWxsIGJlIHRocm93bi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fRklMRV9MT0NLRUQKKyAgICogICAgQU9fU1lTVEVNX1BST0JMRU0KKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqCisgICAqIEBwYXJhbSAgdGFyZ2V0VXJsICBGaWxlbmFtZSBVUkwgb2YgdGhlIGZpbGUgd2hlcmUgdG8gbW92ZSB0aGUKKyAgICogICAgICAgICAgICAgICAgICAgIG1hbmFnZWQgZmlsZS4KKyAgICovCisgICB2b2lkIHJlbW92ZUZyb21Db250cm9sKAorICAgICAgaW4gVF9TVFJJTkcgdGFyZ2V0VXJsKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBPRFNGaWxlLgorCisvKioKKyogVGhlIGludGVyZmFjZSB3aGljaCBhbGxvd3MgYSByZWFkIHRyYW5zZmVyIChmcm9tIHRoZSBPRFMgc2VydmVyIHRvIGEKKyogY2xpZW50KSBvZiB0aGUgY29udGVudCBvZiBhIGZpbGUgdGhhdCBpcyB1bmRlciBjb250cm9sIG9mIHRoZSBPRFMKKyogc2VydmVyLgorKi8KK2ludGVyZmFjZSBPRFNSZWFkVHJhbnNmZXIgeworCisgICBjb25zdCBUX0xPTkcgUkVBREFMTCA9IC0xOyAvLyBSZWFkIGFsbCBieXRlcyBvZiB0aGUgZmlsZS4KKworICAgLyoqICgzMTAwMCkKKyAgICogQ2xvc2UgdGhpcyBPRFNSZWFkVHJhbnNmZXIgaW50ZXJmYWNlLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgY2xvc2VzIHRoZSBmaWxlIG9uIHRoZSBPRFMgc2VydmVyJ3MgZmlsZSBzeXN0ZW0gYW5kCisgICAqIGRlc3Ryb3lzIHRoaXMgT0RTUmVhZFRyYW5zZmVyIG9iamVjdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBjbG9zZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMTAwMSkKKyAgICogUmVhZCBhIHNlcXVlbmNlIG9mIGJ5dGVzIGZyb20gdGhlIGZpbGUuCisgICAqIFRoaXMgbWV0aG9kIHJlYWRzIHRoZSBmaWxlIGF0IHRoZSBPRFMgc2VydmVyIHJlZmVyZW5jZWQgYnkgdGhpcworICAgKiBPRFNSZWFkVHJhbnNmZXIgYW5kIHJldHVybnMgYSBzZXF1ZW5jZSBvZiBieXRlcyBmcm9tIHRoYXQgZmlsZS4KKyAgICogCisgICAqIFRoZSBwYXJhbWV0ZXIgJ21heE9jdGV0cycgY29udHJvbHMgdGhlIHJldHVybiBiZWhhdmlvciBvZiB0aGUgT0RTCisgICAqIHNlcnZlci4gSWYgdGhlIGZpbGUgY29udGFpbnMgbW9yZSBieXRlcyB0aGFuIGFyZSBnaXZlbiBieQorICAgKiAnbWF4T2N0ZXRzJywgb25seSAnbWF4T2N0ZXRzJyBieXRlcyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBmaXJzdAorICAgKiBtZXRob2QgaW52b2NhdGlvbi4gQSBzdWJzZXF1ZW50IG1ldGhvZCBpbnZvY2F0aW9uIHdpbGwgcmV0dXJuIHRoZQorICAgKiBuZXh0ICdtYXhPY3RldHMnIGJ5dGVzIGZyb20gdGhlIGZpbGUsIGV0Yy4sIHVudGlsIHRoZSBjb21wbGV0ZSBmaWxlCisgICAqIGNvbnRlbnRzIGhhcyBiZWVuIHJldHVybmVkLiBGdXJ0aGVyIG1ldGhvZCBpbnZvY2F0aW9ucyByZXR1cm4gYW4KKyAgICogZW1wdHkgc2VxdWVuY2UuCisgICAqIAorICAgKiBJZiAnbWF4T2N0ZXRzJyBpcyBnaXZlbiB3aXRoIGEgZXF1YWwgdG8gdGhlIGNvbnN0YW50IFJFQURBTEwoLTEpLAorICAgKiB0aGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBhbmQgdGhlIGNvbXBsZXRlCisgICAqIGZpbGUgY29udGVudHMgd2lsbCBiZSByZXR1cm5lZCB3aXRoIG9ubHkgb25lIG1ldGhvZCBpbnZvY2F0aW9uLgorICAgKiAKKyAgICogTm90ZSB0aGF0IG9ubHkgYSBzZXF1ZW50aWFsIHJlYWRpbmcsIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBieXRlIG9mCisgICAqIHRoZSBmaWxlLCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBpbnRlcmZhY2UuIElmIHByZXZpb3VzIHBhcnRzIG9mIHRoZQorICAgKiBmaWxlIG5lZWQgdG8gYmUgYWNjZXNzZWQgYWdhaW4sIHRoZSBjdXJyZW50IE9EU1JlYWRUcmFuc2ZlciBvYmplY3QKKyAgICogbXVzdCBiZSBjbG9zZWQgYW5kIGEgbmV3IG9uZSBtdXN0IGJlIGluc3RhbnRpYXRlZC4KKyAgICogCisgICAqIEluIGNhc2UgdGhlIHBhcmFtZXRlciAnbWF4T2N0ZXRzJyBpcyBuZWdhdGl2ZSBvdGhlciB0aGVuIHRoZQorICAgKiBjb25zdGFudCBSRUFEQUxMIHRoZSBleGNlcHRpb24gQU9fQkFEX1BBUkFNRVRFUiBpcyB0aHJvd24uCisgICAqIAorICAgKiBJbiBjYXNlIHRoZXJlIGlzIGFueSBwcm9ibGVtIHJlYWRpbmcgdGhlIGZpbGUsIHRoZSBleGNlcHRpb24KKyAgICogQU9fU1lTVEVNX1BST0JMRU0gaXMgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fU1lTVEVNX1BST0JMRU0KKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKgorICAgKiBAcGFyYW0gIG1heE9jdGV0cyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJldHVybmVkIGJ5IG9uZQorICAgKiAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGwuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IChhdCBtb3N0ICdtYXhPY3RldHMnKSBieXRlcyBpbiB0aGUgZmlsZS4KKyAgICovCisgICBTX0JZVEUgZ2V0T2N0ZXRTZXEoCisgICAgICBpbiBUX0xPTkcgbWF4T2N0ZXRzKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzEwMDIpCisgICAqIFNraXAgYSBudW1iZXIgb2YgYnl0ZXMgd2hpbGUgcmVhZGluZyB0aGUgZmlsZS4KKyAgICogVGhpcyBtZXRob2QgbW92ZXMgdGhlIHJlYWQgcG9pbnRlciBpbiB0aGUgZmlsZSBhIG51bWJlciBvZiBieXRlcworICAgKiBhaGVhZCwgc3RhcnRpbmcgYXQgaXRzIGN1cnJlbnQgcG9zaXRpb247IGl0IHdpbGwgbm90IHJldHVybiB0aG9zZQorICAgKiBieXRlcy4gVGhlIHBhcmFtZXRlciAnbnVtT2N0ZXRzJyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0bworICAgKiBza2lwLgorICAgKiAKKyAgICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSB0cnVlIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgc2tpcHBlZC4gVGhpcworICAgKiBtYXkgZGlmZmVyIGZyb20gJ251bU9jdGV0cycgZS5nLiBpZiB0aGUgZW5kIG9mIHRoZSBmaWxlIHdhcyByZWFjaGVkLgorICAgKiBJZiB0aGUgcmVhZCBwb2ludGVyIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW55IGZ1cnRoZXIKKyAgICogbWV0aG9kIGludm9jYXRpb25zIHdpbGwgcmV0dXJuIGEgdmFsdWUgb2YgMCBmb3IgJ251bVNraXBwZWQnLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgbWF5IGJlIGludm9rZWQgc2V2ZXJhbCB0aW1lcyBhbmQgbWF5IGJlIGFyYml0cmFyaWx5CisgICAqIGNvbWJpbmVkIHdpdGggZ2V0T2N0ZXRTZXEoKS4KKyAgICogCisgICAqIE5vdGUgdGhhdCBvbmx5IGEgc2VxdWVudGlhbCByZWFkaW5nLCBzdGFydGluZyBhdCB0aGUgZmlyc3QgYnl0ZSBvZgorICAgKiB0aGUgZmlsZSwgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgaW50ZXJmYWNlLiBJZiBwcmV2aW91cyBwYXJ0cyBvZiB0aGUKKyAgICogZmlsZSBuZWVkIHRvIGJlIGFjY2Vzc2VkIGFnYWluLCB0aGUgY3VycmVudCBPRFNSZWFkVHJhbnNmZXIgb2JqZWN0CisgICAqIG11c3QgYmUgY2xvc2VkIGFuZCBhIG5ldyBvbmUgbXVzdCBiZSBpbnN0YW50aWF0ZWQuCisgICAqIAorICAgKiBJZiAnbnVtT2N0ZXRzJyBpcyBnaXZlbiB3aXRoIGEgdmFsdWUgbGVzcyB0aGFuIDAsIHRoZSBtZXRob2Qgd2lsbAorICAgKiB0aHJvdyB0aGUgZXhjZXB0aW9uIEFPX0JBRF9QQVJBTUVURVIgYW5kIHdpbGwgbm90IHBlcmZvcm0gYW55IGZpbGUKKyAgICogYWNjZXNzIG5vciBjaGFuZ2UgdGhlIHJlYWQgcG9pbnRlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICoKKyAgICogQHBhcmFtICBudW1PY3RldHMgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2tpcHBlZC4KKyAgICoKKyAgICogQHJldHVybiAgdGhlIHJlYWwgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQgaW4gdGhlIGZpbGUuCisgICAqLworICAgVF9MT05HTE9ORyBza2lwT2N0ZXRzKAorICAgICAgaW4gVF9MT05HTE9ORyBudW1PY3RldHMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMTAwMykKKyAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHJlYWQgcG9pbnRlciBpbiB0aGUgZmlsZS4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnQgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgZmlsZSBwb2ludGVyLgorICAgKiBUaGUgc3RhcnQgb2YgdGhlIGZpbGUgY29ycmVzcG9uZHMgdG8gYSBwb3NpdGlvbiBvZiAwLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHJlYWQgcG9pbnRlciBpbiB0aGUgZmlsZS4KKyAgICovCisgICBUX0xPTkdMT05HIGdldFBvc2l0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgT0RTUmVhZFRyYW5zZmVyLgorCisvKioKKyogVGhlIGludGVyZmFjZSB3aGljaCBhbGxvd3MgYSB3cml0ZSB0cmFuc2ZlciAoZnJvbSBhIGNsaWVudCB0byB0aGUgT0RTCisqIHNlcnZlcikgb2YgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIHRoYXQgaXMgdW5kZXIgY29udHJvbCBvZiB0aGUgT0RTCisqIHNlcnZlci4KKyovCitpbnRlcmZhY2UgT0RTV3JpdGVUcmFuc2ZlciB7CisKKyAgIC8qKiAoMzIwMDApCisgICAqIENsb3NlIHRoaXMgT0RTV3JpdGVUcmFuc2ZlciBpbnRlcmZhY2UuCisgICAqIFRoaXMgbWV0aG9kIGNsb3NlcyB0aGUgZmlsZSBvbiB0aGUgT0RTIHNlcnZlcidzIGZpbGUgc3lzdGVtOyB0aGVyZWJ5CisgICAqIGFueSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUgYW5kIHN0aWxsIHJlc2lkaW5nIGluIE9EUyBzZXJ2ZXIKKyAgICogY2FjaGUgd2lsbCBiZSBmbHVzaGVkIHRvIHRoZSBmaWxlLiAKKyAgICogVGhlIG1ldGhvZCBmaW5hbGx5IGRlc3Ryb3lzIHRoaXMgT0RTV3JpdGVUcmFuc2ZlciBvYmplY3QgYW5kIGFsc28KKyAgICogdGhlIGNvcnJlc3BvbmRpbmcgQ09SQkEgb2JqZWN0LiBBY2Nlc3MgdG8gc3VjaCBvYmplY3RzIGFmdGVyIGhhdmluZworICAgKiBpbnZva2VkIHRoaXMgY2xvc2UgbWV0aG9kIHdpbGwgbGVhZCB0byBhIENPUkJBIGV4Y2VwdGlvbi4KKyAgICogSW4gY2FzZSB0aGUgZmlsZSBjcmVhdGlvbiBhbmQvb3Igd3JpdGUgb3BlcmF0aW9ucyBoYXZlIGJlZW4KKyAgICogcGVyZm9ybWVkIHdpdGhpbiBhIHRyYW5zYWN0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIG5vdCB5ZXQgc2F2ZSB0aGUKKyAgICogb3BlcmF0aW9ucycgcmVzdWx0cyBwZXJtYW5lbnRseSBhdCB0aGUgcGh5c2ljYWwgZmlsZSBsb2NhdGlvbiBidXQKKyAgICoga2VlcCB0aGVtIGluIGludGVybWVkaWF0ZSBzdG9yYWdlIHVudGlsIHRoZSB0cmFuc2FjdGlvbiBpcworICAgKiBjb21taXR0ZWQuIFRoZSBmaWxlIHdpbGwgYmUgbG9ja2VkIGZvciBhbnkgYWNjZXNzIHRocm91Z2gKKyAgICogT0RTUmVhZFRyYW5zZmVyIG9yIE9EU1dyaXRlVHJhbnNmZXIgd2l0aGluIGFueSBvdGhlciBzZXNzaW9uIHVudGlsCisgICAqIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uLgorICAgKiBBbnkgc3Vic2VxdWVudCByZWFkIHRyYW5zZmVycyBvciB3cml0ZSB0cmFuc2ZlcnMgd2l0aGluIHRoZSBzYW1lCisgICAqIHRyYW5zYWN0aW9uIGFyZSBhbGxvd2VkLCBhbmQgd2lsbCB3b3JrIG9uIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUKKyAgICogZmlsZS4gSW4gY2FzZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIHdpdGhvdXQgYSBwcmVjZWRpbmcgY2xvc2UKKyAgICogb3BlcmF0aW9uIHRoZSBPRFNXcml0ZVRyYW5zZmVyIHdpbGwgYmUgY2xvc2VkIGF1dG9tYXRpY2FsbHkgYnkgdGhlCisgICAqIHNlcnZlci4KKyAgICogSW4gY2FzZSB0aGUgZmlsZSBjcmVhdGlvbiBhbmQvb3Igd3JpdGUgb3BlcmF0aW9ucyBoYXZlIGJlZW4KKyAgICogcGVyZm9ybWVkIG91dHNpZGUgYSB0cmFuc2FjdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBtYWtlIGFsbCBjaGFuZ2VzCisgICAqIHBlcm1hbmVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBjbG9zZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMjAwMSkKKyAgICogV3JpdGUgYSBzZXF1ZW5jZSBvZiBieXRlcyB0byB0aGUgZmlsZS4KKyAgICogVGhpcyBtZXRob2Qgd3JpdGVzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdG8gdGhlIGZpbGUgYXQgdGhlIE9EUyBzZXJ2ZXIKKyAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyBPRFNXcml0ZVRyYW5zZmVyLiAKKyAgICogCisgICAqIFRoZSBwYXJhbWV0ZXIgJ2J1ZmZlcicgY29udGFpbnMgdGhlIGJ5dGUgc2VxdWVuY2UgdGhhdCBpcyB0byBiZQorICAgKiB3cml0dGVuIHRvIHRoZSBmaWxlLiBUaGUgY29udGVudHMgb2YgJ2J1ZmZlcicgd2lsbCBiZSBhcHBlbmRlZCBhdAorICAgKiB0aGUgZW5kIG9mIHRoZSBmaWxlICh3aGljaCBtYXkgYWxzbyBiZSB0aGUgdmVyeSBzdGFydCBvZiB0aGUgZmlsZSBpbgorICAgKiBjYXNlIHRoZSBmaWxlIHdhcyBuZXdseSBjcmVhdGVkKSwgYW5kIHN1YnNlcXVlbnQgbWV0aG9kIGludm9jYXRpb25zCisgICAqIHdpbGwgYWRkIHRoZWlyIGJ5dGVzIGF0IHRoZSB0aGVuIGFjdHVhbCBlbmQgb2YgdGhlIGZpbGUuCisgICAqIAorICAgKiBOb3RlIHRoYXQgb25seSBhIHNlcXVlbnRpYWwgd3JpdGluZyBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBpbnRlcmZhY2UuCisgICAqIElmIHByZXZpb3VzIHBhcnRzIG9mIHRoZSBmaWxlIG5lZWQgdG8gYmUgY2hhbmdlZCwgdGhlIGZpbGUgbXVzdCBiZQorICAgKiByZW1vdmVkIGFuZCBhIG5ldyBvbmUgbXVzdCBiZSBjcmVhdGVkLgorICAgKiAKKyAgICogSW4gY2FzZSB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgZmlsZSBydW5zIG91dCBvZiBtZW1vcnkgb3IgYW55CisgICAqIG90aGVyIG9wZXJhdGluZyBzeXN0ZW0gcHJvYmxlbSBvY2N1cnMgdGhlIE9EUyBzZXJ2ZXIgd2lsbCByZXR1cm4gdGhlCisgICAqIGV4Y2VwdGlvbiBBT19TWVNURU1fUFJPQkxFTS4gSW4gdGhpcyBjYXNlIHRoZSByZXN1bHRzIG9mIHRoZSBhY3R1YWwKKyAgICogcHV0T2N0ZXRTZXEoKSBpbnZvY2F0aW9uIHdpbGwgYmUgdW5kb25lIChubyBieXRlIG9mICdidWZmZXInIGlzCisgICAqIGFkZGVkIHRvIHRoZSBmaWxlKSBhbmQgdGhlIGZpbGUgbWF5IGJlIGNsb3NlZCB3aXRob3V0IGNvbnRhaW5pbmcKKyAgICogJ2J1ZmZlcicgYXQgaXRzIGVuZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcGFyYW0gIGJ1ZmZlciAgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0CisgICAqICAgICAgICAgICAgICAgICBzaGFsbCBiZSB3cml0dGVuIHRvIHRoZSBmaWxlLgorICAgKi8KKyAgIHZvaWQgcHV0T2N0ZWN0U2VxKAorICAgICAgaW4gU19CWVRFIGJ1ZmZlcikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMyMDAyKQorICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlciBpbiB0aGUgZmlsZS4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnQgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlci4KKyAgICogVGhlIHN0YXJ0IG9mIHRoZSBmaWxlIGNvcnJlc3BvbmRzIHRvIGEgcG9zaXRpb24gb2YgMC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSB3cml0ZSBwb2ludGVyIGluIHRoZSBmaWxlLgorICAgKi8KKyAgIFRfTE9OR0xPTkcgZ2V0UG9zaXRpb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBPRFNXcml0ZVRyYW5zZmVyLgorCit9OyAvLyBNb2R1bGUgb2RzLgorCit9OyAvLyBNb2R1bGUgYXNhbS4KKworfTsgLy8gTW9kdWxlIG9yZy4KKworCisjZW5kaWYKKworLyoqCisqIFRoZSBBU0FNIE9EUyBlcnJvciBjb2Rlcy4KKyoKKyogQU9fQUNDRVNTX0RFTklFRAorKiBUaGUgT0RTIHNlcnZlciBkZW5pZWQgdGhlIGFjY2Vzcy4KKyoKKyogQU9fQkFEX09QRVJBVElPTgorKiBBIG1ldGhvZCB3YXMgY2FsbGVkIHdoaWNoIGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuCisqCisqIEFPX0JBRF9QQVJBTUVURVIKKyogQSBwYXJhbWV0ZXIgb2Ygd3JvbmcgdHlwZSBvciB2YWx1ZSB3YXMgcGFzc2VkIHRvIHRoZSBtZXRob2QuIFRoZQorKiBtaW5vckNvZGUgdGVsbHMgd2hpY2ggcGFyYW1ldGVyICgxLCAyLCAzIG9yIDQpIGlzIGJhZC4gSWYgbW9yZSB0aGFuIG9uZQorKiBwYXJhbWV0ZXIgaXMgYmFkLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgcmVwb3J0ZWQuCisqCisqIEFPX0NPTk5FQ1RJT05fTE9TVAorKiBEdWUgdG8gYSBoYXJkd2FyZSBvciBuZXR3b3JrIHNvZnR3YXJlIHByb2JsZW0gdGhlIGNvbm5lY3Rpb24gdG8gdGhlCisqIHNlcnZlciB3YXMgbG9zdC4KKyoKKyogQU9fQ09OTkVDVF9GQUlMRUQKKyogVGhlIGNvbm5lY3QgdG8gYSBzZXJ2ZXIgZmFpbGVkLiBUaGlzIGVycm9yIG1heSBvY2N1ciBpZiB0aGUgc2VydmVyIGlzCisqIGRvd24gb3IgY3VycmVudGx5IHVucmVhY2hhYmxlLgorKgorKiBBT19DT05ORUNUX1JFRlVTRUQKKyogVGhlIGNvbm5lY3Rpb24gd2FzIHJlZnVzZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBlcnJvciBtYXkgb2NjdXIgaWYgdGhlCisqIHByZXNlbnRlZCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBpcyBlaXRoZXIgaW5jb3JyZWN0IG9yIGluY29tcGxldGUuCisqIFRoaXMgZXJyb3Igc2hhbGwgbm90IG9jY3VyIGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgYWNjZXB0IGFueSBtb3JlCisqIHNlc3Npb25zIGR1ZSB0byBvdmVybG9hZCBwcm9ibGVtcy4gU2VlIEFPX1NFU1NJT05fTElNSVRfUkVBQ0hFRCBmb3IKKyogdGhpcyBjYXNlLgorKgorKiBBT19EVVBMSUNBVEVfQkFTRV9BVFRSSUJVVEUKKyogQW55IGFwcGxpY2F0aW9uIGVsZW1lbnQgbWF5IGhhdmUgb25seSBvbmUgYmFzZSBhdHRyaWJ1dGUgb2YgYSBjZXJ0YWluCisqIHR5cGUuIFRoaXMgbWVhbnMgaXQgbWF5IGhhdmUgb25seSBvbmUgYXR0cmlidXRlIG9mIGJhc2UgYXR0cmlidXRlIHR5cGUKKyogTkFNRSwgb25lIElELCBvbmUgVkVSU0lPTiBhbmQgc28gb24uCisqCisqIEFPX0RVUExJQ0FURV9OQU1FCisqIFRoZSBpbXBsaWNpdCBvciBleHBsaWNpdCBzcGVjaWZpZWQgbmFtZSBpcyBhbHJlYWR5IGluIHVzZSBidXQgaXQgaXMKKyogcmVxdWlyZWQgdG8gYmUgdW5pcXVlLgorKgorKiBBT19EVVBMSUNBVEVfVkFMVUUKKyogVGhlIGF0dHJpYnV0ZSBpcyBtYXJrZWQgdW5pcXVlIGluIHRoZSBhcHBsaWNhdGlvbiBtb2RlbC4gVGh1cyBkdXBsaWNhdGUKKyogdmFsdWVzIGFyZSBub3QgYWxsb3dlZC4KKyoKKyogQU9fRklMRV9MT0NLRUQKKyogVGhlIGtpbmQgb2YgYWNjZXNzIHRvIGEgbWFuYWdlZCBmaWxlIHRoYXQgd2FzIHJlcXVlc3RlZCBjYW5ub3QgYmUKKyogZ3JhbnRlZCwgYXMgdGhlIGZpbGUgaXMgY3VycmVudGx5IGluIHVzZSBieSBhbm90aGVyIHJlYWQgb3Igd3JpdGUKKyogdHJhbnNmZXIgdGhyb3VnaCB0aGUgT08tQVBJLgorKgorKiBBT19IQVNfQkFTRV9BVFRSSUJVVEUKKyogQmFzZSBhdHRyaWJ1dGUgZm91bmQuIEl0IGlzIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgZGF0YXR5cGUsIHVuaXF1ZS0KKyogb3Igb2JsaWdhdG9yeSBmbGFnIC4KKyoKKyogQU9fSEFTX0JBU0VfUkVMQVRJT04KKyogQmFzZSByZWxhdGlvbiBmb3VuZC4gSXQgaXMgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSByZWxhdGlvbnR5cGUsCisqIC1yYW5nZSBvciAtc2hpcCBvZiBhbiBhcHBsaWNhdGlvbiByZWxhdGlvbiBkZXJpdmVkIGZyb20gYSBiYXNlCisqIHJlbGF0aW9uLgorKgorKiBBT19IQVNfSU5TVEFOQ0VTCisqIFRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBpbnN0YW5jZXMuCisqCisqIEFPX0hBU19SRUZFUkVOQ0VTCisqIFRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgYmVjYXVzZSB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzCisqIHJlZmVyZW5jZXMuCisqCisqIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyogVGhpcyBlcnJvciBpcyByZXNlcnZlZCBmb3IgdGhlIHJlcG9ydGluZyBvZiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYworKiBwcm9ibGVtcyB0aGF0IGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZCBieSB0aGUgc3RhbmRhcmQgZXJyb3IKKyogZGVmaW5pdGlvbnMuIEFuIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgY3Jhc2ggaWYgdGhpcyBlcnJvciBvY2N1cnMgYnV0CisqIHRoZXJlIGlzIG5vIHdheSB0byByZWFjdCB0byB0aGlzIGVycm9yIG90aGVyIHRoYW4gcmVwb3J0aW5nIGFuZAorKiBpZ25vcmluZworKiBpdC4gVGhlIGludGVuZCBvZiB0aGlzIGVycm9yIGlzIG5vdCB0byBsZWF2ZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYworKiBlcnJvcnMgdW5yZXBvcnRlZC4KKyoKKyogQU9fSU5DT01QQVRJQkxFX1VOSVRTCisqIFRoZSB1bml0cyBhcmUgaW5jb21wYXRpYmxlLiBObyBjb252ZXJzaW9uIHJ1bGUgaXMga25vd24uCisqCisqIEFPX0lOVkFMSURfQVNBTV9QQVRICisqIFRoZSBzcGVjaWZpZWQgQXNhbSBwYXRoIGlzIGludmFsaWQuCisqCisqIEFPX0lOVkFMSURfQVRUUklCVVRFX1RZUEUKKyogVGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUgdHlwZSBpcyBpbnZhbGlkLgorKgorKiBBT19JTlZBTElEX0JBU0VUWVBFCisqIFRoZSBzcGVjaWZpZWQgYmFzZSB0eXBlIGlzIGludmFsaWQuIFRoZSBmb2xsb3dpbmcgYmFzZXR5cGVzIGFyZQorKiBhbGxvd2VkOgorKiAgICBBb0FueQorKiAgICBBb0F0dHJpYnV0ZU1hcAorKiAgICBBb0Vudmlyb25tZW50CisqICAgIEFvRmlsZQorKiAgICBBb0xvY2FsQ29sdW1uCisqICAgIEFvTG9nCisqICAgIEFvTWVhc3VyZW1lbnQKKyogICAgQW9NZWFzdXJlbWVudFF1YW50aXR5CisqICAgIEFvTmFtZU1hcAorKiAgICBBb1BhcmFtZXRlcgorKiAgICBBb1BhcmFtZXRlclNldAorKiAgICBBb1BoeXNpY2FsRGltZW5zaW9uCisqICAgIEFvUXVhbnRpdHkKKyogICAgQW9RdWFudGl0eUdyb3VwCisqICAgIEFvU3VibWF0cml4CisqICAgIEFvU3ViVGVzdAorKiAgICBBb1Rlc3QKKyogICAgQW9UZXN0RGV2aWNlCisqICAgIEFvVGVzdEVxdWlwbWVudAorKiAgICBBb1Rlc3RFcXVpcG1lbnRQYXJ0CisqICAgIEFvVGVzdFNlcXVlbmNlCisqICAgIEFvVGVzdFNlcXVlbmNlUGFydAorKiAgICBBb1VuaXQKKyogICAgQW9Vbml0R3JvdXAKKyogICAgQW9Vbml0VW5kZXJUZXN0CisqICAgIEFvVW5pdFVuZGVyVGVzdFBhcnQKKyogICAgQW9Vc2VyCisqICAgIEFvVXNlckdyb3VwCisqCisqIEFPX0lOVkFMSURfQkFTRV9FTEVNRU5UCisqIFRoZSBiYXNlIGVsZW1lbnQgaXMgaW52YWxpZCBpbiB0aGlzIGNvbnRleHQuIElmIHRoaXMgaXMgYW4gZWxlbWVudCBvZgorKiB0eXBlIG1lYXN1cmVtZW50LCBhbm90aGVyIGVsZW1lbnQgb2YgdGhpcyB0eXBlIG1heSBhbHJlYWR5IGV4aXN0LgorKgorKiBBT19JTlZBTElEX0JVSUxEVVBfRlVOQ1RJT04KKyogVGhlIHNwZWNpZmllZCBidWlsZC11cCBmdW5jdGlvbiBpcyBpbnZhbGlkLgorKgorKiBBT19JTlZBTElEX0NPTFVNTgorKiBUaGUgc3BlY2lmaWVkIGNvbHVtbiBpcyBpbnZhbGlkLgorKgorKiBBT19JTlZBTElEX0NPVU5UCisqIFRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHBvaW50cyBpcyBpbnZhbGlkIChwcm9iYWJseSBuZWdhdGl2ZSkuCisqCisqIEFPX0lOVkFMSURfREFUQVRZUEUKKyogVGhlIGRhdGF0eXBlIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBnaXZlbiBjb250ZXh0IG9yIGl0IGNvbmZsaWN0cyB3aXRoCisqIGFuIGV4aXN0aW5nIGRhdGF0eXBlIGRlZmluaXRpb24uCisqIAorKiBUaGlzIGVycm9yIG1heSBhbHNvIG9jY3VyIGluIG5vbi10eXBlc2F2ZSBsYW5ndWFnZSBiaW5kaW5ncy4gVG8gYXZvaWQKKyogdGhpcyBlcnJvciBpbiBhbGwgbGFuZ3VhZ2UgYmluZGluZ3MgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGFsd2F5cyB0aGUKKyogZGVmaW5pdGlvbnMgb2YgdGhlIGVudW1lcmF0aW9uICJEYXRhVHlwZSIuCisqCisqIEFPX0lOVkFMSURfRUxFTUVOVAorKiBUaGUgZWxlbWVudCBpcyBpbnZhbGlkIGluIHRoaXMgY29udGV4dC4KKyoKKyogQU9fSU5WQUxJRF9MRU5HVEgKKyogVGhlIGdpdmVuIGxlbmd0aCBpcyBpbnZhbGlkLiBOZWdhdGl2ZSBsZW5ndGggdmFsdWVzIGFyZSBub3QgYWxsb3dlZC4KKyoKKyogQU9fSU5WQUxJRF9PUkRJTkFMTlVNQkVSCisqIFRoZSBvcmRpbmFsIG51bWJlciBpcyBlaXRoZXIgYWxyZWFkeSB1c2VkIG9yIGxlc3MgdGhhbiB6ZXJvLgorKgorKiBBT19JTlZBTElEX1JFTEFUSU9OCisqIFRoZSByZWxhdGlvbiBpcyBpbnZhbGlkLiBUaGUgcmVsYXRlZCBlbGVtZW50cyBhbmQgdGhlIGJhc2UgcmVsYXRpb24gZG8KKyogbm90IGZpdC4KKyoKKyogQU9fSU5WQUxJRF9SRUxBVElPTlNISVAKKyogVGhpcyBlcnJvciBtYXkgb2NjdXIgb25seSBpbiBub24tdHlwZXNhdmUgbGFuZ3VhZ2UgYmluZGluZ3MuIFRvIGF2b2lkCisqIHRoaXMgZXJyb3IgaW4gYWxsIGxhbmd1YWdlIGJpbmRpbmdzIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBhbHdheXMgdGhlCisqIGRlZmluaXRpb25zIG9mIHRoZSBlbnVtZXJhdGlvbiAiUmVsYXRpb25zaGlwIi4KKyoKKyogQU9fSU5WQUxJRF9SRUxBVElPTl9SQU5HRQorKiBUaGUgc3BlY2lmaWVkIHJlbGF0aW9uIHJhbmdlIGlzIGludmFsaWQuCisqCisqIEFPX0lOVkFMSURfUkVMQVRJT05fVFlQRQorKiBUaGlzIGVycm9yIG1heSBvY2N1ciBvbmx5IGluIG5vbi10eXBlc2F2ZSBsYW5ndWFnZSBiaW5kaW5ncy4gVG8gYXZvaWQKKyogdGhpcyBlcnJvciBpbiBhbGwgbGFuZ3VhZ2UgYmluZGluZ3MgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGFsd2F5cyB0aGUKKyogZGVmaW5pdGlvbnMgb2YgdGhlIGVudW1lcmF0aW9uICJSZWxhdGlvblR5cGUiLgorKgorKiBBT19JTlZBTElEX1NFVF9UWVBFCisqIFRoZSBzcGVjaWZpZWQgc2V0LXR5cGUgaXMgaW52YWxpZC4KKyoKKyogQU9fSU5WQUxJRF9TTUFUTElOSworKiBUaGUgc3VibWF0cml4IGxpbmsgaXMgaW52YWxpZC4gRWl0aGVyIHN1Ym1hdHJpeCAxIG9yIDIgaXMgbm90IHNwZWNpZmllZAorKiBvciB0aGUgb3JkaW5hbCBudW1iZXIgaXMgbWlzc2luZyB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgU01hdExpbmsuCisqCisqIEFPX0lOVkFMSURfU1VCTUFUUklYCisqIFRoZSBzcGVjaWZpZWQgc3VibWF0cml4IGlzIGludmFsaWQuCisqCisqIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFCisqIFRoZSBzZXJ2ZXIgaXMgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgdmFsdWVtYXRyaXggZHVlIHRvIHRoZSBkYXRhIG9mIHRoZQorKiBtZWFzdXJlbWVudAorKiAgICAgIC0gaWYgdGhlcmUgYXJlIG5vIGluZGVwZW5kZW50IGNvbHVtbgorKiAgICAgIC0gaWYgdGhlcmUgYXJlIGRpZmZlcmVudCBpbmRlcGVuZGVudCBjb2x1bW5zCisqICAgICAgLSBpZiB0aGVyZSBhcmUgc3VibWF0cmljZXMgd2l0aCBtb3JlIHRoYW4gb25lIGluZGVwZW5kZW50CisqICAgICAgICBjb2x1bW4uCisqICAgICAgLSAuLgorKgorKiBBT19JU19CQVNFX0FUVFJJQlVURQorKiBUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGFscmVhZHkgb2YgYSBiYXNlIGF0dHJpYnV0ZSB0eXBlLiBJdCBjYW4KKyogbm90IGJlIGNoYW5nZWQuIElmIHRoaXMgaXMgcmVxdWlyZWQsIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgaGFzIHRvCisqIGJlIHJlbW92ZWQgZnJvbSBpdHMgYXBwbGljYXRpb24gZWxlbWVudCBhbmQgcmUtY3JlYXRlZC4gVGhpcyBlcnJvciBtYXkKKyogb2NjdXIgaWYgYW4gYXBwbGljYXRpb24gYXR0cmlidXRlIGRlcml2ZWQgZnJvbSBhIGJhc2UgYXR0cmlidXRlCisqIAorKiAgICBhLiBzaGFsbCBiZSBvdmVyd3JpdHRlbiBieSBhbm90aGVyIGJhc2UKKyogICAgICAgYXR0cmlidXRlIHR5cGUuCisqICAgIGIuIHNoYWxsIHJlY2VpdmUgYW5vdGhlciBkYXRhdHlwZS4KKyogICAgYy4gc2hhbGwgcmVjZWl2ZSBhbm90aGVyIHVuaXF1ZS1mbGFnLgorKiAgICBkLiBzaGFsbCByZWNlaXZlIGFub3RoZXIgb2JsaWdhdG9yeS1mbGFnLgorKgorKiBBT19JU19CQVNFX1JFTEFUSU9OCisqIFByb3BlcnRpZXMgb2YgYmFzZSByZWxhdGlvbnMgbWF5IG5vdCBiZSBjaGFuZ2VkLgorKgorKiBBT19JU19NRUFTVVJFTUVOVF9NQVRSSVgKKyogVGhlIG1hdHJpeCBpcyBhIGNvbXBsZXgsIGdlbmVyYXRlZCBtYXRyaXggZnJvbSBhIG1lYXN1cmVtZW50IG5vdCBqdXN0IGEKKyogc2ltcGxlIHN1Ym1hdHJpeC4gSXQgaXMgb25seSBhbGxvd2VkIHRvIG1vZGlmeSBzdWJtYXRyaWNlcyBidXQgbm90IHRoZQorKiBjb21wb3NlZCBtZWFzdXJlbWVudCBtYXRyaWNlcy4KKyoKKyogQU9fTUFUSF9FUlJPUgorKiBBIGNvbXB1dGF0aW9uIGVycm9yIG9jY3VycmVkLiBUaGlzIGNhbiBiZSBhbiBvdmVyZmxvdywgYW4gdW5kZXJmbG93IG9yCisqIGEgZGl2aXNpb24gYnkgemVyby4KKyoKKyogQU9fTUlTU0lOR19BUFBMSUNBVElPTl9FTEVNRU5UCisqIEEgcmVxdWlyZWQgYXBwbGljYXRpb24gZWxlbWVudCBpcyBtaXNzaW5nLgorKgorKiBBT19NSVNTSU5HX0FUVFJJQlVURQorKiBBIHJlcXVpcmVkIChvYmxpZ2F0b3J5KSBhdHRyaWJ1dGUgaXMgbWlzc2luZy4KKyoKKyogQU9fTUlTU0lOR19SRUxBVElPTgorKiBBIHJlcXVpcmVkIHJlbGF0aW9uIGlzIG1pc3NpbmcuCisqCisqIEFPX01JU1NJTkdfVkFMVUUKKyogQW4gb2JsaWdhdG9yeSB2YWx1ZSBpcyBtaXNzaW5nLgorKgorKiBBT19OT1RfRk9VTkQKKyogVGhlIHJlcXVlc3RlZCBlbGVtZW50IHdhcyBub3QgZm91bmQuIFRoaXMgZXJyb3Igb2NjdXJzIG9ubHkgaW4gcmVtb3ZlCisqIG9yIHJlbmFtZSBvcGVyYXRpb25zIGlmIHRoZSBzdWJqZWN0IG9mIHRoZSBvcGVyYXRpb24gaXMgbm90IGZvdW5kLiBBbGwKKyogZ2V0LSBhbmQgbGlzdC1tZXRob2RzIHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIHRoZSByZXF1ZXN0ZWQgaXRlbSBpcyBub3QKKyogZm91bmQuCisqCisqIEFPX05PVF9JTVBMRU1FTlRFRAorKiBUaGUgcmVxdWVzdGVkIG1ldGhvZCBpcyBub3QgeWV0IGltcGxlbWVudGVkLiBUaGlzIGVycm9yIGlzIG5vdCBhbGxvd2VkCisqIHRvIG9jY3VyIGluIGEgY2VydGlmaWVkIGltcGxlbWVudGF0aW9uLiBJdCBpcyBpbnRlbmRlZCB0byBhbGxvdyBwYXJ0aWFsCisqIG9wZXJhdGlvbmFsIHRlc3RzLiBkdXJpbmcgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuCisqCisqIEFPX05PVF9VTklRVUUKKyogVGhpcyBlcnJvciBvY2N1cnMgaWYgdGhlIGluc3RhbmNlcyBvZiBhIHByb3BlcnR5IGFyZSByZXF1aXJlZCB0byBiZQorKiB1bmlxdWUuCisqCisqIEFPX05PX01FTU9SWQorKiBObyBtb3JlIHZvbGF0aWxlIG1lbW9yeSBhdmFpbGFibGUuCisqCisqIEFPX05PX1BBVEhfVE9fRUxFTUVOVAorKiBBIGZyZWUtZmxvYXRpbmcgZWxlbWVudCB3YXMgZGV0ZWN0ZWQuIE5vIG5hdmlnYXRpb24gcGF0aCBsZWFkcyB0byB0aGlzCisqIGVsZW1lbnQuCisqCisqIEFPX05PX1NDQUxJTkdfQ09MVU1OCisqIFRoZSBjb2x1bW4gaXMgbm8gc2NhbGluZyBjb2x1bW4uCisqCisqIEFPX09QRU5fTU9ERV9OT1RfU1VQUE9SVEVECisqIFRoZSByZXF1ZXN0ZWQgb3BlbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQuIFZhbGlkIG9wZW4gbW9kZXMgYXJlICJyZWFkIgorKiBhbmQgIndyaXRlIi4gQW55dGhpbmcgZWxzZSBpcyByZWplY3RlZCB3aXRoIHRoaXMgZXJyb3IgYW5kIG5vIHNlc3Npb24KKyogaXMgY3JlYXRlZC4KKyoKKyogQU9fUVVFUllfSU5DT01QTEVURQorKiBUaGUgZXhlY3V0aW9uIG9mIHRoZSBxdWVyeSB3YXMgbm90IHlldCBjb21wbGV0ZWQuCisqCisqIEFPX1FVRVJZX0lOVkFMSUQKKyogU29tZSBlcnJvciBpbiB0aGUgcXVlcnkgc3RyaW5nIG9yIHNvbWUgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSByZXR1cm4KKyogdHlwZSBvZiB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUgIHJlc3VsdCB0eXBlIHNwZWNpZmllZCBieSBwYXJhbWV0ZXIKKyogIlF1ZXJ5UmVzdWx0VHlwZSIuCisqCisqIEFPX1FVRVJZX0lOVkFMSURfUkVTVUxUVFlQRQorKiBUaGUgcmVxdWVzdGVkIHJlc3VsdCB0eXBlIG9mIHRoZSBxdWVyeSBkbyBubyBtZXRjaCB3aXRoIHRoZSBwcmV2aW91cworKiBkZWZpbml0aW9uIG9mIHRoZSByZXN1bHQgdHlwZS4KKyoKKyogQU9fUVVFUllfUFJPQ0VTU0lOR19FUlJPUgorKiBTb21lIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIHF1ZXJ5LgorKgorKiBBT19RVUVSWV9USU1FT1VUX0VYQ0VFREVECisqIEl0IHdhcyBub3QgcG9zc2libGUgdG8gZXhlY3V0ZSB0aGUgcXVlcnkgd2l0aGluIHRoZSAgdGltZSBsaW1pdCBzZXQgYnkKKyogcGFyYW1ldGVyICJNYXhEdXJhdGlvbiIuCisqCisqIEFPX1FVRVJZX1RZUEVfSU5WQUxJRAorKiBUaGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBxdWVyeSBsYW5ndWFnZSB0eXBlLgorKgorKiBBT19TRVNTSU9OX0xJTUlUX1JFQUNIRUQKKyogVGhlIHNlcnZlciBkb2VzIG5vdCBhY2NlcHQgYW55IG5ldyBjb25uZWN0aW9ucy4gVGhpcyBlcnJvciBtYXkgb2NjdXIgaWYKKyogdGhlIHNlcnZlciByZWFjaGVkIHRoZSBzZXNzaW9uIGxpbWl0IGZvciBhIGRpc3RpbmN0IHVzZXIgb3IgdGhlIHRvdGFsCisqIG51bWJlciBvZiBzZXNzaW9ucyBhbGxvd2VkLgorKgorKiBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyogVGhlIHNlc3Npb24gaXMgbm8gbG9uZ2VyIGFjdGl2ZS4gVGhpcyBlcnJvciBvY2N1cnMgaWYgYW4gYXR0ZW1wdCBpcworKiBtYWRlIHRvIGNhbGwgYSBtZXRob2Qgb2YgYSBjbG9zZWQgc2Vzc2lvbi4gVGhpcyBlcnJvciBzaGFsbCBub3QgYmUKKyogY29uZnVzZWQgd2l0aCB0aGUgZXJyb3IgQU9fQ09OTkVDVElPTl9MT1NULgorKgorKiBBT19TWVNURU1fUFJPQkxFTQorKiBUaGUgT0RTIHNlcnZlciBkZXRlY3RlZCBhIHByb2JsZW0gd2hpbGUgYWNjZXNzaW5nIG9wZXJhdGluZyBzeXN0ZW0KKyogcmVzc291cmNlcyAoZS5nLiB0aGUgc3BlY2lmaWVkIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSBkcml2ZSBpcworKiBjdXJyZW50bHkgbm90IGF2YWlsYWJsZSwgLi4uKS4KKyoKKyogQU9fVFJBTlNBQ1RJT05fQUxSRUFEWV9BQ1RJVkUKKyogVGhlcmUgbWF5IGJlIG9ubHkgb25lIGFjdGl2ZSB0cmFuc2FjdGlvbiBhdCBvbmUgdGltZS4gSWYgdGhpcyBlcnJvcgorKiBvY2N1cnMgdGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24uIFRoYXQgdHJhbnNhY3Rpb24gcmVtYWlucworKiBhY3RpdmUgaW4gY2FzZSBvZiB0aGlzIGVycm9yLgorKgorKiBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisqIFdyaXRlIG9wZXJhdGlvbiBoYXZlIHRvIGJlIGRvbmUgYWx3YXlzIGluIHRoZSBjb250ZXh0IG9mIGEgdHJhbnNhY3Rpb24uCisqIFRoaXMgZXJyb3Igb2NjdXJzIGlmIG5vIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24uCisqCisqIEFPX1VOS05PV05fRVJST1IKKyogVXNlIHRoZSB6ZXJvIGFzIHVua25vd24gZXJyb3IgdG8gYXZvaWQgY29uZnVzaW5nIGVycm9yIG1lc3NhZ2VzIGlmIG5vCisqIGVycm9yIGNvZGUgaGFzIGJlZW4gc2V0LgorKgorKiBBT19VTktOT1dOX1VOSVQKKyogVGhlIHVuaXQgaXMgdW5rbm93bi4KKyovCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE4MGYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9BdmFsb25FdmVudC5pZGwKKyogRnJlaXRhZywgNS4gQXVndXN0IDIwMTYgMDk6NDMgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50IGltcGxlbWVudHMgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JRExFbnRpdHkKK3sKKworICAvKioKKyAgKiBUaGUgbW9kZSBvZiB0aGUgZXZlbnQuCisgICovCisgIHB1YmxpYyBzaG9ydCBtb2RlID0gKHNob3J0KTA7CisKKyAgLyoqCisgICogVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAqLworICBwdWJsaWMgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWVJZCA9IG51bGw7CisKKyAgLyoqCisgICogVGhlIElkIG9mIHRoZSBpbnN0YW5jZS4KKyAgKi8KKyAgcHVibGljIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGllSWQgPSBudWxsOworCisgIC8qKgorICAqIFRoZSBJZCBvZiB0aGUgQW9Vc2VyIGluc3RhbmNlLgorICAqLworICBwdWJsaWMgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgdXNlcklkID0gbnVsbDsKKworICAvKioKKyAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBldmVudC4KKyAgKi8KKyAgcHVibGljIFN0cmluZyB0aW1lc3RhbXAgPSBudWxsOworCisgIHB1YmxpYyBBdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50ICgpCisgIHsKKyAgfSAvLyBjdG9yCisKKyAgcHVibGljIEF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgKHNob3J0IF9tb2RlLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBfYWVJZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgX2llSWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIF91c2VySWQsIFN0cmluZyBfdGltZXN0YW1wKQorICB7CisgICAgbW9kZSA9IF9tb2RlOworICAgIGFlSWQgPSBfYWVJZDsKKyAgICBpZUlkID0gX2llSWQ7CisgICAgdXNlcklkID0gX3VzZXJJZDsKKyAgICB0aW1lc3RhbXAgPSBfdGltZXN0YW1wOworICB9IC8vIGN0b3IKKworfSAvLyBjbGFzcyBBdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjYjE4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhlbHBlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL0F2YWxvbkV2ZW50LmlkbAorKiBGcmVpdGFnLCA1LiBBdWd1c3QgMjAxNiAwOTo0MyBVaHIgTUVTWgorKi8KKworYWJzdHJhY3QgcHVibGljIGNsYXNzIEF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIZWxwZXIKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICBfaWQgPSAiSURMOmNvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQ6MS4wIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0IChvcmcub21nLkNPUkJBLkFueSBhLCBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50IHRoYXQpCisgIHsKKyAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXQgPSBhLmNyZWF0ZV9vdXRwdXRfc3RyZWFtICgpOworICAgIGEudHlwZSAodHlwZSAoKSk7CisgICAgd3JpdGUgKG91dCwgdGhhdCk7CisgICAgYS5yZWFkX3ZhbHVlIChvdXQuY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgdHlwZSAoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLkF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBfX2FjdGl2ZSA9IGZhbHNlOworICBzeW5jaHJvbml6ZWQgcHVibGljIHN0YXRpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIHR5cGUgKCkKKyAgeworICAgIGlmIChfX3R5cGVDb2RlID09IG51bGwpCisgICAgeworICAgICAgc3luY2hyb25pemVkIChvcmcub21nLkNPUkJBLlR5cGVDb2RlLmNsYXNzKQorICAgICAgeworICAgICAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9fYWN0aXZlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvcmcub21nLkNPUkJBLk9SQi5pbml0KCkuY3JlYXRlX3JlY3Vyc2l2ZV90YyAoIF9pZCApOworICAgICAgICAgIH0KKyAgICAgICAgICBfX2FjdGl2ZSA9IHRydWU7CisgICAgICAgICAgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXJbXSBfbWVtYmVyczAgPSBuZXcgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXIgWzVdOworICAgICAgICAgIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3RjT2ZfbWVtYmVyczAgPSBudWxsOworICAgICAgICAgIF90Y09mX21lbWJlcnMwID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5nZXRfcHJpbWl0aXZlX3RjIChvcmcub21nLkNPUkJBLlRDS2luZC50a19zaG9ydCk7CisgICAgICAgICAgX21lbWJlcnMwWzBdID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyICgKKyAgICAgICAgICAgICJtb2RlIiwKKyAgICAgICAgICAgIF90Y09mX21lbWJlcnMwLAorICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgX3RjT2ZfbWVtYmVyczAgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci50eXBlICgpOworICAgICAgICAgIF9tZW1iZXJzMFsxXSA9IG5ldyBvcmcub21nLkNPUkJBLlN0cnVjdE1lbWJlciAoCisgICAgICAgICAgICAiYWVJZCIsCisgICAgICAgICAgICBfdGNPZl9tZW1iZXJzMCwKKyAgICAgICAgICAgIG51bGwpOworICAgICAgICAgIF90Y09mX21lbWJlcnMwID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIudHlwZSAoKTsKKyAgICAgICAgICBfbWVtYmVyczBbMl0gPSBuZXcgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXIgKAorICAgICAgICAgICAgImllSWQiLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnR5cGUgKCk7CisgICAgICAgICAgX21lbWJlcnMwWzNdID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyICgKKyAgICAgICAgICAgICJ1c2VySWQiLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKCkuY3JlYXRlX3N0cmluZ190YyAoMCk7CisgICAgICAgICAgX21lbWJlcnMwWzRdID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyICgKKyAgICAgICAgICAgICJ0aW1lc3RhbXAiLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfX3R5cGVDb2RlID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5jcmVhdGVfc3RydWN0X3RjIChjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLmlkICgpLCAiQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudCIsIF9tZW1iZXJzMCk7CisgICAgICAgICAgX19hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX190eXBlQ29kZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkICgpCisgIHsKKyAgICByZXR1cm4gX2lkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50IHJlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaXN0cmVhbSkKKyAgeworICAgIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLkF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgdmFsdWUgPSBuZXcgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudCAoKTsKKyAgICB2YWx1ZS5tb2RlID0gaXN0cmVhbS5yZWFkX3Nob3J0ICgpOworICAgIHZhbHVlLmFlSWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpc3RyZWFtKTsKKyAgICB2YWx1ZS5pZUlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaXN0cmVhbSk7CisgICAgdmFsdWUudXNlcklkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaXN0cmVhbSk7CisgICAgdmFsdWUudGltZXN0YW1wID0gaXN0cmVhbS5yZWFkX3N0cmluZyAoKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG9zdHJlYW0sIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLkF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgdmFsdWUpCisgIHsKKyAgICBvc3RyZWFtLndyaXRlX3Nob3J0ICh2YWx1ZS5tb2RlKTsKKyAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAob3N0cmVhbSwgdmFsdWUuYWVJZCk7CisgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKG9zdHJlYW0sIHZhbHVlLmllSWQpOworICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlIChvc3RyZWFtLCB2YWx1ZS51c2VySWQpOworICAgIG9zdHJlYW0ud3JpdGVfc3RyaW5nICh2YWx1ZS50aW1lc3RhbXApOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmVkNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247CisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvQXZhbG9uRXZlbnQuaWRsCisqIEZyZWl0YWcsIDUuIEF1Z3VzdCAyMDE2IDA5OjQzIFVociBNRVNaCisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudCB2YWx1ZSA9IG51bGw7CisKKyAgcHVibGljIEF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIb2xkZXIgKCkKKyAgeworICB9CisKKyAgcHVibGljIEF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIb2xkZXIgKGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLkF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgaW5pdGlhbFZhbHVlKQorICB7CisgICAgdmFsdWUgPSBpbml0aWFsVmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBfcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpKQorICB7CisgICAgdmFsdWUgPSBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLnJlYWQgKGkpOworICB9CisKKyAgcHVibGljIHZvaWQgX3dyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLnR5cGUgKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9ERUxFVEUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfREVMRVRFLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5MWNjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfREVMRVRFLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9ERUxFVEUuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9BdmFsb25FdmVudC5pZGwKKyogRnJlaXRhZywgNS4gQXVndXN0IDIwMTYgMDk6NDMgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBpbnRlcmZhY2UgTU9ERV9ERUxFVEUKK3sKKworICAvKioKKyAgKiBUaGUgdmFsdWUgb2YgdGhlIG1vZGUgZmllbGQgaW4gdGhlIGV2ZW50IHdoZW4gYSBkZWxldGUgaXMgcmVnaXN0ZXJlZC4KKyAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCB2YWx1ZSA9IChzaG9ydCkoMyk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9NT0RFX0lOU0VSVC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9JTlNFUlQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmE4NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9JTlNFUlQuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9NT0RFX0lOU0VSVC5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL0F2YWxvbkV2ZW50LmlkbAorKiBGcmVpdGFnLCA1LiBBdWd1c3QgMjAxNiAwOTo0MyBVaHIgTUVTWgorKi8KKworcHVibGljIGludGVyZmFjZSBNT0RFX0lOU0VSVAoreworCisgIC8qKgorICAqIFRoZSB2YWx1ZSBvZiB0aGUgbW9kZSBmaWVsZCBpbiB0aGUgZXZlbnQgd2hlbiBhbiBpbnNlcnQgaXMgcmVnaXN0ZXJlZC4KKyAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCB2YWx1ZSA9IChzaG9ydCkoMSk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9NT0RFX01PRElGWVJJR0hUUy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9NT0RJRllSSUdIVFMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQ4Y2NkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9NT0RJRllSSUdIVFMuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9NT0RFX01PRElGWVJJR0hUUy5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL0F2YWxvbkV2ZW50LmlkbAorKiBGcmVpdGFnLCA1LiBBdWd1c3QgMjAxNiAwOTo0MyBVaHIgTUVTWgorKi8KKworcHVibGljIGludGVyZmFjZSBNT0RFX01PRElGWVJJR0hUUworeworCisgIC8qKgorICAqIFRoZSB2YWx1ZSBvZiB0aGUgbW9kZSBmaWVsZCBpbiB0aGUgZXZlbnQgd2hlbiBhIG1vZGlmeXJpZ2h0cyBpcyByZWdpc3RlcmVkLgorICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IHZhbHVlID0gKHNob3J0KSg0KTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfUkVQTEFDRS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9SRVBMQUNFLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxMjFjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfUkVQTEFDRS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfUkVQTEFDRS5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL0F2YWxvbkV2ZW50LmlkbAorKiBGcmVpdGFnLCA1LiBBdWd1c3QgMjAxNiAwOTo0MyBVaHIgTUVTWgorKi8KKworcHVibGljIGludGVyZmFjZSBNT0RFX1JFUExBQ0UKK3sKKworICAvKioKKyAgKiBUaGUgdmFsdWUgb2YgdGhlIG1vZGUgZmllbGQgaW4gdGhlIGV2ZW50IHdoZW4gYSByZXBsYWNlIGlzIHJlZ2lzdGVyZWQuCisgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgdmFsdWUgPSAoc2hvcnQpKDIpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWYxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24uamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZXh0ZW5kcyBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb24KK3sKKyAgcHVibGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgZXJyQ29kZSA9IG51bGw7CisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnIHNldkZsYWcgPSBudWxsOworICBwdWJsaWMgU3RyaW5nIHJlYXNvbiA9IG51bGw7CisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAoKQorICB7CisgICAgc3VwZXIoQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLmlkKCkpOworICB9IC8vIGN0b3IKKworICBwdWJsaWMgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIF9lcnJDb2RlLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnIF9zZXZGbGFnLCBTdHJpbmcgX3JlYXNvbikKKyAgeworICAgIHN1cGVyKENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5pZCgpKTsKKyAgICBlcnJDb2RlID0gX2VyckNvZGU7CisgICAgc2V2RmxhZyA9IF9zZXZGbGFnOworICAgIHJlYXNvbiA9IF9yZWFzb247CisgIH0gLy8gY3RvcgorCisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAoU3RyaW5nICRyZWFzb24sIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgX2VyckNvZGUsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgX3NldkZsYWcsIFN0cmluZyBfcmVhc29uKQorICB7CisgICAgc3VwZXIoQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLmlkKCkgKyAiICAiICsgJHJlYXNvbik7CisgICAgZXJyQ29kZSA9IF9lcnJDb2RlOworICAgIHNldkZsYWcgPSBfc2V2RmxhZzsKKyAgICByZWFzb24gPSBfcmVhc29uOworICB9IC8vIGN0b3IKKworfSAvLyBjbGFzcyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM4ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyCit7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyAgX2lkID0gIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCI7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydCAob3JnLm9tZy5DT1JCQS5BbnkgYSwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGV4dHJhY3QgKG9yZy5vbWcuQ09SQkEuQW55IGEpCisgIHsKKyAgICByZXR1cm4gcmVhZCAoYS5jcmVhdGVfaW5wdXRfc3RyZWFtICgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX190eXBlQ29kZSA9IG51bGw7CisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gX19hY3RpdmUgPSBmYWxzZTsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIHN5bmNocm9uaXplZCAob3JnLm9tZy5DT1JCQS5UeXBlQ29kZS5jbGFzcykKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fdHlwZUNvZGUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX2FjdGl2ZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCgpLmNyZWF0ZV9yZWN1cnNpdmVfdGMgKCBfaWQgKTsKKyAgICAgICAgICB9CisgICAgICAgICAgX19hY3RpdmUgPSB0cnVlOworICAgICAgICAgIG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyW10gX21lbWJlcnMwID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyIFszXTsKKyAgICAgICAgICBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF90Y09mX21lbWJlcnMwID0gbnVsbDsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGVIZWxwZXIudHlwZSAoKTsKKyAgICAgICAgICBfbWVtYmVyczBbMF0gPSBuZXcgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXIgKAorICAgICAgICAgICAgImVyckNvZGUiLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWdIZWxwZXIudHlwZSAoKTsKKyAgICAgICAgICBfbWVtYmVyczBbMV0gPSBuZXcgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXIgKAorICAgICAgICAgICAgInNldkZsYWciLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKCkuY3JlYXRlX3N0cmluZ190YyAoMCk7CisgICAgICAgICAgX21lbWJlcnMwWzJdID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyICgKKyAgICAgICAgICAgICJyZWFzb24iLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfX3R5cGVDb2RlID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5jcmVhdGVfZXhjZXB0aW9uX3RjIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLmlkICgpLCAiQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIiwgX21lbWJlcnMwKTsKKyAgICAgICAgICBfX2FjdGl2ZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3R5cGVDb2RlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWQgKCkKKyAgeworICAgIHJldHVybiBfaWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpc3RyZWFtKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiB2YWx1ZSA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICgpOworICAgIC8vIHJlYWQgYW5kIGRpc2NhcmQgdGhlIHJlcG9zaXRvcnkgSUQKKyAgICBpc3RyZWFtLnJlYWRfc3RyaW5nICgpOworICAgIHZhbHVlLmVyckNvZGUgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlSGVscGVyLnJlYWQgKGlzdHJlYW0pOworICAgIHZhbHVlLnNldkZsYWcgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnSGVscGVyLnJlYWQgKGlzdHJlYW0pOworICAgIHZhbHVlLnJlYXNvbiA9IGlzdHJlYW0ucmVhZF9zdHJpbmcgKCk7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIHZhbHVlKQorICB7CisgICAgLy8gd3JpdGUgdGhlIHJlcG9zaXRvcnkgSUQKKyAgICBvc3RyZWFtLndyaXRlX3N0cmluZyAoaWQgKCkpOworICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGVIZWxwZXIud3JpdGUgKG9zdHJlYW0sIHZhbHVlLmVyckNvZGUpOworICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWdIZWxwZXIud3JpdGUgKG9zdHJlYW0sIHZhbHVlLnNldkZsYWcpOworICAgIG9zdHJlYW0ud3JpdGVfc3RyaW5nICh2YWx1ZS5yZWFzb24pOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25Ib2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25Ib2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWNlMjZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhvbGRlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiB2YWx1ZSA9IG51bGw7CisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhvbGRlciAoKQorICB7CisgIH0KKworICBwdWJsaWMgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSG9sZGVyIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGluaXRpYWxWYWx1ZSkKKyAgeworICAgIHZhbHVlID0gaW5pdGlhbFZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgX3JlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaSkKKyAgeworICAgIHZhbHVlID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkIChpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIF93cml0ZSAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gbykKKyAgeworICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG8sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF90eXBlICgpCisgIHsKKyAgICByZXR1cm4gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci50eXBlICgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlYzRlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBpbnRlcmZhY2UgQ09SQkFGaWxlU2VydmVySUYgZXh0ZW5kcyBDT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMsIG9yZy5vbWcuQ09SQkEuT2JqZWN0LCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklETEVudGl0eSAKK3sKKworICAvKgorICAJICAqIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgSURMCisgIAkgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSRkFDRVZFUlNJT04gPSAiMS4zIjsKK30gLy8gaW50ZXJmYWNlIENPUkJBRmlsZVNlcnZlcklGCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRkhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDRhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZIZWxwZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGSGVscGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ09SQkFGaWxlU2VydmVySUZIZWxwZXIKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICBfaWQgPSAiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRjoxLjAiOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnQgKG9yZy5vbWcuQ09SQkEuQW55IGEsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRiB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYgZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9pbnRlcmZhY2VfdGMgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRkhlbHBlci5pZCAoKSwgIkNPUkJBRmlsZVNlcnZlcklGIik7CisgICAgfQorICAgIHJldHVybiBfX3R5cGVDb2RlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWQgKCkKKyAgeworICAgIHJldHVybiBfaWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRiByZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGlzdHJlYW0pCisgIHsKKyAgICByZXR1cm4gbmFycm93IChpc3RyZWFtLnJlYWRfT2JqZWN0IChfQ09SQkFGaWxlU2VydmVySUZTdHViLmNsYXNzKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG9zdHJlYW0sIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRiB2YWx1ZSkKKyAgeworICAgIG9zdHJlYW0ud3JpdGVfT2JqZWN0ICgob3JnLm9tZy5DT1JCQS5PYmplY3QpIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGIG5hcnJvdyAob3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqKQorICB7CisgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgcmV0dXJuIG51bGw7CisgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGKQorICAgICAgcmV0dXJuIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYpb2JqOworICAgIGVsc2UgaWYgKCFvYmouX2lzX2EgKGlkICgpKSkKKyAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLkJBRF9QQVJBTSAoKTsKKyAgICBlbHNlCisgICAgeworICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5EZWxlZ2F0ZSBkZWxlZ2F0ZSA9ICgob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PYmplY3RJbXBsKW9iaikuX2dldF9kZWxlZ2F0ZSAoKTsKKyAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5fQ09SQkFGaWxlU2VydmVySUZTdHViIHN0dWIgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLl9DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIgKCk7CisgICAgICBzdHViLl9zZXRfZGVsZWdhdGUoZGVsZWdhdGUpOworICAgICAgcmV0dXJuIHN0dWI7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYgdW5jaGVja2VkX25hcnJvdyAob3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqKQorICB7CisgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgcmV0dXJuIG51bGw7CisgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGKQorICAgICAgcmV0dXJuIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYpb2JqOworICAgIGVsc2UKKyAgICB7CisgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLkRlbGVnYXRlIGRlbGVnYXRlID0gKChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk9iamVjdEltcGwpb2JqKS5fZ2V0X2RlbGVnYXRlICgpOworICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLl9DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIgc3R1YiA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuX0NPUkJBRmlsZVNlcnZlcklGU3R1YiAoKTsKKyAgICAgIHN0dWIuX3NldF9kZWxlZ2F0ZShkZWxlZ2F0ZSk7CisgICAgICByZXR1cm4gc3R1YjsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGSG9sZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWNjNDZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGSG9sZGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZIb2xkZXIuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDT1JCQUZpbGVTZXJ2ZXJJRkhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGIHZhbHVlID0gbnVsbDsKKworICBwdWJsaWMgQ09SQkFGaWxlU2VydmVySUZIb2xkZXIgKCkKKyAgeworICB9CisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlcklGSG9sZGVyIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYgaW5pdGlhbFZhbHVlKQorICB7CisgICAgdmFsdWUgPSBpbml0aWFsVmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBfcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpKQorICB7CisgICAgdmFsdWUgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUZIZWxwZXIucmVhZCAoaSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBfd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG8pCisgIHsKKyAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUZIZWxwZXIud3JpdGUgKG8sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF90eXBlICgpCisgIHsKKyAgICByZXR1cm4gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGSGVscGVyLnR5cGUgKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Zjc0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZPcGVyYXRpb25zLmphdmEKQEAgLTAsMCArMSw0OTYgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZPcGVyYXRpb25zLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgaW50ZXJmYWNlIENPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucyAKK3sKKworICAvKioKKyAgICAgICAgKiBTYXZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW50cHV0IHN0cmVhbS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAqLworICBTdHJpbmcgc2F2ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICovCisgIFN0cmluZyBzYXZlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN1YkRpciwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICogU3BlY2lmeSB0aGUgbmFtZSBvZiBhbiBhcHBsY2lhdGlvbiBlbGVtZW50IGFuZCB0aGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudAorICAgICAgICAqIHRoYXQgaG9sZHMgdGhlIGV4dGVybmFsIHJlZmVyZW5jZQorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgYWVOYW1lIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuCisgICAgICAgICogQHBhcmFtICBpZU5hbWUgdGhlIGluc3RhbmNlIGVsZW1lbnQgbmFtZS4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAqLworICBTdHJpbmcgc2F2ZUZvckluc3RhbmNlTmFtZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBTdHJpbmcgYWVOYW1lLCBTdHJpbmcgaWVOYW1lLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIERlbGV0ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICovCisgIHZvaWQgZGVsZXRlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIE1vdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICB1cmxvIHRoZSB1cmwgb2YgdGhlIGZpbGUuCisgICAgICAgICovCisgIHZvaWQgbW92ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyB1cmwpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIERlbGV0ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIHVybCB0aGUgdXJsIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICB2b2lkIGRlbGV0ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIHVybCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIE1vdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICB2b2lkIG1vdmVGb3JJbnN0YW5jZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICovCisgIHZvaWQgZ2V0QnlTb2NrZXQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgdXJsIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICovCisgIHZvaWQgZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICAqIFNhdmUgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAgKi8KKyAgU3RyaW5nIHNhdmVCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgICogU2F2ZSB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIFN0cmluZyBzYXZlRm9ySW5zdGFuY2VCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICAqIFNhdmUgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtICBhZU5hbWUgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgbmFtZS4KKyAgICAgICAgICogQHBhcmFtICBpZU5hbWUgdGhlIGluc3RhbmNlIGVsZW1lbnQgbmFtZS4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAgKi8KKyAgU3RyaW5nIHNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBTdHJpbmcgYWVOYW1lLCBTdHJpbmcgaWVOYW1lLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiBSZWFkIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICovCisgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHJlYWQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogUmVhZCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqLworICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiByZWFkRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqICBHZXQgc2l6ZSBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzaXplIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICovCisgIGxvbmcgZ2V0U2l6ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiAgR2V0IHNpemUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqLworICBsb25nIGdldFNpemVGb3JJbnN0YW5jZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBieSB0aGUgY2xpZW50IHdoZW4gdGhlIHNlcnZlciBzaG91bGQgYmUgc3RhcnQgYSB0ZXJtaW5hdGlvbiBwcm9jZXNzLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgcGFyYW1ldGVyIHRoZSBwYXJhbWV0ZXIgc3RyaW5nLiBUaGUgY29udGVudCBkZXBlbmRzIG9uIHRoZQorICAgICAgICAqICAgICAgICAgc2VydmVyIHNpZGUgdGVybWluYXRlIGltcGxlbWVudGF0aW9uLgorICAgICAgICAqLworICB2b2lkIHRlcm1pbmF0ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyYW1ldGVyKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydCBhIHRlcm1pbmF0aW9uIHByb2Nlc3MuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBwYXJhbWV0ZXIgdGhlIHBhcmFtZXRlciBzdHJpbmcuIFRoZSBjb250ZW50IGRlcGVuZHMgb24gdGhlCisgICAgICAgICogICAgICAgICBzZXJ2ZXIgc2lkZSB0ZXJtaW5hdGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgICovCisgIHZvaWQgdGVybWluYXRlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIFN0cmluZyBwYXJhbWV0ZXIpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgaG9zdCB3aGVyZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEByZXR1cm4gdGhlIGhvc3RuYW1lCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICovCisgIFN0cmluZyBnZXRIb3N0bmFtZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIEdldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEByZXR1cm4gdGhlIGNvbnRleHQgdmFsdWUKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlksCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfRk9VTkQKKyAgICAgICAgKi8KKyAgU3RyaW5nIGdldENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcga2V5KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiBTZXQgYSBjb250ZXh0IHZhcmlhYmxlLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5d29yZCBvZiB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGNvbnRleHQgdmFsdWUuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICovCisgIHZvaWQgc2V0Q29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogUmVtb3ZlIGEgY29udGV4dCB2YXJpYWJsZS4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleXdvcmQgb2YgdGhlIGNvbnRleHQgdmFsdWUuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICovCisgIHZvaWQgcmVtb3ZlQ29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXkpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIExpc3QgYWxsIGNvbnRleHQga2V5d29yZHMuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcmV0dXJuIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncy4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgU3RyaW5nW10gbGlzdENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIENvcmJhRmlsZVNlcnZlcklGLgorICAgICAgICAqIFJldHVybnMgZ2V0VmVyc2lvbiBvZiBDb3JiYUZpbGVTZXJ2ZXIuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEByZXR1cm4gIFRoZSBpbnRlcmZhY2UgdmVyc2lvbiBvZiB0aGUgQ29yYmFGaWxlU2VydmVySUYuCisgICAgICAgICoKKyAgICAgICAgKi8KKyAgU3RyaW5nIGdldEludGVyZmFjZVZlcnNpb24gKCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBsb25nIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlIGxlbmd0aAorICAgICAgICAqIG9mIHRoZSBmaWxlcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIFN0cmluZyBhcnJheS4KKyAgICAgICAgKiBUaGUgb3JkZXIgb2YgdGhlIGxvbmcgdmFsdWVzIG11c3QgbWF0Y2ggd2l0aCB0aGUgb3JkZXIKKyAgICAgICAgKiBvZiB0aGUgZmlsZW5hbWVzLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIGFvU2VzcyB0aGUgYW9TZXNzaW9uIG9mIHRoZSBjYWxsZXIKKyAgICAgICAgKiBAcGFyYW0gbmFtZXMgdGhlIFN0cmluZyBhcnJheSBvZiBmaWxlbmFtZXMgZm9yIAorICAgICAgICAqICAgICAgICAgICAgICB3aGljaCB0byBnZXQgdGhlIHNpemVzCisgICAgICAgICogQHJldHVybiBhbiBBcnJheSBvZiBsb25nIHZhbHVlcyBjb250YWluaW5nIHRoZSBmaWxlIHNpemVzCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKgorICAgICAgICAqLworICBsb25nW10gZ2V0U2l6ZXMgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmdbXSBuYW1lcykgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247Cit9IC8vIGludGVyZmFjZSBDT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRlBPQS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGUE9BLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNzcwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRlBPQS5qYXZhCkBAIC0wLDAgKzEsOTYzIEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGUE9BLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ09SQkFGaWxlU2VydmVySUZQT0EgZXh0ZW5kcyBvcmcub21nLlBvcnRhYmxlU2VydmVyLlNlcnZhbnQKKyBpbXBsZW1lbnRzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMsIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW52b2tlSGFuZGxlcgoreworCisgIC8vIENvbnN0cnVjdG9ycworCisgIHByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgX21ldGhvZHMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSAoKTsKKyAgc3RhdGljCisgIHsKKyAgICBfbWV0aG9kcy5wdXQgKCJzYXZlIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgwKSk7CisgICAgX21ldGhvZHMucHV0ICgic2F2ZUZvckluc3RhbmNlIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxKSk7CisgICAgX21ldGhvZHMucHV0ICgic2F2ZUZvckluc3RhbmNlTmFtZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMikpOworICAgIF9tZXRob2RzLnB1dCAoImRlbGV0ZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMykpOworICAgIF9tZXRob2RzLnB1dCAoIm1vdmUiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDQpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJkZWxldGVGb3JJbnN0YW5jZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoNSkpOworICAgIF9tZXRob2RzLnB1dCAoIm1vdmVGb3JJbnN0YW5jZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoNikpOworICAgIF9tZXRob2RzLnB1dCAoImdldEJ5U29ja2V0IiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICg3KSk7CisgICAgX21ldGhvZHMucHV0ICgiZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoOCkpOworICAgIF9tZXRob2RzLnB1dCAoInNhdmVCeVNvY2tldCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoOSkpOworICAgIF9tZXRob2RzLnB1dCAoInNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxMCkpOworICAgIF9tZXRob2RzLnB1dCAoInNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMTEpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJyZWFkIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxMikpOworICAgIF9tZXRob2RzLnB1dCAoInJlYWRGb3JJbnN0YW5jZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMTMpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJnZXRTaXplIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxNCkpOworICAgIF9tZXRob2RzLnB1dCAoImdldFNpemVGb3JJbnN0YW5jZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMTUpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJ0ZXJtaW5hdGUiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDE2KSk7CisgICAgX21ldGhvZHMucHV0ICgidGVybWluYXRlRm9ySW5zdGFuY2UiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDE3KSk7CisgICAgX21ldGhvZHMucHV0ICgiZ2V0SG9zdG5hbWUiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDE4KSk7CisgICAgX21ldGhvZHMucHV0ICgiZ2V0Q29udGV4dCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMTkpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJzZXRDb250ZXh0IiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgyMCkpOworICAgIF9tZXRob2RzLnB1dCAoInJlbW92ZUNvbnRleHQiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDIxKSk7CisgICAgX21ldGhvZHMucHV0ICgibGlzdENvbnRleHQiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDIyKSk7CisgICAgX21ldGhvZHMucHV0ICgiZ2V0SW50ZXJmYWNlVmVyc2lvbiIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMjMpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJnZXRTaXplcyIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMjQpKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBfaW52b2tlIChTdHJpbmcgJG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZXNwb25zZUhhbmRsZXIgJHJoKQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKyAgICBqYXZhLmxhbmcuSW50ZWdlciBfX21ldGhvZCA9IChqYXZhLmxhbmcuSW50ZWdlcilfbWV0aG9kcy5nZXQgKCRtZXRob2QpOworICAgIGlmIChfX21ldGhvZCA9PSBudWxsKQorICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuQkFEX09QRVJBVElPTiAoMCwgb3JnLm9tZy5DT1JCQS5Db21wbGV0aW9uU3RhdHVzLkNPTVBMRVRFRF9NQVlCRSk7CisKKyAgICBzd2l0Y2ggKF9fbWV0aG9kLmludFZhbHVlICgpKQorICAgIHsKKworICAvKioKKyAgICAgICAgKiBTYXZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW50cHV0IHN0cmVhbS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAqLworICAgICAgIGNhc2UgMDogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi9zYXZlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0gPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMuc2F2ZSAoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIHN0cmVhbSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfc3RyaW5nICgkcmVzdWx0KTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDE6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvc2F2ZUZvckluc3RhbmNlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgc3RyZWFtID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLnNhdmVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIGFpZCwgaWlkLCBzdHJlYW0pOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgb3V0LndyaXRlX3N0cmluZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqIFNwZWNpZnkgdGhlIG5hbWUgb2YgYW4gYXBwbGNpYXRpb24gZWxlbWVudCBhbmQgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQKKyAgICAgICAgKiB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UKKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgKiBAcGFyYW0gIGFlTmFtZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICAqIEBwYXJhbSAgaWVOYW1lIHRoZSBpbnN0YW5jZSBlbGVtZW50IG5hbWUuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDI6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvc2F2ZUZvckluc3RhbmNlTmFtZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyBzdWJEaXIgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIGFlTmFtZSA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBTdHJpbmcgaWVOYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nICRyZXN1bHQgPSBudWxsOworICAgICAgICAgICAkcmVzdWx0ID0gdGhpcy5zYXZlRm9ySW5zdGFuY2VOYW1lIChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgYWVOYW1lLCBpZU5hbWUsIHN0cmVhbSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfc3RyaW5nICgkcmVzdWx0KTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogRGVsZXRlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDM6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZGVsZXRlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgdGhpcy5kZWxldGUgKGFvU2VzcywgbmFtZSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBNb3ZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgdXJsbyB0aGUgdXJsIG9mIHRoZSBmaWxlLgorICAgICAgICAqLworICAgICAgIGNhc2UgNDogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi9tb3ZlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIHVybCA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICB0aGlzLm1vdmUgKGFvU2VzcywgdXJsKTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIERlbGV0ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIHVybCB0aGUgdXJsIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICAgICAgIGNhc2UgNTogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi9kZWxldGVGb3JJbnN0YW5jZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyB1cmwgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIHRoaXMuZGVsZXRlRm9ySW5zdGFuY2UgKGFvU2VzcywgdXJsLCBhaWQsIGlpZCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBNb3ZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKiBTcGVjaWZ5IHRoZSBBcHBsaWNhdGlvbkVsZW1lbnQgaWQgYW5kIHRoZSBJbnN0YW5jZUVsZW1lbnQgaWQKKyAgICAgICAgKiBvZiB0aGUgY29tcG9uZW50IHRoYXQgaG9sZHMgdGhlIGV4dGVybmFsIHJlZmVyZW5jZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDY6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvbW92ZUZvckluc3RhbmNlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIHRoaXMubW92ZUZvckluc3RhbmNlIChhb1Nlc3MsIG5hbWUsIGFpZCwgaWlkKTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqLworICAgICAgIGNhc2UgNzogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi9nZXRCeVNvY2tldAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyBob3N0ID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIGludCBhUG9ydCA9IGluLnJlYWRfbG9uZyAoKTsKKyAgICAgICAgICAgdGhpcy5nZXRCeVNvY2tldCAoYW9TZXNzLCBuYW1lLCBob3N0LCBhUG9ydCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSB1cmwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICBjYXNlIDg6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBpbnQgYVBvcnQgPSBpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgIHRoaXMuZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCwgaG9zdCwgYVBvcnQpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICAqIFNhdmUgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAgKi8KKyAgICAgICBjYXNlIDk6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvc2F2ZUJ5U29ja2V0CisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBpbnQgYVBvcnQgPSBpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMuc2F2ZUJ5U29ja2V0IChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgaG9zdCwgYVBvcnQpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgb3V0LndyaXRlX3N0cmluZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAgKiBTYXZlIHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAgKi8KKyAgICAgICBjYXNlIDEwOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL3NhdmVGb3JJbnN0YW5jZUJ5U29ja2V0CisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgaW50IGFQb3J0ID0gaW4ucmVhZF9sb25nICgpOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLnNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgYWlkLCBpaWQsIGhvc3QsIGFQb3J0KTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICAgIG91dC53cml0ZV9zdHJpbmcgKCRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgICogU2F2ZSB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAgKiBAcGFyYW0gIGFlTmFtZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gIGllTmFtZSB0aGUgaW5zdGFuY2UgZWxlbWVudCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICAqLworICAgICAgIGNhc2UgMTE6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvc2F2ZUZvckluc3RhbmNlTmFtZUJ5U29ja2V0CisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBTdHJpbmcgYWVOYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyBpZU5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgaW50IGFQb3J0ID0gaW4ucmVhZF9sb25nICgpOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLnNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCAoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIGFlTmFtZSwgaWVOYW1lLCBob3N0LCBhUG9ydCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfc3RyaW5nICgkcmVzdWx0KTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogUmVhZCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqLworICAgICAgIGNhc2UgMTI6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvcmVhZAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGICRyZXN1bHQgPSBudWxsOworICAgICAgICAgICAkcmVzdWx0ID0gdGhpcy5yZWFkIChhb1Nlc3MsIG5hbWUpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIud3JpdGUgKG91dCwgJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIFJlYWQgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDEzOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL3JlYWRGb3JJbnN0YW5jZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiAkcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMucmVhZEZvckluc3RhbmNlIChhb1Nlc3MsIG5hbWUsIGFpZCwgaWlkKTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLndyaXRlIChvdXQsICRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiAgR2V0IHNpemUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqLworICAgICAgIGNhc2UgMTQ6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0U2l6ZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIGxvbmcgJHJlc3VsdCA9IChsb25nKTA7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldFNpemUgKGFvU2VzcywgbmFtZSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfbG9uZ2xvbmcgKCRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiAgR2V0IHNpemUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqLworICAgICAgIGNhc2UgMTU6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0U2l6ZUZvckluc3RhbmNlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIGxvbmcgJHJlc3VsdCA9IChsb25nKTA7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldFNpemVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfbG9uZ2xvbmcgKCRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydCBhIHRlcm1pbmF0aW9uIHByb2Nlc3MuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBwYXJhbWV0ZXIgdGhlIHBhcmFtZXRlciBzdHJpbmcuIFRoZSBjb250ZW50IGRlcGVuZHMgb24gdGhlCisgICAgICAgICogICAgICAgICBzZXJ2ZXIgc2lkZSB0ZXJtaW5hdGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgICovCisgICAgICAgY2FzZSAxNjogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi90ZXJtaW5hdGUKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIHRoaXMudGVybWluYXRlIChhb1Nlc3MsIG5hbWUsIHBhcmFtZXRlcik7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydCBhIHRlcm1pbmF0aW9uIHByb2Nlc3MuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBwYXJhbWV0ZXIgdGhlIHBhcmFtZXRlciBzdHJpbmcuIFRoZSBjb250ZW50IGRlcGVuZHMgb24gdGhlCisgICAgICAgICogICAgICAgICBzZXJ2ZXIgc2lkZSB0ZXJtaW5hdGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgICovCisgICAgICAgY2FzZSAxNzogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi90ZXJtaW5hdGVGb3JJbnN0YW5jZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIHRoaXMudGVybWluYXRlRm9ySW5zdGFuY2UgKGFvU2VzcywgbmFtZSwgYWlkLCBpaWQsIHBhcmFtZXRlcik7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGhvc3Qgd2hlcmUgdGhlIHNlcnZlciBpcyBydW5uaW5nCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSBob3N0bmFtZQorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqLworICAgICAgIGNhc2UgMTg6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0SG9zdG5hbWUKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldEhvc3RuYW1lIChhb1Nlc3MpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgb3V0LndyaXRlX3N0cmluZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIEdldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEByZXR1cm4gdGhlIGNvbnRleHQgdmFsdWUKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlksCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfRk9VTkQKKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDE5OiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL2dldENvbnRleHQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcga2V5ID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMuZ2V0Q29udGV4dCAoYW9TZXNzLCBrZXkpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgb3V0LndyaXRlX3N0cmluZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIFNldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDIwOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL3NldENvbnRleHQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcga2V5ID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICB0aGlzLnNldENvbnRleHQgKGFvU2Vzcywga2V5LCB2YWx1ZSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBSZW1vdmUgYSBjb250ZXh0IHZhcmlhYmxlLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5d29yZCBvZiB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDIxOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL3JlbW92ZUNvbnRleHQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcga2V5ID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIHRoaXMucmVtb3ZlQ29udGV4dCAoYW9TZXNzLCBrZXkpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogTGlzdCBhbGwgY29udGV4dCBrZXl3b3Jkcy4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEByZXR1cm4gYSBzZXF1ZW5jZSBvZiBzdHJpbmdzLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqLworICAgICAgIGNhc2UgMjI6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvbGlzdENvbnRleHQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdFtdID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMubGlzdENvbnRleHQgKGFvU2Vzcyk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfU1RSSU5HSGVscGVyLndyaXRlIChvdXQsICRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIENvcmJhRmlsZVNlcnZlcklGLgorICAgICAgICAqIFJldHVybnMgZ2V0VmVyc2lvbiBvZiBDb3JiYUZpbGVTZXJ2ZXIuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEByZXR1cm4gIFRoZSBpbnRlcmZhY2UgdmVyc2lvbiBvZiB0aGUgQ29yYmFGaWxlU2VydmVySUYuCisgICAgICAgICoKKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDIzOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL2dldEludGVyZmFjZVZlcnNpb24KKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldEludGVyZmFjZVZlcnNpb24gKCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfc3RyaW5nICgkcmVzdWx0KTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBsb25nIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlIGxlbmd0aAorICAgICAgICAqIG9mIHRoZSBmaWxlcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIFN0cmluZyBhcnJheS4KKyAgICAgICAgKiBUaGUgb3JkZXIgb2YgdGhlIGxvbmcgdmFsdWVzIG11c3QgbWF0Y2ggd2l0aCB0aGUgb3JkZXIKKyAgICAgICAgKiBvZiB0aGUgZmlsZW5hbWVzLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIGFvU2VzcyB0aGUgYW9TZXNzaW9uIG9mIHRoZSBjYWxsZXIKKyAgICAgICAgKiBAcGFyYW0gbmFtZXMgdGhlIFN0cmluZyBhcnJheSBvZiBmaWxlbmFtZXMgZm9yIAorICAgICAgICAqICAgICAgICAgICAgICB3aGljaCB0byBnZXQgdGhlIHNpemVzCisgICAgICAgICogQHJldHVybiBhbiBBcnJheSBvZiBsb25nIHZhbHVlcyBjb250YWluaW5nIHRoZSBmaWxlIHNpemVzCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKgorICAgICAgICAqLworICAgICAgIGNhc2UgMjQ6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0U2l6ZXMKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgbmFtZXNbXSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19TVFJJTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBsb25nICRyZXN1bHRbXSA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldFNpemVzIChhb1Nlc3MsIG5hbWVzKTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5MT05HX0FSUkFZSGVscGVyLndyaXRlIChvdXQsICRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuQkFEX09QRVJBVElPTiAoMCwgb3JnLm9tZy5DT1JCQS5Db21wbGV0aW9uU3RhdHVzLkNPTVBMRVRFRF9NQVlCRSk7CisgICAgfQorCisgICAgcmV0dXJuIG91dDsKKyAgfSAvLyBfaW52b2tlCisKKyAgLy8gVHlwZS1zcGVjaWZpYyBDT1JCQTo6T2JqZWN0IG9wZXJhdGlvbnMKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gX19pZHMgPSB7CisgICAgIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUY6MS4wIn07CisKKyAgcHVibGljIFN0cmluZ1tdIF9hbGxfaW50ZXJmYWNlcyAob3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0EgcG9hLCBieXRlW10gb2JqZWN0SWQpCisgIHsKKyAgICByZXR1cm4gKFN0cmluZ1tdKV9faWRzLmNsb25lICgpOworICB9CisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlcklGIF90aGlzKCkgCisgIHsKKyAgICByZXR1cm4gQ09SQkFGaWxlU2VydmVySUZIZWxwZXIubmFycm93KAorICAgIHN1cGVyLl90aGlzX29iamVjdCgpKTsKKyAgfQorCisgIHB1YmxpYyBDT1JCQUZpbGVTZXJ2ZXJJRiBfdGhpcyhvcmcub21nLkNPUkJBLk9SQiBvcmIpIAorICB7CisgICAgcmV0dXJuIENPUkJBRmlsZVNlcnZlcklGSGVscGVyLm5hcnJvdygKKyAgICBzdXBlci5fdGhpc19vYmplY3Qob3JiKSk7CisgIH0KKworCit9IC8vIGNsYXNzIENPUkJBRmlsZVNlcnZlcklGUE9BCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZQT0FUaWUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRlBPQVRpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2M2U5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZQT0FUaWUuamF2YQpAQCAtMCwwICsxLDYyMyBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRlBPQVRpZS5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGNsYXNzIENPUkJBRmlsZVNlcnZlcklGUE9BVGllIGV4dGVuZHMgQ09SQkFGaWxlU2VydmVySUZQT0EKK3sKKworICAvLyBDb25zdHJ1Y3RvcnMKKworICBwdWJsaWMgQ09SQkFGaWxlU2VydmVySUZQT0FUaWUgKCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUZPcGVyYXRpb25zIGRlbGVnYXRlICkgeworICAgICAgdGhpcy5faW1wbCA9IGRlbGVnYXRlOworICB9CisgIHB1YmxpYyBDT1JCQUZpbGVTZXJ2ZXJJRlBPQVRpZSAoIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMgZGVsZWdhdGUgLCBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQSBwb2EgKSB7CisgICAgICB0aGlzLl9pbXBsID0gZGVsZWdhdGU7CisgICAgICB0aGlzLl9wb2EgICAgICA9IHBvYTsKKyAgfQorICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucyBfZGVsZWdhdGUoKSB7CisgICAgICByZXR1cm4gdGhpcy5faW1wbDsKKyAgfQorICBwdWJsaWMgdm9pZCBfZGVsZWdhdGUgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMgZGVsZWdhdGUgKSB7CisgICAgICB0aGlzLl9pbXBsID0gZGVsZWdhdGU7CisgIH0KKyAgcHVibGljIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BIF9kZWZhdWx0X1BPQSgpIHsKKyAgICAgIGlmKF9wb2EgIT0gbnVsbCkgeworICAgICAgICAgIHJldHVybiBfcG9hOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHN1cGVyLl9kZWZhdWx0X1BPQSgpOworICAgICAgfQorICB9CisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgcHVibGljIFN0cmluZyBzYXZlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIHJldHVybiBfaW1wbC5zYXZlKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBzdHJlYW0pOworICB9IC8vIHNhdmUKKworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuc2F2ZUZvckluc3RhbmNlKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhaWQsIGlpZCwgc3RyZWFtKTsKKyAgfSAvLyBzYXZlRm9ySW5zdGFuY2UKKworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqIFNwZWNpZnkgdGhlIG5hbWUgb2YgYW4gYXBwbGNpYXRpb24gZWxlbWVudCBhbmQgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQKKyAgICAgICAgKiB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UKKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgKiBAcGFyYW0gIGFlTmFtZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICAqIEBwYXJhbSAgaWVOYW1lIHRoZSBpbnN0YW5jZSBlbGVtZW50IG5hbWUuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgcHVibGljIFN0cmluZyBzYXZlRm9ySW5zdGFuY2VOYW1lIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIFN0cmluZyBhZU5hbWUsIFN0cmluZyBpZU5hbWUsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIHJldHVybiBfaW1wbC5zYXZlRm9ySW5zdGFuY2VOYW1lKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhZU5hbWUsIGllTmFtZSwgc3RyZWFtKTsKKyAgfSAvLyBzYXZlRm9ySW5zdGFuY2VOYW1lCisKKworICAvKioKKyAgICAgICAgKiBEZWxldGUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBkZWxldGUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLmRlbGV0ZShhb1Nlc3MsIG5hbWUpOworICB9IC8vIGRlbGV0ZQorCisKKyAgLyoqCisgICAgICAgICogTW92ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIHVybG8gdGhlIHVybCBvZiB0aGUgZmlsZS4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgbW92ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyB1cmwpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICBfaW1wbC5tb3ZlKGFvU2VzcywgdXJsKTsKKyAgfSAvLyBtb3ZlCisKKworICAvKioKKyAgICAgICAgKiBEZWxldGUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICB1cmwgdGhlIHVybCBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgZGVsZXRlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgdXJsLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLmRlbGV0ZUZvckluc3RhbmNlKGFvU2VzcywgdXJsLCBhaWQsIGlpZCk7CisgIH0gLy8gZGVsZXRlRm9ySW5zdGFuY2UKKworCisgIC8qKgorICAgICAgICAqIE1vdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBtb3ZlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICBfaW1wbC5tb3ZlRm9ySW5zdGFuY2UoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCk7CisgIH0gLy8gbW92ZUZvckluc3RhbmNlCisKKworICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgZ2V0QnlTb2NrZXQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLmdldEJ5U29ja2V0KGFvU2VzcywgbmFtZSwgaG9zdCwgYVBvcnQpOworICB9IC8vIGdldEJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSB1cmwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLmdldEZvckluc3RhbmNlQnlTb2NrZXQoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCwgaG9zdCwgYVBvcnQpOworICB9IC8vIGdldEZvckluc3RhbmNlQnlTb2NrZXQKKworCisgIC8qKgorICAgICAgICAgKiBTYXZlIHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUJ5U29ja2V0IChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIFN0cmluZyBob3N0LCBpbnQgYVBvcnQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuc2F2ZUJ5U29ja2V0KGFvU2VzcywgbmFtZSwgc3ViRGlyLCBob3N0LCBhUG9ydCk7CisgIH0gLy8gc2F2ZUJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgICogU2F2ZSB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUZvckluc3RhbmNlQnlTb2NrZXQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN1YkRpciwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIFN0cmluZyBob3N0LCBpbnQgYVBvcnQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuc2F2ZUZvckluc3RhbmNlQnlTb2NrZXQoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIGFpZCwgaWlkLCBob3N0LCBhUG9ydCk7CisgIH0gLy8gc2F2ZUZvckluc3RhbmNlQnlTb2NrZXQKKworCisgIC8qKgorICAgICAgICAgKiBTYXZlIHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICAqIEBwYXJhbSAgYWVOYW1lIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuCisgICAgICAgICAqIEBwYXJhbSAgaWVOYW1lIHRoZSBpbnN0YW5jZSBlbGVtZW50IG5hbWUuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUZvckluc3RhbmNlTmFtZUJ5U29ja2V0IChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIFN0cmluZyBhZU5hbWUsIFN0cmluZyBpZU5hbWUsIFN0cmluZyBob3N0LCBpbnQgYVBvcnQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuc2F2ZUZvckluc3RhbmNlTmFtZUJ5U29ja2V0KGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhZU5hbWUsIGllTmFtZSwgaG9zdCwgYVBvcnQpOworICB9IC8vIHNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldAorCisKKyAgLyoqCisgICAgICAgICogUmVhZCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqLworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgcmVhZCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLnJlYWQoYW9TZXNzLCBuYW1lKTsKKyAgfSAvLyByZWFkCisKKworICAvKioKKyAgICAgICAgKiBSZWFkIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICovCisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiByZWFkRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwucmVhZEZvckluc3RhbmNlKGFvU2VzcywgbmFtZSwgYWlkLCBpaWQpOworICB9IC8vIHJlYWRGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogIEdldCBzaXplIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHNpemUgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0U2l6ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLmdldFNpemUoYW9TZXNzLCBuYW1lKTsKKyAgfSAvLyBnZXRTaXplCisKKworICAvKioKKyAgICAgICAgKiAgR2V0IHNpemUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqLworICBwdWJsaWMgbG9uZyBnZXRTaXplRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuZ2V0U2l6ZUZvckluc3RhbmNlKGFvU2VzcywgbmFtZSwgYWlkLCBpaWQpOworICB9IC8vIGdldFNpemVGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBieSB0aGUgY2xpZW50IHdoZW4gdGhlIHNlcnZlciBzaG91bGQgYmUgc3RhcnQgYSB0ZXJtaW5hdGlvbiBwcm9jZXNzLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgcGFyYW1ldGVyIHRoZSBwYXJhbWV0ZXIgc3RyaW5nLiBUaGUgY29udGVudCBkZXBlbmRzIG9uIHRoZQorICAgICAgICAqICAgICAgICAgc2VydmVyIHNpZGUgdGVybWluYXRlIGltcGxlbWVudGF0aW9uLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmFtZXRlcikgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLnRlcm1pbmF0ZShhb1Nlc3MsIG5hbWUsIHBhcmFtZXRlcik7CisgIH0gLy8gdGVybWluYXRlCisKKworICAvKioKKyAgICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydCBhIHRlcm1pbmF0aW9uIHByb2Nlc3MuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBwYXJhbWV0ZXIgdGhlIHBhcmFtZXRlciBzdHJpbmcuIFRoZSBjb250ZW50IGRlcGVuZHMgb24gdGhlCisgICAgICAgICogICAgICAgICBzZXJ2ZXIgc2lkZSB0ZXJtaW5hdGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkLCBTdHJpbmcgcGFyYW1ldGVyKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgX2ltcGwudGVybWluYXRlRm9ySW5zdGFuY2UoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCwgcGFyYW1ldGVyKTsKKyAgfSAvLyB0ZXJtaW5hdGVGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBob3N0IHdoZXJlIHRoZSBzZXJ2ZXIgaXMgcnVubmluZworICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHJldHVybiB0aGUgaG9zdG5hbWUKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRIb3N0bmFtZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuZ2V0SG9zdG5hbWUoYW9TZXNzKTsKKyAgfSAvLyBnZXRIb3N0bmFtZQorCisKKyAgLyoqCisgICAgICAgICogR2V0IGEgY29udGV4dCB2YXJpYWJsZS4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleXdvcmQgb2YgdGhlIGNvbnRleHQgdmFsdWUuCisgICAgICAgICogQHJldHVybiB0aGUgY29udGV4dCB2YWx1ZQorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWSwKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9GT1VORAorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcga2V5KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLmdldENvbnRleHQoYW9TZXNzLCBrZXkpOworICB9IC8vIGdldENvbnRleHQKKworCisgIC8qKgorICAgICAgICAqIFNldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLnNldENvbnRleHQoYW9TZXNzLCBrZXksIHZhbHVlKTsKKyAgfSAvLyBzZXRDb250ZXh0CisKKworICAvKioKKyAgICAgICAgKiBSZW1vdmUgYSBjb250ZXh0IHZhcmlhYmxlLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5d29yZCBvZiB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXkpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICBfaW1wbC5yZW1vdmVDb250ZXh0KGFvU2Vzcywga2V5KTsKKyAgfSAvLyByZW1vdmVDb250ZXh0CisKKworICAvKioKKyAgICAgICAgKiBMaXN0IGFsbCBjb250ZXh0IGtleXdvcmRzLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHJldHVybiBhIHNlcXVlbmNlIG9mIHN0cmluZ3MuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBsaXN0Q29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwubGlzdENvbnRleHQoYW9TZXNzKTsKKyAgfSAvLyBsaXN0Q29udGV4dAorCisKKyAgLyoqCisgICAgICAgICogR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBDb3JiYUZpbGVTZXJ2ZXJJRi4KKyAgICAgICAgKiBSZXR1cm5zIGdldFZlcnNpb24gb2YgQ29yYmFGaWxlU2VydmVyLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcmV0dXJuICBUaGUgaW50ZXJmYWNlIHZlcnNpb24gb2YgdGhlIENvcmJhRmlsZVNlcnZlcklGLgorICAgICAgICAqCisgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlVmVyc2lvbiAoKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLmdldEludGVyZmFjZVZlcnNpb24oKTsKKyAgfSAvLyBnZXRJbnRlcmZhY2VWZXJzaW9uCisKKworICAvKioKKyAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxvbmcgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUgbGVuZ3RoCisgICAgICAgICogb2YgdGhlIGZpbGVzIHRoYXQgd2VyZSBwcm92aWRlZCBpbiB0aGUgU3RyaW5nIGFycmF5LgorICAgICAgICAqIFRoZSBvcmRlciBvZiB0aGUgbG9uZyB2YWx1ZXMgbXVzdCBtYXRjaCB3aXRoIHRoZSBvcmRlcgorICAgICAgICAqIG9mIHRoZSBmaWxlbmFtZXMuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gYW9TZXNzIHRoZSBhb1Nlc3Npb24gb2YgdGhlIGNhbGxlcgorICAgICAgICAqIEBwYXJhbSBuYW1lcyB0aGUgU3RyaW5nIGFycmF5IG9mIGZpbGVuYW1lcyBmb3IgCisgICAgICAgICogICAgICAgICAgICAgIHdoaWNoIHRvIGdldCB0aGUgc2l6ZXMKKyAgICAgICAgKiBAcmV0dXJuIGFuIEFycmF5IG9mIGxvbmcgdmFsdWVzIGNvbnRhaW5pbmcgdGhlIGZpbGUgc2l6ZXMKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqCisgICAgICAgICovCisgIHB1YmxpYyBsb25nW10gZ2V0U2l6ZXMgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmdbXSBuYW1lcykgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIHJldHVybiBfaW1wbC5nZXRTaXplcyhhb1Nlc3MsIG5hbWVzKTsKKyAgfSAvLyBnZXRTaXplcworCisgIHByaXZhdGUgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucyBfaW1wbDsKKyAgcHJpdmF0ZSBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQSBfcG9hOworCit9IC8vIGNsYXNzIENPUkJBRmlsZVNlcnZlcklGUE9BVGllCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfQllURUhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX0JZVEVIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmE5YjYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX0JZVEVIZWxwZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX0JZVEVIZWxwZXIuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBEU19CWVRFSGVscGVyCit7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyAgX2lkID0gIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfQllURToxLjAiOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnQgKG9yZy5vbWcuQ09SQkEuQW55IGEsIGJ5dGVbXSB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBieXRlW10gZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmdldF9wcmltaXRpdmVfdGMgKG9yZy5vbWcuQ09SQkEuVENLaW5kLnRrX29jdGV0KTsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9zZXF1ZW5jZV90YyAoMCwgX190eXBlQ29kZSk7CisgICAgICBfX3R5cGVDb2RlID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5jcmVhdGVfYWxpYXNfdGMgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSGVscGVyLmlkICgpLCAiRFNfQllURSIsIF9fdHlwZUNvZGUpOworICAgIH0KKyAgICByZXR1cm4gX190eXBlQ29kZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkICgpCisgIHsKKyAgICByZXR1cm4gX2lkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBieXRlW10gcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpc3RyZWFtKQorICB7CisgICAgYnl0ZSB2YWx1ZVtdID0gbnVsbDsKKyAgICBpbnQgX2xlbjAgPSBpc3RyZWFtLnJlYWRfbG9uZyAoKTsKKyAgICB2YWx1ZSA9IG5ldyBieXRlW19sZW4wXTsKKyAgICBpc3RyZWFtLnJlYWRfb2N0ZXRfYXJyYXkgKHZhbHVlLCAwLCBfbGVuMCk7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBieXRlW10gdmFsdWUpCisgIHsKKyAgICBvc3RyZWFtLndyaXRlX2xvbmcgKHZhbHVlLmxlbmd0aCk7CisgICAgb3N0cmVhbS53cml0ZV9vY3RldF9hcnJheSAodmFsdWUsIDAsIHZhbHVlLmxlbmd0aCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX0JZVEVIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19CWVRFSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhODVmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19CWVRFSG9sZGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19CWVRFSG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRFNfQllURUhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgYnl0ZSB2YWx1ZVtdID0gbnVsbDsKKworICBwdWJsaWMgRFNfQllURUhvbGRlciAoKQorICB7CisgIH0KKworICBwdWJsaWMgRFNfQllURUhvbGRlciAoYnl0ZVtdIGluaXRpYWxWYWx1ZSkKKyAgeworICAgIHZhbHVlID0gaW5pdGlhbFZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgX3JlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaSkKKyAgeworICAgIHZhbHVlID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX0JZVEVIZWxwZXIucmVhZCAoaSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBfd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG8pCisgIHsKKyAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfQllURUhlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfQllURUhlbHBlci50eXBlICgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19TVFJJTkdIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19TVFJJTkdIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJlOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX1NUUklOR0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfU1RSSU5HSGVscGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgRFNfU1RSSU5HSGVscGVyCit7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyAgX2lkID0gIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfU1RSSU5HOjEuMCI7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydCAob3JnLm9tZy5DT1JCQS5BbnkgYSwgU3RyaW5nW10gdGhhdCkKKyAgeworICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG91dCA9IGEuY3JlYXRlX291dHB1dF9zdHJlYW0gKCk7CisgICAgYS50eXBlICh0eXBlICgpKTsKKyAgICB3cml0ZSAob3V0LCB0aGF0KTsKKyAgICBhLnJlYWRfdmFsdWUgKG91dC5jcmVhdGVfaW5wdXRfc3RyZWFtICgpLCB0eXBlICgpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9zdHJpbmdfdGMgKDApOworICAgICAgX190eXBlQ29kZSA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKCkuY3JlYXRlX3NlcXVlbmNlX3RjICgwLCBfX3R5cGVDb2RlKTsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9hbGlhc190YyAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX1NUUklOR0hlbHBlci5pZCAoKSwgIkRTX1NUUklORyIsIF9fdHlwZUNvZGUpOworICAgIH0KKyAgICByZXR1cm4gX190eXBlQ29kZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkICgpCisgIHsKKyAgICByZXR1cm4gX2lkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSByZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGlzdHJlYW0pCisgIHsKKyAgICBTdHJpbmcgdmFsdWVbXSA9IG51bGw7CisgICAgaW50IF9sZW4wID0gaXN0cmVhbS5yZWFkX2xvbmcgKCk7CisgICAgdmFsdWUgPSBuZXcgU3RyaW5nW19sZW4wXTsKKyAgICBmb3IgKGludCBfbzEgPSAwO19vMSA8IHZhbHVlLmxlbmd0aDsgKytfbzEpCisgICAgICB2YWx1ZVtfbzFdID0gaXN0cmVhbS5yZWFkX3N0cmluZyAoKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG9zdHJlYW0sIFN0cmluZ1tdIHZhbHVlKQorICB7CisgICAgb3N0cmVhbS53cml0ZV9sb25nICh2YWx1ZS5sZW5ndGgpOworICAgIGZvciAoaW50IF9pMCA9IDA7X2kwIDwgdmFsdWUubGVuZ3RoOyArK19pMCkKKyAgICAgIG9zdHJlYW0ud3JpdGVfc3RyaW5nICh2YWx1ZVtfaTBdKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfU1RSSU5HSG9sZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfU1RSSU5HSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3YmFjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19TVFJJTkdIb2xkZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX1NUUklOR0hvbGRlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGZpbmFsIGNsYXNzIERTX1NUUklOR0hvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgU3RyaW5nIHZhbHVlW10gPSBudWxsOworCisgIHB1YmxpYyBEU19TVFJJTkdIb2xkZXIgKCkKKyAgeworICB9CisKKyAgcHVibGljIERTX1NUUklOR0hvbGRlciAoU3RyaW5nW10gaW5pdGlhbFZhbHVlKQorICB7CisgICAgdmFsdWUgPSBpbml0aWFsVmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBfcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpKQorICB7CisgICAgdmFsdWUgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfU1RSSU5HSGVscGVyLnJlYWQgKGkpOworICB9CisKKyAgcHVibGljIHZvaWQgX3dyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX1NUUklOR0hlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfU1RSSU5HSGVscGVyLnR5cGUgKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjgzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRXJyb3JDb2RlLmphdmEKQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9FcnJvckNvZGUuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKKworLyoqCisgICAqIFRoZSBlcnJvciBjb2RlLgorICAgKi8KK3B1YmxpYyBjbGFzcyBFcnJvckNvZGUgaW1wbGVtZW50cyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklETEVudGl0eQoreworICBwcml2YXRlICAgICAgICBpbnQgX192YWx1ZTsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IF9fc2l6ZSA9IDE1OworICBwcml2YXRlIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlW10gX19hcnJheSA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIFtfX3NpemVdOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0FTQU1PRFNfRVhDRVBUSU9OID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfQVNBTU9EU19FWENFUFRJT04gPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9BU0FNT0RTX0VYQ0VQVElPTik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0FDQ0VTU19ERU5JRUQgPSAxOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgRklMRVNFUlZFUl9BQ0NFU1NfREVOSUVEID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfQUNDRVNTX0RFTklFRCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0ZJTEVfTk9UX0ZPVU5EID0gMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfRklMRV9OT1RfRk9VTkQgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9GSUxFX05PVF9GT1VORCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0lPX0VYQ0VQVElPTiA9IDM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX0lPX0VYQ0VQVElPTiA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX0lPX0VYQ0VQVElPTik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0lORk9STUFUSU9OID0gNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfSU5GT1JNQVRJT04gPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9JTkZPUk1BVElPTik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIgPSA1OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX01JU1NJTkdfUEFSQU1FVEVSID0gNjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfTUlTU0lOR19QQVJBTUVURVIgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9NSVNTSU5HX1BBUkFNRVRFUik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVEID0gNzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0NPTk5FQ1RfUkVGVVNFRCA9IDg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX0NPTk5FQ1RfUkVGVVNFRCA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX0NPTk5FQ1RfUkVGVVNFRCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVCA9IDk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVCA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0gPSAxMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTSA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0pOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQgPSAxMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVEID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVEKTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgX0ZJTEVTRVJWRVJfTk9fTUVNT1JZID0gMTI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX05PX01FTU9SWSA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX05PX01FTU9SWSk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX05VTExfUEFSQU1FVEVSID0gMTM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX05VTExfUEFSQU1FVEVSID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfTlVMTF9QQVJBTUVURVIpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfRklMRVNFUlZFUl9OT1RfRk9VTkQgPSAxNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfTk9UX0ZPVU5EID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfTk9UX0ZPVU5EKTsKKworICBwdWJsaWMgaW50IHZhbHVlICgpCisgIHsKKyAgICByZXR1cm4gX192YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBmcm9tX2ludCAoaW50IHZhbHVlKQorICB7CisgICAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPCBfX3NpemUpCisgICAgICByZXR1cm4gX19hcnJheVt2YWx1ZV07CisgICAgZWxzZQorICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuQkFEX1BBUkFNICgpOworICB9CisKKyAgcHJvdGVjdGVkIEVycm9yQ29kZSAoaW50IHZhbHVlKQorICB7CisgICAgX192YWx1ZSA9IHZhbHVlOworICAgIF9fYXJyYXlbX192YWx1ZV0gPSB0aGlzOworICB9Cit9IC8vIGNsYXNzIEVycm9yQ29kZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZUhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmM1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRXJyb3JDb2RlSGVscGVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9FcnJvckNvZGVIZWxwZXIuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKKworLyoqCisgICAqIFRoZSBlcnJvciBjb2RlLgorICAgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBFcnJvckNvZGVIZWxwZXIKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICBfaWQgPSAiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9FcnJvckNvZGU6MS4wIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0IChvcmcub21nLkNPUkJBLkFueSBhLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIHRoYXQpCisgIHsKKyAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXQgPSBhLmNyZWF0ZV9vdXRwdXRfc3RyZWFtICgpOworICAgIGEudHlwZSAodHlwZSAoKSk7CisgICAgd3JpdGUgKG91dCwgdGhhdCk7CisgICAgYS5yZWFkX3ZhbHVlIChvdXQuY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgdHlwZSAoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9lbnVtX3RjIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlSGVscGVyLmlkICgpLCAiRXJyb3JDb2RlIiwgbmV3IFN0cmluZ1tdIHsgIkZJTEVTRVJWRVJfQVNBTU9EU19FWENFUFRJT04iLCAiRklMRVNFUlZFUl9BQ0NFU1NfREVOSUVEIiwgIkZJTEVTRVJWRVJfRklMRV9OT1RfRk9VTkQiLCAiRklMRVNFUlZFUl9JT19FWENFUFRJT04iLCAiRklMRVNFUlZFUl9JTkZPUk1BVElPTiIsICJGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIiLCAiRklMRVNFUlZFUl9NSVNTSU5HX1BBUkFNRVRFUiIsICJGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVEIiwgIkZJTEVTRVJWRVJfQ09OTkVDVF9SRUZVU0VEIiwgIkZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUIiwgIkZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTSIsICJGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRCIsICJGSUxFU0VSVkVSX05PX01FTU9SWSIsICJGSUxFU0VSVkVSX05VTExfUEFSQU1FVEVSIiwgIkZJTEVTRVJWRVJfTk9UX0ZPVU5EIn0gKTsKKyAgICB9CisgICAgcmV0dXJuIF9fdHlwZUNvZGU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBpZCAoKQorICB7CisgICAgcmV0dXJuIF9pZDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSByZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGlzdHJlYW0pCisgIHsKKyAgICByZXR1cm4gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZS5mcm9tX2ludCAoaXN0cmVhbS5yZWFkX2xvbmcgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIHZhbHVlKQorICB7CisgICAgb3N0cmVhbS53cml0ZV9sb25nICh2YWx1ZS52YWx1ZSAoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZUhvbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmIxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRXJyb3JDb2RlSG9sZGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRXJyb3JDb2RlSG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCisKKy8qKgorICAgKiBUaGUgZXJyb3IgY29kZS4KKyAgICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXJyb3JDb2RlSG9sZGVyIGltcGxlbWVudHMgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5TdHJlYW1hYmxlCit7CisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIHZhbHVlID0gbnVsbDsKKworICBwdWJsaWMgRXJyb3JDb2RlSG9sZGVyICgpCisgIHsKKyAgfQorCisgIHB1YmxpYyBFcnJvckNvZGVIb2xkZXIgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgaW5pdGlhbFZhbHVlKQorICB7CisgICAgdmFsdWUgPSBpbml0aWFsVmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBfcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpKQorICB7CisgICAgdmFsdWUgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlSGVscGVyLnJlYWQgKGkpOworICB9CisKKyAgcHVibGljIHZvaWQgX3dyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZUhlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlSGVscGVyLnR5cGUgKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUYuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzZTg1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgaW50ZXJmYWNlIElucHV0U3RyZWFtSUYgZXh0ZW5kcyBJbnB1dFN0cmVhbUlGT3BlcmF0aW9ucywgb3JnLm9tZy5DT1JCQS5PYmplY3QsIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSURMRW50aXR5IAoreworfSAvLyBpbnRlcmZhY2UgSW5wdXRTdHJlYW1JRgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZGMyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGSGVscGVyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGSGVscGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgSW5wdXRTdHJlYW1JRkhlbHBlcgoreworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgIF9pZCA9ICJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUY6MS4wIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0IChvcmcub21nLkNPUkJBLkFueSBhLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBleHRyYWN0IChvcmcub21nLkNPUkJBLkFueSBhKQorICB7CisgICAgcmV0dXJuIHJlYWQgKGEuY3JlYXRlX2lucHV0X3N0cmVhbSAoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF9fdHlwZUNvZGUgPSBudWxsOworICBzeW5jaHJvbml6ZWQgcHVibGljIHN0YXRpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIHR5cGUgKCkKKyAgeworICAgIGlmIChfX3R5cGVDb2RlID09IG51bGwpCisgICAgeworICAgICAgX190eXBlQ29kZSA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKCkuY3JlYXRlX2ludGVyZmFjZV90YyAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIuaWQgKCksICJJbnB1dFN0cmVhbUlGIik7CisgICAgfQorICAgIHJldHVybiBfX3R5cGVDb2RlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWQgKCkKKyAgeworICAgIHJldHVybiBfaWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHJlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaXN0cmVhbSkKKyAgeworICAgIHJldHVybiBuYXJyb3cgKGlzdHJlYW0ucmVhZF9PYmplY3QgKF9JbnB1dFN0cmVhbUlGU3R1Yi5jbGFzcykpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiB2YWx1ZSkKKyAgeworICAgIG9zdHJlYW0ud3JpdGVfT2JqZWN0ICgob3JnLm9tZy5DT1JCQS5PYmplY3QpIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgbmFycm93IChvcmcub21nLkNPUkJBLk9iamVjdCBvYmopCisgIHsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gbnVsbDsKKyAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRikKKyAgICAgIHJldHVybiAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYpb2JqOworICAgIGVsc2UgaWYgKCFvYmouX2lzX2EgKGlkICgpKSkKKyAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLkJBRF9QQVJBTSAoKTsKKyAgICBlbHNlCisgICAgeworICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5EZWxlZ2F0ZSBkZWxlZ2F0ZSA9ICgob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PYmplY3RJbXBsKW9iaikuX2dldF9kZWxlZ2F0ZSAoKTsKKyAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5fSW5wdXRTdHJlYW1JRlN0dWIgc3R1YiA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuX0lucHV0U3RyZWFtSUZTdHViICgpOworICAgICAgc3R1Yi5fc2V0X2RlbGVnYXRlKGRlbGVnYXRlKTsKKyAgICAgIHJldHVybiBzdHViOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgdW5jaGVja2VkX25hcnJvdyAob3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqKQorICB7CisgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgcmV0dXJuIG51bGw7CisgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYpCisgICAgICByZXR1cm4gKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGKW9iajsKKyAgICBlbHNlCisgICAgeworICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5EZWxlZ2F0ZSBkZWxlZ2F0ZSA9ICgob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PYmplY3RJbXBsKW9iaikuX2dldF9kZWxlZ2F0ZSAoKTsKKyAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5fSW5wdXRTdHJlYW1JRlN0dWIgc3R1YiA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuX0lucHV0U3RyZWFtSUZTdHViICgpOworICAgICAgc3R1Yi5fc2V0X2RlbGVnYXRlKGRlbGVnYXRlKTsKKyAgICAgIHJldHVybiBzdHViOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRkhvbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQ1ODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZIb2xkZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGSG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSW5wdXRTdHJlYW1JRkhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgdmFsdWUgPSBudWxsOworCisgIHB1YmxpYyBJbnB1dFN0cmVhbUlGSG9sZGVyICgpCisgIHsKKyAgfQorCisgIHB1YmxpYyBJbnB1dFN0cmVhbUlGSG9sZGVyIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBpbml0aWFsVmFsdWUpCisgIHsKKyAgICB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIF9yZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGkpCisgIHsKKyAgICB2YWx1ZSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLnJlYWQgKGkpOworICB9CisKKyAgcHVibGljIHZvaWQgX3dyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIud3JpdGUgKG8sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF90eXBlICgpCisgIHsKKyAgICByZXR1cm4gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIudHlwZSAoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGT3BlcmF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODExZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMuamF2YQpAQCAtMCwwICsxLDg1IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZPcGVyYXRpb25zLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgaW50ZXJmYWNlIElucHV0U3RyZWFtSUZPcGVyYXRpb25zIAoreworCisgIC8qKgorICAgICAgICAqIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpbnRvIGFuIGFycmF5CisgICAgICAgICogb2YgYnl0ZXMuIEFuIGF0dGVtcHQgaXMgbWFkZSB0byByZWFkIGFzIG1hbnkgYXMgbGVuIGJ5dGVzLCBidXQgYQorICAgICAgICAqIHNtYWxsZXIgbnVtYmVyIG1heSBiZSByZWFkLCBwb3NzaWJseSB6ZXJvLiBUaGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICogYWN0dWFsbHkgcmVhZCBpcyByZXR1cm5lZCBhcyBhbiBpbnRlZ2VyLgorICAgICAgICAqCisgICAgICAgICogVGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIGlucHV0IGRhdGEgaXMgYXZhaWxhYmxlLCBlbmQgb2YgZmlsZQorICAgICAgICAqIGlzIGRldGVjdGVkLCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAqCisgICAgICAgICogSWYgYiBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgKgorICAgICAgICAqIElmIG9mZiBpcyBuZWdhdGl2ZSwgb3IgbGVuIGlzIG5lZ2F0aXZlLCBvciBvZmYrbGVuIGlzIGdyZWF0ZXIKKyAgICAgICAgKiB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IGIsIHRoZW4gYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICoKKyAgICAgICAgKiBJZiBsZW4gaXMgemVybywgdGhlbiBubyBieXRlcyBhcmUgcmVhZCBhbmQgMCBpcyByZXR1cm5lZDsKKyAgICAgICAgKiBvdGhlcndpc2UsIHRoZXJlIGlzIGFuIGF0dGVtcHQgdG8gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZS4KKyAgICAgICAgKiBJZiBubyBieXRlIGlzIGF2YWlsYWJsZSBiZWNhdXNlIHRoZSBzdHJlYW0gaXMgYXQgZW5kIG9mIGZpbGUsCisgICAgICAgICogdGhlIHZhbHVlIC0xIGlzIHJldHVybmVkOyBvdGhlcndpc2UsIGF0IGxlYXN0IG9uZSBieXRlIGlzIHJlYWQgYW5kIHN0b3JlZCBpbnRvIGIuCisgICAgICAgICoKKyAgICAgICAgKiBUaGUgZmlyc3QgYnl0ZSByZWFkIGlzIHN0b3JlZCBpbnRvIGVsZW1lbnQgYltvZmZdLCB0aGUgbmV4dCBvbmUgaW50byBiW29mZisxXSwKKyAgICAgICAgKiBhbmQgc28gb24uIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpcywgYXQgbW9zdCwgZXF1YWwgdG8gbGVuLiBMZXQgayBiZSB0aGUgbnVtYmVyCisgICAgICAgICogb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZDsgdGhlc2UgYnl0ZXMgd2lsbCBiZSBzdG9yZWQgaW4gZWxlbWVudHMgYltvZmZdIHRocm91Z2ggYltvZmYray0xXSwKKyAgICAgICAgKiBsZWF2aW5nIGVsZW1lbnRzIGJbb2ZmK2tdIHRocm91Z2ggYltvZmYrbGVuLTFdIHVuYWZmZWN0ZWQuCisgICAgICAgICoKKyAgICAgICAgKiBJbiBldmVyeSBjYXNlLCBlbGVtZW50cyBiWzBdIHRocm91Z2ggYltvZmZdIGFuZCBlbGVtZW50cyBiW29mZitsZW5dCisgICAgICAgICogdGhyb3VnaCBiW2IubGVuZ3RoLTFdIGFyZSB1bmFmZmVjdGVkLgorICAgICAgICAqCisgICAgICAgICogSWYgdGhlIGZpcnN0IGJ5dGUgY2Fubm90IGJlIHJlYWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBlbmQgb2YgZmlsZSwKKyAgICAgICAgKiB0aGVuIGFuIElPRXhjZXB0aW9uIGlzIHRocm93bi4gSW4gcGFydGljdWxhciwgYW4gSU9FeGNlcHRpb24gaXMgdGhyb3duCisgICAgICAgICogaWYgdGhlIGlucHV0IHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICAgICoKKyAgICAgICAgKiBUaGUgcmVhZChiLCBvZmYsIGxlbikgbWV0aG9kIGZvciBjbGFzcyBJbnB1dFN0cmVhbSBzaW1wbHkgY2FsbHMgdGhlIG1ldGhvZAorICAgICAgICAqIHJlYWQoKSByZXBlYXRlZGx5LiBJZiB0aGUgZmlyc3Qgc3VjaCBjYWxsIHJlc3VsdHMgaW4gYW4gSU9FeGNlcHRpb24sCisgICAgICAgICogdGhhdCBleGNlcHRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCB0byB0aGUgcmVhZChiLCBvZmYsIGxlbikgbWV0aG9kLgorICAgICAgICAqIElmIGFueSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVhZCgpIHJlc3VsdHMgaW4gYSBJT0V4Y2VwdGlvbiwgdGhlIGV4Y2VwdGlvbgorICAgICAgICAqIGlzIGNhdWdodCBhbmQgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlIGVuZCBvZiBmaWxlOyB0aGUgYnl0ZXMgcmVhZCB1cCB0byB0aGF0CisgICAgICAgICogcG9pbnQgYXJlIHN0b3JlZCBpbnRvIGIgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBiZWZvcmUgdGhlIGV4Y2VwdGlvbgorICAgICAgICAqIG9jY3VycmVkIGlzIHJldHVybmVkLiBTdWJjbGFzc2VzIGFyZSBlbmNvdXJhZ2VkIHRvIHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudAorICAgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIGIgLSB0aGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIGRhdGEgaXMgcmVhZC4KKyAgICAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIHN0YXJ0IG9mZnNldCBpbiBhcnJheSBiICBhdCB3aGljaCB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAgICAqIEBwYXJhbSBsZW4gLSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbnRvIHRoZSBidWZmZXIsCisgICAgICAgICogICAgICAgICBvciAtMSBpcyB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYmVjYXVzZSB0aGUgZW5kCisgICAgICAgICogICAgICAgICBvZiB0aGUgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgaW50IHJlYWQgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSG9sZGVyIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIENsb3NlIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAqLworICB2b2lkIGNsb3NlICgpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICoKKyAgICAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgdG8gYmUgdHJhbnNmZXJkLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIGludCBsZW5ndGggKCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbQorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgdm9pZCByZXNldCAoKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKK30gLy8gaW50ZXJmYWNlIElucHV0U3RyZWFtSUZPcGVyYXRpb25zCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRlBPQS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZQT0EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWZiNDQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZQT0EuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGUE9BLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5wdXRTdHJlYW1JRlBPQSBleHRlbmRzIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuU2VydmFudAorIGltcGxlbWVudHMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZPcGVyYXRpb25zLCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLkludm9rZUhhbmRsZXIKK3sKKworICAvLyBDb25zdHJ1Y3RvcnMKKworICBwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIF9tZXRob2RzID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUgKCk7CisgIHN0YXRpYworICB7CisgICAgX21ldGhvZHMucHV0ICgicmVhZCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMCkpOworICAgIF9tZXRob2RzLnB1dCAoImNsb3NlIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxKSk7CisgICAgX21ldGhvZHMucHV0ICgibGVuZ3RoIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgyKSk7CisgICAgX21ldGhvZHMucHV0ICgicmVzZXQiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDMpKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBfaW52b2tlIChTdHJpbmcgJG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZXNwb25zZUhhbmRsZXIgJHJoKQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKyAgICBqYXZhLmxhbmcuSW50ZWdlciBfX21ldGhvZCA9IChqYXZhLmxhbmcuSW50ZWdlcilfbWV0aG9kcy5nZXQgKCRtZXRob2QpOworICAgIGlmIChfX21ldGhvZCA9PSBudWxsKQorICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuQkFEX09QRVJBVElPTiAoMCwgb3JnLm9tZy5DT1JCQS5Db21wbGV0aW9uU3RhdHVzLkNPTVBMRVRFRF9NQVlCRSk7CisKKyAgICBzd2l0Y2ggKF9fbWV0aG9kLmludFZhbHVlICgpKQorICAgIHsKKworICAvKioKKyAgICAgICAgKiBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaW50byBhbiBhcnJheQorICAgICAgICAqIG9mIGJ5dGVzLiBBbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVhZCBhcyBtYW55IGFzIGxlbiBieXRlcywgYnV0IGEKKyAgICAgICAgKiBzbWFsbGVyIG51bWJlciBtYXkgYmUgcmVhZCwgcG9zc2libHkgemVyby4gVGhlIG51bWJlciBvZiBieXRlcworICAgICAgICAqIGFjdHVhbGx5IHJlYWQgaXMgcmV0dXJuZWQgYXMgYW4gaW50ZWdlci4KKyAgICAgICAgKgorICAgICAgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCBpbnB1dCBkYXRhIGlzIGF2YWlsYWJsZSwgZW5kIG9mIGZpbGUKKyAgICAgICAgKiBpcyBkZXRlY3RlZCwgb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgKgorICAgICAgICAqIElmIGIgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICoKKyAgICAgICAgKiBJZiBvZmYgaXMgbmVnYXRpdmUsIG9yIGxlbiBpcyBuZWdhdGl2ZSwgb3Igb2ZmK2xlbiBpcyBncmVhdGVyCisgICAgICAgICogdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBiLCB0aGVuIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAqCisgICAgICAgICogSWYgbGVuIGlzIHplcm8sIHRoZW4gbm8gYnl0ZXMgYXJlIHJlYWQgYW5kIDAgaXMgcmV0dXJuZWQ7CisgICAgICAgICogb3RoZXJ3aXNlLCB0aGVyZSBpcyBhbiBhdHRlbXB0IHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUuCisgICAgICAgICogSWYgbm8gYnl0ZSBpcyBhdmFpbGFibGUgYmVjYXVzZSB0aGUgc3RyZWFtIGlzIGF0IGVuZCBvZiBmaWxlLAorICAgICAgICAqIHRoZSB2YWx1ZSAtMSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyByZWFkIGFuZCBzdG9yZWQgaW50byBiLgorICAgICAgICAqCisgICAgICAgICogVGhlIGZpcnN0IGJ5dGUgcmVhZCBpcyBzdG9yZWQgaW50byBlbGVtZW50IGJbb2ZmXSwgdGhlIG5leHQgb25lIGludG8gYltvZmYrMV0sCisgICAgICAgICogYW5kIHNvIG9uLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaXMsIGF0IG1vc3QsIGVxdWFsIHRvIGxlbi4gTGV0IGsgYmUgdGhlIG51bWJlcgorICAgICAgICAqIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQ7IHRoZXNlIGJ5dGVzIHdpbGwgYmUgc3RvcmVkIGluIGVsZW1lbnRzIGJbb2ZmXSB0aHJvdWdoIGJbb2ZmK2stMV0sCisgICAgICAgICogbGVhdmluZyBlbGVtZW50cyBiW29mZitrXSB0aHJvdWdoIGJbb2ZmK2xlbi0xXSB1bmFmZmVjdGVkLgorICAgICAgICAqCisgICAgICAgICogSW4gZXZlcnkgY2FzZSwgZWxlbWVudHMgYlswXSB0aHJvdWdoIGJbb2ZmXSBhbmQgZWxlbWVudHMgYltvZmYrbGVuXQorICAgICAgICAqIHRocm91Z2ggYltiLmxlbmd0aC0xXSBhcmUgdW5hZmZlY3RlZC4KKyAgICAgICAgKgorICAgICAgICAqIElmIHRoZSBmaXJzdCBieXRlIGNhbm5vdCBiZSByZWFkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gZW5kIG9mIGZpbGUsCisgICAgICAgICogdGhlbiBhbiBJT0V4Y2VwdGlvbiBpcyB0aHJvd24uIEluIHBhcnRpY3VsYXIsIGFuIElPRXhjZXB0aW9uIGlzIHRocm93bgorICAgICAgICAqIGlmIHRoZSBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAgICAqCisgICAgICAgICogVGhlIHJlYWQoYiwgb2ZmLCBsZW4pIG1ldGhvZCBmb3IgY2xhc3MgSW5wdXRTdHJlYW0gc2ltcGx5IGNhbGxzIHRoZSBtZXRob2QKKyAgICAgICAgKiByZWFkKCkgcmVwZWF0ZWRseS4gSWYgdGhlIGZpcnN0IHN1Y2ggY2FsbCByZXN1bHRzIGluIGFuIElPRXhjZXB0aW9uLAorICAgICAgICAqIHRoYXQgZXhjZXB0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgdG8gdGhlIHJlYWQoYiwgb2ZmLCBsZW4pIG1ldGhvZC4KKyAgICAgICAgKiBJZiBhbnkgc3Vic2VxdWVudCBjYWxsIHRvIHJlYWQoKSByZXN1bHRzIGluIGEgSU9FeGNlcHRpb24sIHRoZSBleGNlcHRpb24KKyAgICAgICAgKiBpcyBjYXVnaHQgYW5kIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBlbmQgb2YgZmlsZTsgdGhlIGJ5dGVzIHJlYWQgdXAgdG8gdGhhdAorICAgICAgICAqIHBvaW50IGFyZSBzdG9yZWQgaW50byBiIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYmVmb3JlIHRoZSBleGNlcHRpb24KKyAgICAgICAgKiBvY2N1cnJlZCBpcyByZXR1cm5lZC4gU3ViY2xhc3NlcyBhcmUgZW5jb3VyYWdlZCB0byBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKKyAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSBiIC0gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBkYXRhIGlzIHJlYWQuCisgICAgICAgICogQHBhcmFtIG9mZiAtIHRoZSBzdGFydCBvZmZzZXQgaW4gYXJyYXkgYiAgYXQgd2hpY2ggdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgICAgKiBAcGFyYW0gbGVuIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB0aGUgYnVmZmVyLAorICAgICAgICAqICAgICAgICAgb3IgLTEgaXMgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGJlY2F1c2UgdGhlIGVuZAorICAgICAgICAqICAgICAgICAgb2YgdGhlIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgICAgICAgY2FzZSAwOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUYvcmVhZAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSG9sZGVyIGIgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX0JZVEVIb2xkZXIgKCk7CisgICAgICAgICAgIGludCBvZmYgPSBpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgIGludCBsZW4gPSBpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgIGludCAkcmVzdWx0ID0gKGludCkwOworICAgICAgICAgICAkcmVzdWx0ID0gdGhpcy5yZWFkIChiLCBvZmYsIGxlbik7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfbG9uZyAoJHJlc3VsdCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSGVscGVyLndyaXRlIChvdXQsIGIudmFsdWUpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBDbG9zZSB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDE6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRi9jbG9zZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIHRoaXMuY2xvc2UgKCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqCisgICAgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIHRvIGJlIHRyYW5zZmVyZC4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAqLworICAgICAgIGNhc2UgMjogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGL2xlbmd0aAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIGludCAkcmVzdWx0ID0gKGludCkwOworICAgICAgICAgICAkcmVzdWx0ID0gdGhpcy5sZW5ndGggKCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfbG9uZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgICAgICAgY2FzZSAzOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUYvcmVzZXQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICB0aGlzLnJlc2V0ICgpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLkJBRF9PUEVSQVRJT04gKDAsIG9yZy5vbWcuQ09SQkEuQ29tcGxldGlvblN0YXR1cy5DT01QTEVURURfTUFZQkUpOworICAgIH0KKworICAgIHJldHVybiBvdXQ7CisgIH0gLy8gX2ludm9rZQorCisgIC8vIFR5cGUtc3BlY2lmaWMgQ09SQkE6Ok9iamVjdCBvcGVyYXRpb25zCisgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIF9faWRzID0geworICAgICJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUY6MS4wIn07CisKKyAgcHVibGljIFN0cmluZ1tdIF9hbGxfaW50ZXJmYWNlcyAob3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0EgcG9hLCBieXRlW10gb2JqZWN0SWQpCisgIHsKKyAgICByZXR1cm4gKFN0cmluZ1tdKV9faWRzLmNsb25lICgpOworICB9CisKKyAgcHVibGljIElucHV0U3RyZWFtSUYgX3RoaXMoKSAKKyAgeworICAgIHJldHVybiBJbnB1dFN0cmVhbUlGSGVscGVyLm5hcnJvdygKKyAgICBzdXBlci5fdGhpc19vYmplY3QoKSk7CisgIH0KKworICBwdWJsaWMgSW5wdXRTdHJlYW1JRiBfdGhpcyhvcmcub21nLkNPUkJBLk9SQiBvcmIpIAorICB7CisgICAgcmV0dXJuIElucHV0U3RyZWFtSUZIZWxwZXIubmFycm93KAorICAgIHN1cGVyLl90aGlzX29iamVjdChvcmIpKTsKKyAgfQorCisKK30gLy8gY2xhc3MgSW5wdXRTdHJlYW1JRlBPQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZQT0FUaWUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGUE9BVGllLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2NTBjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGUE9BVGllLmphdmEKQEAgLTAsMCArMSwxMjggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRlBPQVRpZS5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGNsYXNzIElucHV0U3RyZWFtSUZQT0FUaWUgZXh0ZW5kcyBJbnB1dFN0cmVhbUlGUE9BCit7CisKKyAgLy8gQ29uc3RydWN0b3JzCisKKyAgcHVibGljIElucHV0U3RyZWFtSUZQT0FUaWUgKCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMgZGVsZWdhdGUgKSB7CisgICAgICB0aGlzLl9pbXBsID0gZGVsZWdhdGU7CisgIH0KKyAgcHVibGljIElucHV0U3RyZWFtSUZQT0FUaWUgKCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMgZGVsZWdhdGUgLCBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQSBwb2EgKSB7CisgICAgICB0aGlzLl9pbXBsID0gZGVsZWdhdGU7CisgICAgICB0aGlzLl9wb2EgICAgICA9IHBvYTsKKyAgfQorICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZPcGVyYXRpb25zIF9kZWxlZ2F0ZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9pbXBsOworICB9CisgIHB1YmxpYyB2b2lkIF9kZWxlZ2F0ZSAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZPcGVyYXRpb25zIGRlbGVnYXRlICkgeworICAgICAgdGhpcy5faW1wbCA9IGRlbGVnYXRlOworICB9CisgIHB1YmxpYyBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQSBfZGVmYXVsdF9QT0EoKSB7CisgICAgICBpZihfcG9hICE9IG51bGwpIHsKKyAgICAgICAgICByZXR1cm4gX3BvYTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgIHJldHVybiBzdXBlci5fZGVmYXVsdF9QT0EoKTsKKyAgICAgIH0KKyAgfQorCisgIC8qKgorICAgICAgICAqIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpbnRvIGFuIGFycmF5CisgICAgICAgICogb2YgYnl0ZXMuIEFuIGF0dGVtcHQgaXMgbWFkZSB0byByZWFkIGFzIG1hbnkgYXMgbGVuIGJ5dGVzLCBidXQgYQorICAgICAgICAqIHNtYWxsZXIgbnVtYmVyIG1heSBiZSByZWFkLCBwb3NzaWJseSB6ZXJvLiBUaGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICogYWN0dWFsbHkgcmVhZCBpcyByZXR1cm5lZCBhcyBhbiBpbnRlZ2VyLgorICAgICAgICAqCisgICAgICAgICogVGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIGlucHV0IGRhdGEgaXMgYXZhaWxhYmxlLCBlbmQgb2YgZmlsZQorICAgICAgICAqIGlzIGRldGVjdGVkLCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAqCisgICAgICAgICogSWYgYiBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgKgorICAgICAgICAqIElmIG9mZiBpcyBuZWdhdGl2ZSwgb3IgbGVuIGlzIG5lZ2F0aXZlLCBvciBvZmYrbGVuIGlzIGdyZWF0ZXIKKyAgICAgICAgKiB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IGIsIHRoZW4gYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICoKKyAgICAgICAgKiBJZiBsZW4gaXMgemVybywgdGhlbiBubyBieXRlcyBhcmUgcmVhZCBhbmQgMCBpcyByZXR1cm5lZDsKKyAgICAgICAgKiBvdGhlcndpc2UsIHRoZXJlIGlzIGFuIGF0dGVtcHQgdG8gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZS4KKyAgICAgICAgKiBJZiBubyBieXRlIGlzIGF2YWlsYWJsZSBiZWNhdXNlIHRoZSBzdHJlYW0gaXMgYXQgZW5kIG9mIGZpbGUsCisgICAgICAgICogdGhlIHZhbHVlIC0xIGlzIHJldHVybmVkOyBvdGhlcndpc2UsIGF0IGxlYXN0IG9uZSBieXRlIGlzIHJlYWQgYW5kIHN0b3JlZCBpbnRvIGIuCisgICAgICAgICoKKyAgICAgICAgKiBUaGUgZmlyc3QgYnl0ZSByZWFkIGlzIHN0b3JlZCBpbnRvIGVsZW1lbnQgYltvZmZdLCB0aGUgbmV4dCBvbmUgaW50byBiW29mZisxXSwKKyAgICAgICAgKiBhbmQgc28gb24uIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpcywgYXQgbW9zdCwgZXF1YWwgdG8gbGVuLiBMZXQgayBiZSB0aGUgbnVtYmVyCisgICAgICAgICogb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZDsgdGhlc2UgYnl0ZXMgd2lsbCBiZSBzdG9yZWQgaW4gZWxlbWVudHMgYltvZmZdIHRocm91Z2ggYltvZmYray0xXSwKKyAgICAgICAgKiBsZWF2aW5nIGVsZW1lbnRzIGJbb2ZmK2tdIHRocm91Z2ggYltvZmYrbGVuLTFdIHVuYWZmZWN0ZWQuCisgICAgICAgICoKKyAgICAgICAgKiBJbiBldmVyeSBjYXNlLCBlbGVtZW50cyBiWzBdIHRocm91Z2ggYltvZmZdIGFuZCBlbGVtZW50cyBiW29mZitsZW5dCisgICAgICAgICogdGhyb3VnaCBiW2IubGVuZ3RoLTFdIGFyZSB1bmFmZmVjdGVkLgorICAgICAgICAqCisgICAgICAgICogSWYgdGhlIGZpcnN0IGJ5dGUgY2Fubm90IGJlIHJlYWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBlbmQgb2YgZmlsZSwKKyAgICAgICAgKiB0aGVuIGFuIElPRXhjZXB0aW9uIGlzIHRocm93bi4gSW4gcGFydGljdWxhciwgYW4gSU9FeGNlcHRpb24gaXMgdGhyb3duCisgICAgICAgICogaWYgdGhlIGlucHV0IHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICAgICoKKyAgICAgICAgKiBUaGUgcmVhZChiLCBvZmYsIGxlbikgbWV0aG9kIGZvciBjbGFzcyBJbnB1dFN0cmVhbSBzaW1wbHkgY2FsbHMgdGhlIG1ldGhvZAorICAgICAgICAqIHJlYWQoKSByZXBlYXRlZGx5LiBJZiB0aGUgZmlyc3Qgc3VjaCBjYWxsIHJlc3VsdHMgaW4gYW4gSU9FeGNlcHRpb24sCisgICAgICAgICogdGhhdCBleGNlcHRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCB0byB0aGUgcmVhZChiLCBvZmYsIGxlbikgbWV0aG9kLgorICAgICAgICAqIElmIGFueSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVhZCgpIHJlc3VsdHMgaW4gYSBJT0V4Y2VwdGlvbiwgdGhlIGV4Y2VwdGlvbgorICAgICAgICAqIGlzIGNhdWdodCBhbmQgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlIGVuZCBvZiBmaWxlOyB0aGUgYnl0ZXMgcmVhZCB1cCB0byB0aGF0CisgICAgICAgICogcG9pbnQgYXJlIHN0b3JlZCBpbnRvIGIgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBiZWZvcmUgdGhlIGV4Y2VwdGlvbgorICAgICAgICAqIG9jY3VycmVkIGlzIHJldHVybmVkLiBTdWJjbGFzc2VzIGFyZSBlbmNvdXJhZ2VkIHRvIHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudAorICAgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIGIgLSB0aGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIGRhdGEgaXMgcmVhZC4KKyAgICAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIHN0YXJ0IG9mZnNldCBpbiBhcnJheSBiICBhdCB3aGljaCB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAgICAqIEBwYXJhbSBsZW4gLSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbnRvIHRoZSBidWZmZXIsCisgICAgICAgICogICAgICAgICBvciAtMSBpcyB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYmVjYXVzZSB0aGUgZW5kCisgICAgICAgICogICAgICAgICBvZiB0aGUgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgcHVibGljIGludCByZWFkIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfQllURUhvbGRlciBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLnJlYWQoYiwgb2ZmLCBsZW4pOworICB9IC8vIHJlYWQKKworCisgIC8qKgorICAgICAgICAqIENsb3NlIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBjbG9zZSAoKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgX2ltcGwuY2xvc2UoKTsKKyAgfSAvLyBjbG9zZQorCisKKyAgLyoqCisgICAgICAgICogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKgorICAgICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSB0byBiZSB0cmFuc2ZlcmQuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgcHVibGljIGludCBsZW5ndGggKCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIHJldHVybiBfaW1wbC5sZW5ndGgoKTsKKyAgfSAvLyBsZW5ndGgKKworCisgIC8qKgorICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIHJlc2V0ICgpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICBfaW1wbC5yZXNldCgpOworICB9IC8vIHJlc2V0CisKKyAgcHJpdmF0ZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMgX2ltcGw7CisgIHByaXZhdGUgb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0EgX3BvYTsKKworfSAvLyBjbGFzcyBJbnB1dFN0cmVhbUlGUE9BVGllCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvTE9OR19BUlJBWUhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0xPTkdfQVJSQVlIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJhMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0xPTkdfQVJSQVlIZWxwZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0xPTkdfQVJSQVlIZWxwZXIuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBMT05HX0FSUkFZSGVscGVyCit7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyAgX2lkID0gIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvTE9OR19BUlJBWToxLjAiOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnQgKG9yZy5vbWcuQ09SQkEuQW55IGEsIGxvbmdbXSB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBsb25nW10gZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmdldF9wcmltaXRpdmVfdGMgKG9yZy5vbWcuQ09SQkEuVENLaW5kLnRrX2xvbmdsb25nKTsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9zZXF1ZW5jZV90YyAoMCwgX190eXBlQ29kZSk7CisgICAgICBfX3R5cGVDb2RlID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5jcmVhdGVfYWxpYXNfdGMgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5MT05HX0FSUkFZSGVscGVyLmlkICgpLCAiTE9OR19BUlJBWSIsIF9fdHlwZUNvZGUpOworICAgIH0KKyAgICByZXR1cm4gX190eXBlQ29kZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkICgpCisgIHsKKyAgICByZXR1cm4gX2lkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBsb25nW10gcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpc3RyZWFtKQorICB7CisgICAgbG9uZyB2YWx1ZVtdID0gbnVsbDsKKyAgICBpbnQgX2xlbjAgPSBpc3RyZWFtLnJlYWRfbG9uZyAoKTsKKyAgICB2YWx1ZSA9IG5ldyBsb25nW19sZW4wXTsKKyAgICBpc3RyZWFtLnJlYWRfbG9uZ2xvbmdfYXJyYXkgKHZhbHVlLCAwLCBfbGVuMCk7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBsb25nW10gdmFsdWUpCisgIHsKKyAgICBvc3RyZWFtLndyaXRlX2xvbmcgKHZhbHVlLmxlbmd0aCk7CisgICAgb3N0cmVhbS53cml0ZV9sb25nbG9uZ19hcnJheSAodmFsdWUsIDAsIHZhbHVlLmxlbmd0aCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0xPTkdfQVJSQVlIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9MT05HX0FSUkFZSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhYjA2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9MT05HX0FSUkFZSG9sZGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9MT05HX0FSUkFZSG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgTE9OR19BUlJBWUhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgbG9uZyB2YWx1ZVtdID0gbnVsbDsKKworICBwdWJsaWMgTE9OR19BUlJBWUhvbGRlciAoKQorICB7CisgIH0KKworICBwdWJsaWMgTE9OR19BUlJBWUhvbGRlciAobG9uZ1tdIGluaXRpYWxWYWx1ZSkKKyAgeworICAgIHZhbHVlID0gaW5pdGlhbFZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgX3JlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaSkKKyAgeworICAgIHZhbHVlID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkxPTkdfQVJSQVlIZWxwZXIucmVhZCAoaSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBfd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG8pCisgIHsKKyAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuTE9OR19BUlJBWUhlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuTE9OR19BUlJBWUhlbHBlci50eXBlICgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWcuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTE2NDdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL1NldmVyaXR5RmxhZy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvU2V2ZXJpdHlGbGFnLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCisKKy8qKgorICAgKiBUaGUgZXJyb3Igc2V2ZXJpdHkgZmxhZ3MuCisgICAqLworcHVibGljIGNsYXNzIFNldmVyaXR5RmxhZyBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSURMRW50aXR5Cit7CisgIHByaXZhdGUgICAgICAgIGludCBfX3ZhbHVlOworICBwcml2YXRlIHN0YXRpYyBpbnQgX19zaXplID0gNDsKKyAgcHJpdmF0ZSBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZ1tdIF9fYXJyYXkgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyBbX19zaXplXTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfU1VDQ0VTUyA9IDA7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyBTVUNDRVNTID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcoX1NVQ0NFU1MpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfSU5GT1JNQVRJT04gPSAxOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgSU5GT1JNQVRJT04gPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyhfSU5GT1JNQVRJT04pOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfV0FSTklORyA9IDI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyBXQVJOSU5HID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcoX1dBUk5JTkcpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfRVJST1IgPSAzOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgRVJST1IgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyhfRVJST1IpOworCisgIHB1YmxpYyBpbnQgdmFsdWUgKCkKKyAgeworICAgIHJldHVybiBfX3ZhbHVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnIGZyb21faW50IChpbnQgdmFsdWUpCisgIHsKKyAgICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8IF9fc2l6ZSkKKyAgICAgIHJldHVybiBfX2FycmF5W3ZhbHVlXTsKKyAgICBlbHNlCisgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5CQURfUEFSQU0gKCk7CisgIH0KKworICBwcm90ZWN0ZWQgU2V2ZXJpdHlGbGFnIChpbnQgdmFsdWUpCisgIHsKKyAgICBfX3ZhbHVlID0gdmFsdWU7CisgICAgX19hcnJheVtfX3ZhbHVlXSA9IHRoaXM7CisgIH0KK30gLy8gY2xhc3MgU2V2ZXJpdHlGbGFnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvU2V2ZXJpdHlGbGFnSGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvU2V2ZXJpdHlGbGFnSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmN2I1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWdIZWxwZXIuamF2YQpAQCAtMCwwICsxLDU3IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL1NldmVyaXR5RmxhZ0hlbHBlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworCisvKioKKyAgICogVGhlIGVycm9yIHNldmVyaXR5IGZsYWdzLgorICAgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBTZXZlcml0eUZsYWdIZWxwZXIKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICBfaWQgPSAiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWc6MS4wIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0IChvcmcub21nLkNPUkJBLkFueSBhLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnIHRoYXQpCisgIHsKKyAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXQgPSBhLmNyZWF0ZV9vdXRwdXRfc3RyZWFtICgpOworICAgIGEudHlwZSAodHlwZSAoKSk7CisgICAgd3JpdGUgKG91dCwgdGhhdCk7CisgICAgYS5yZWFkX3ZhbHVlIChvdXQuY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgdHlwZSAoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9lbnVtX3RjIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnSGVscGVyLmlkICgpLCAiU2V2ZXJpdHlGbGFnIiwgbmV3IFN0cmluZ1tdIHsgIlNVQ0NFU1MiLCAiSU5GT1JNQVRJT04iLCAiV0FSTklORyIsICJFUlJPUiJ9ICk7CisgICAgfQorICAgIHJldHVybiBfX3R5cGVDb2RlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWQgKCkKKyAgeworICAgIHJldHVybiBfaWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpc3RyZWFtKQorICB7CisgICAgcmV0dXJuIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcuZnJvbV9pbnQgKGlzdHJlYW0ucmVhZF9sb25nICgpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZSAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3N0cmVhbSwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyB2YWx1ZSkKKyAgeworICAgIG9zdHJlYW0ud3JpdGVfbG9uZyAodmFsdWUudmFsdWUgKCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWdIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWdIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBmNzkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL1NldmVyaXR5RmxhZ0hvbGRlci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL1NldmVyaXR5RmxhZ0hvbGRlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworCisvKioKKyAgICogVGhlIGVycm9yIHNldmVyaXR5IGZsYWdzLgorICAgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXZlcml0eUZsYWdIb2xkZXIgaW1wbGVtZW50cyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLlN0cmVhbWFibGUKK3sKKyAgcHVibGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgdmFsdWUgPSBudWxsOworCisgIHB1YmxpYyBTZXZlcml0eUZsYWdIb2xkZXIgKCkKKyAgeworICB9CisKKyAgcHVibGljIFNldmVyaXR5RmxhZ0hvbGRlciAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyBpbml0aWFsVmFsdWUpCisgIHsKKyAgICB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIF9yZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGkpCisgIHsKKyAgICB2YWx1ZSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWdIZWxwZXIucmVhZCAoaSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBfd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG8pCisgIHsKKyAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnSGVscGVyLndyaXRlIChvLCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfdHlwZSAoKQorICB7CisgICAgcmV0dXJuIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWdIZWxwZXIudHlwZSAoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvX0NPUkJBRmlsZVNlcnZlcklGU3R1Yi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL19DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdlOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL19DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIuamF2YQpAQCAtMCwwICsxLDExMzYgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvX0NPUkJBRmlsZVNlcnZlcklGU3R1Yi5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGNsYXNzIF9DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIgZXh0ZW5kcyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk9iamVjdEltcGwgaW1wbGVtZW50cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYKK3sKKworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgic2F2ZSIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChzdWJEaXIpOworICAgICAgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLndyaXRlICgkb3V0LCBzdHJlYW0pOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gJGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmUgKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBzdHJlYW0gICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gc2F2ZQorCisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgcHVibGljIFN0cmluZyBzYXZlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN1YkRpciwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJzYXZlRm9ySW5zdGFuY2UiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoc3ViRGlyKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgYWlkKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgaWlkKTsKKyAgICAgICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRkhlbHBlci53cml0ZSAoJG91dCwgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9ICRpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzYXZlRm9ySW5zdGFuY2UgKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhaWQsIGlpZCwgc3RyZWFtICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHNhdmVGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICogU3BlY2lmeSB0aGUgbmFtZSBvZiBhbiBhcHBsY2lhdGlvbiBlbGVtZW50IGFuZCB0aGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudAorICAgICAgICAqIHRoYXQgaG9sZHMgdGhlIGV4dGVybmFsIHJlZmVyZW5jZQorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgYWVOYW1lIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuCisgICAgICAgICogQHBhcmFtICBpZU5hbWUgdGhlIGluc3RhbmNlIGVsZW1lbnQgbmFtZS4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIHNhdmVGb3JJbnN0YW5jZU5hbWUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN1YkRpciwgU3RyaW5nIGFlTmFtZSwgU3RyaW5nIGllTmFtZSwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgc3RyZWFtKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoInNhdmVGb3JJbnN0YW5jZU5hbWUiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoc3ViRGlyKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoYWVOYW1lKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoaWVOYW1lKTsKKyAgICAgICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRkhlbHBlci53cml0ZSAoJG91dCwgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9ICRpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzYXZlRm9ySW5zdGFuY2VOYW1lIChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgYWVOYW1lLCBpZU5hbWUsIHN0cmVhbSAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBzYXZlRm9ySW5zdGFuY2VOYW1lCisKKworICAvKioKKyAgICAgICAgKiBEZWxldGUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBkZWxldGUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJkZWxldGUiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgKGFvU2VzcywgbmFtZSAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBkZWxldGUKKworCisgIC8qKgorICAgICAgICAqIE1vdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICB1cmxvIHRoZSB1cmwgb2YgdGhlIGZpbGUuCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIG1vdmUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgdXJsKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoIm1vdmUiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nICh1cmwpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIG1vdmUgKGFvU2VzcywgdXJsICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIG1vdmUKKworCisgIC8qKgorICAgICAgICAqIERlbGV0ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIHVybCB0aGUgdXJsIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBkZWxldGVGb3JJbnN0YW5jZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyB1cmwsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImRlbGV0ZUZvckluc3RhbmNlIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAodXJsKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgYWlkKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgaWlkKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICBkZWxldGVGb3JJbnN0YW5jZSAoYW9TZXNzLCB1cmwsIGFpZCwgaWlkICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGRlbGV0ZUZvckluc3RhbmNlCisKKworICAvKioKKyAgICAgICAgKiBNb3ZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKiBTcGVjaWZ5IHRoZSBBcHBsaWNhdGlvbkVsZW1lbnQgaWQgYW5kIHRoZSBJbnN0YW5jZUVsZW1lbnQgaWQKKyAgICAgICAgKiBvZiB0aGUgY29tcG9uZW50IHRoYXQgaG9sZHMgdGhlIGV4dGVybmFsIHJlZmVyZW5jZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgbW92ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoIm1vdmVGb3JJbnN0YW5jZSIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlICgkb3V0LCBhaWQpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlICgkb3V0LCBpaWQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIG1vdmVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBtb3ZlRm9ySW5zdGFuY2UKKworCisgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqLworICBwdWJsaWMgdm9pZCBnZXRCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldEJ5U29ja2V0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGhvc3QpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAoYVBvcnQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIGdldEJ5U29ja2V0IChhb1Nlc3MsIG5hbWUsIGhvc3QsIGFQb3J0ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldEJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSB1cmwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJnZXRGb3JJbnN0YW5jZUJ5U29ja2V0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGFpZCk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGlpZCk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGhvc3QpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAoYVBvcnQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIGdldEZvckluc3RhbmNlQnlTb2NrZXQgKGFvU2VzcywgbmFtZSwgYWlkLCBpaWQsIGhvc3QsIGFQb3J0ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldEZvckluc3RhbmNlQnlTb2NrZXQKKworCisgIC8qKgorICAgICAgICAgKiBTYXZlIHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUJ5U29ja2V0IChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIFN0cmluZyBob3N0LCBpbnQgYVBvcnQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgic2F2ZUJ5U29ja2V0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKHN1YkRpcik7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGhvc3QpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAoYVBvcnQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gJGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVCeVNvY2tldCAoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIGhvc3QsIGFQb3J0ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHNhdmVCeVNvY2tldAorCisKKyAgLyoqCisgICAgICAgICAqIFNhdmUgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIHNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoInNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKHN1YkRpcik7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGFpZCk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGlpZCk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGhvc3QpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAoYVBvcnQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gJGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgYWlkLCBpaWQsIGhvc3QsIGFQb3J0ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgICogU2F2ZSB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAgKiBAcGFyYW0gIGFlTmFtZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gIGllTmFtZSB0aGUgaW5zdGFuY2UgZWxlbWVudCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIHNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBTdHJpbmcgYWVOYW1lLCBTdHJpbmcgaWVOYW1lLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoInNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChzdWJEaXIpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChhZU5hbWUpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChpZU5hbWUpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChob3N0KTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX2xvbmcgKGFQb3J0KTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9ICRpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzYXZlRm9ySW5zdGFuY2VOYW1lQnlTb2NrZXQgKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhZU5hbWUsIGllTmFtZSwgaG9zdCwgYVBvcnQgICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gc2F2ZUZvckluc3RhbmNlTmFtZUJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgKiBSZWFkIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICovCisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiByZWFkIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgicmVhZCIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGICRyZXN1bHQgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQgKGFvU2VzcywgbmFtZSAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyByZWFkCisKKworICAvKioKKyAgICAgICAgKiBSZWFkIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICovCisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiByZWFkRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgicmVhZEZvckluc3RhbmNlIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGFpZCk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGlpZCk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgJHJlc3VsdCA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZEZvckluc3RhbmNlIChhb1Nlc3MsIG5hbWUsIGFpZCwgaWlkICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHJlYWRGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogIEdldCBzaXplIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHNpemUgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0U2l6ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldFNpemUiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBsb25nICRyZXN1bHQgPSAkaW4ucmVhZF9sb25nbG9uZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRTaXplIChhb1Nlc3MsIG5hbWUgICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gZ2V0U2l6ZQorCisKKyAgLyoqCisgICAgICAgICogIEdldCBzaXplIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIHNpemUgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0U2l6ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldFNpemVGb3JJbnN0YW5jZSIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlICgkb3V0LCBhaWQpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlICgkb3V0LCBpaWQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIGxvbmcgJHJlc3VsdCA9ICRpbi5yZWFkX2xvbmdsb25nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNpemVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBnZXRTaXplRm9ySW5zdGFuY2UKKworCisgIC8qKgorICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYnkgdGhlIGNsaWVudCB3aGVuIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHN0YXJ0IGEgdGVybWluYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHBhcmFtZXRlciB0aGUgcGFyYW1ldGVyIHN0cmluZy4gVGhlIGNvbnRlbnQgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgKiAgICAgICAgIHNlcnZlciBzaWRlIHRlcm1pbmF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgdGVybWluYXRlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJhbWV0ZXIpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgidGVybWluYXRlIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKHBhcmFtZXRlcik7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgdGVybWluYXRlIChhb1Nlc3MsIG5hbWUsIHBhcmFtZXRlciAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyB0ZXJtaW5hdGUKKworCisgIC8qKgorICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYnkgdGhlIGNsaWVudCB3aGVuIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHN0YXJ0IGEgdGVybWluYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIHBhcmFtZXRlciB0aGUgcGFyYW1ldGVyIHN0cmluZy4gVGhlIGNvbnRlbnQgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgKiAgICAgICAgIHNlcnZlciBzaWRlIHRlcm1pbmF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgdGVybWluYXRlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIFN0cmluZyBwYXJhbWV0ZXIpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgidGVybWluYXRlRm9ySW5zdGFuY2UiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgYWlkKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgaWlkKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAocGFyYW1ldGVyKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCwgcGFyYW1ldGVyICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHRlcm1pbmF0ZUZvckluc3RhbmNlCisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGhvc3Qgd2hlcmUgdGhlIHNlcnZlciBpcyBydW5uaW5nCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSBob3N0bmFtZQorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEhvc3RuYW1lIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcykgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJnZXRIb3N0bmFtZSIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgU3RyaW5nICRyZXN1bHQgPSAkaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SG9zdG5hbWUgKGFvU2VzcyAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBnZXRIb3N0bmFtZQorCisKKyAgLyoqCisgICAgICAgICogR2V0IGEgY29udGV4dCB2YXJpYWJsZS4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleXdvcmQgb2YgdGhlIGNvbnRleHQgdmFsdWUuCisgICAgICAgICogQHJldHVybiB0aGUgY29udGV4dCB2YWx1ZQorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWSwKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9GT1VORAorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcga2V5KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldENvbnRleHQiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChrZXkpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gJGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbnRleHQgKGFvU2Vzcywga2V5ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldENvbnRleHQKKworCisgIC8qKgorICAgICAgICAqIFNldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJzZXRDb250ZXh0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoa2V5KTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAodmFsdWUpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHNldENvbnRleHQgKGFvU2Vzcywga2V5LCB2YWx1ZSAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBzZXRDb250ZXh0CisKKworICAvKioKKyAgICAgICAgKiBSZW1vdmUgYSBjb250ZXh0IHZhcmlhYmxlLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5d29yZCBvZiB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXkpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgicmVtb3ZlQ29udGV4dCIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGtleSk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlQ29udGV4dCAoYW9TZXNzLCBrZXkgICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gcmVtb3ZlQ29udGV4dAorCisKKyAgLyoqCisgICAgICAgICogTGlzdCBhbGwgY29udGV4dCBrZXl3b3Jkcy4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEByZXR1cm4gYSBzZXF1ZW5jZSBvZiBzdHJpbmdzLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nW10gbGlzdENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImxpc3RDb250ZXh0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgJHJlc3VsdFtdID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX1NUUklOR0hlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RDb250ZXh0IChhb1Nlc3MgICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gbGlzdENvbnRleHQKKworCisgIC8qKgorICAgICAgICAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgQ29yYmFGaWxlU2VydmVySUYuCisgICAgICAgICogUmV0dXJucyBnZXRWZXJzaW9uIG9mIENvcmJhRmlsZVNlcnZlci4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHJldHVybiAgVGhlIGludGVyZmFjZSB2ZXJzaW9uIG9mIHRoZSBDb3JiYUZpbGVTZXJ2ZXJJRi4KKyAgICAgICAgKgorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZVZlcnNpb24gKCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJnZXRJbnRlcmZhY2VWZXJzaW9uIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgU3RyaW5nICRyZXN1bHQgPSAkaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW50ZXJmYWNlVmVyc2lvbiAoICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldEludGVyZmFjZVZlcnNpb24KKworCisgIC8qKgorICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgbG9uZyB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBsZW5ndGgKKyAgICAgICAgKiBvZiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHByb3ZpZGVkIGluIHRoZSBTdHJpbmcgYXJyYXkuCisgICAgICAgICogVGhlIG9yZGVyIG9mIHRoZSBsb25nIHZhbHVlcyBtdXN0IG1hdGNoIHdpdGggdGhlIG9yZGVyCisgICAgICAgICogb2YgdGhlIGZpbGVuYW1lcy4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSBhb1Nlc3MgdGhlIGFvU2Vzc2lvbiBvZiB0aGUgY2FsbGVyCisgICAgICAgICogQHBhcmFtIG5hbWVzIHRoZSBTdHJpbmcgYXJyYXkgb2YgZmlsZW5hbWVzIGZvciAKKyAgICAgICAgKiAgICAgICAgICAgICAgd2hpY2ggdG8gZ2V0IHRoZSBzaXplcworICAgICAgICAqIEByZXR1cm4gYW4gQXJyYXkgb2YgbG9uZyB2YWx1ZXMgY29udGFpbmluZyB0aGUgZmlsZSBzaXplcworICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICoKKyAgICAgICAgKi8KKyAgcHVibGljIGxvbmdbXSBnZXRTaXplcyAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldFNpemVzIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfU1RSSU5HSGVscGVyLndyaXRlICgkb3V0LCBuYW1lcyk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgbG9uZyAkcmVzdWx0W10gPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuTE9OR19BUlJBWUhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNpemVzIChhb1Nlc3MsIG5hbWVzICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldFNpemVzCisKKyAgLy8gVHlwZS1zcGVjaWZpYyBDT1JCQTo6T2JqZWN0IG9wZXJhdGlvbnMKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gX19pZHMgPSB7CisgICAgIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUY6MS4wIn07CisKKyAgcHVibGljIFN0cmluZ1tdIF9pZHMgKCkKKyAgeworICAgIHJldHVybiAoU3RyaW5nW10pX19pZHMuY2xvbmUgKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdCAoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICB7CisgICAgIFN0cmluZyBzdHIgPSBzLnJlYWRVVEYgKCk7CisgICAgIFN0cmluZ1tdIGFyZ3MgPSBudWxsOworICAgICBqYXZhLnV0aWwuUHJvcGVydGllcyBwcm9wcyA9IG51bGw7CisgICAgIG9yZy5vbWcuQ09SQkEuT1JCIG9yYiA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKGFyZ3MsIHByb3BzKTsKKyAgIHRyeSB7CisgICAgIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iaiA9IG9yYi5zdHJpbmdfdG9fb2JqZWN0IChzdHIpOworICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLkRlbGVnYXRlIGRlbGVnYXRlID0gKChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk9iamVjdEltcGwpIG9iaikuX2dldF9kZWxlZ2F0ZSAoKTsKKyAgICAgX3NldF9kZWxlZ2F0ZSAoZGVsZWdhdGUpOworICAgfSBmaW5hbGx5IHsKKyAgICAgb3JiLmRlc3Ryb3koKSA7CisgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QgKGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICAgU3RyaW5nW10gYXJncyA9IG51bGw7CisgICAgIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHByb3BzID0gbnVsbDsKKyAgICAgb3JnLm9tZy5DT1JCQS5PUkIgb3JiID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoYXJncywgcHJvcHMpOworICAgdHJ5IHsKKyAgICAgU3RyaW5nIHN0ciA9IG9yYi5vYmplY3RfdG9fc3RyaW5nICh0aGlzKTsKKyAgICAgcy53cml0ZVVURiAoc3RyKTsKKyAgIH0gZmluYWxseSB7CisgICAgIG9yYi5kZXN0cm95KCkgOworICAgfQorICB9Cit9IC8vIGNsYXNzIF9DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9fSW5wdXRTdHJlYW1JRlN0dWIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9fSW5wdXRTdHJlYW1JRlN0dWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE5N2VjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL19JbnB1dFN0cmVhbUlGU3R1Yi5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL19JbnB1dFN0cmVhbUlGU3R1Yi5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGNsYXNzIF9JbnB1dFN0cmVhbUlGU3R1YiBleHRlbmRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT2JqZWN0SW1wbCBpbXBsZW1lbnRzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGCit7CisKKworICAvKioKKyAgICAgICAgKiBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaW50byBhbiBhcnJheQorICAgICAgICAqIG9mIGJ5dGVzLiBBbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVhZCBhcyBtYW55IGFzIGxlbiBieXRlcywgYnV0IGEKKyAgICAgICAgKiBzbWFsbGVyIG51bWJlciBtYXkgYmUgcmVhZCwgcG9zc2libHkgemVyby4gVGhlIG51bWJlciBvZiBieXRlcworICAgICAgICAqIGFjdHVhbGx5IHJlYWQgaXMgcmV0dXJuZWQgYXMgYW4gaW50ZWdlci4KKyAgICAgICAgKgorICAgICAgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCBpbnB1dCBkYXRhIGlzIGF2YWlsYWJsZSwgZW5kIG9mIGZpbGUKKyAgICAgICAgKiBpcyBkZXRlY3RlZCwgb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgKgorICAgICAgICAqIElmIGIgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICoKKyAgICAgICAgKiBJZiBvZmYgaXMgbmVnYXRpdmUsIG9yIGxlbiBpcyBuZWdhdGl2ZSwgb3Igb2ZmK2xlbiBpcyBncmVhdGVyCisgICAgICAgICogdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBiLCB0aGVuIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAqCisgICAgICAgICogSWYgbGVuIGlzIHplcm8sIHRoZW4gbm8gYnl0ZXMgYXJlIHJlYWQgYW5kIDAgaXMgcmV0dXJuZWQ7CisgICAgICAgICogb3RoZXJ3aXNlLCB0aGVyZSBpcyBhbiBhdHRlbXB0IHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUuCisgICAgICAgICogSWYgbm8gYnl0ZSBpcyBhdmFpbGFibGUgYmVjYXVzZSB0aGUgc3RyZWFtIGlzIGF0IGVuZCBvZiBmaWxlLAorICAgICAgICAqIHRoZSB2YWx1ZSAtMSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyByZWFkIGFuZCBzdG9yZWQgaW50byBiLgorICAgICAgICAqCisgICAgICAgICogVGhlIGZpcnN0IGJ5dGUgcmVhZCBpcyBzdG9yZWQgaW50byBlbGVtZW50IGJbb2ZmXSwgdGhlIG5leHQgb25lIGludG8gYltvZmYrMV0sCisgICAgICAgICogYW5kIHNvIG9uLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaXMsIGF0IG1vc3QsIGVxdWFsIHRvIGxlbi4gTGV0IGsgYmUgdGhlIG51bWJlcgorICAgICAgICAqIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQ7IHRoZXNlIGJ5dGVzIHdpbGwgYmUgc3RvcmVkIGluIGVsZW1lbnRzIGJbb2ZmXSB0aHJvdWdoIGJbb2ZmK2stMV0sCisgICAgICAgICogbGVhdmluZyBlbGVtZW50cyBiW29mZitrXSB0aHJvdWdoIGJbb2ZmK2xlbi0xXSB1bmFmZmVjdGVkLgorICAgICAgICAqCisgICAgICAgICogSW4gZXZlcnkgY2FzZSwgZWxlbWVudHMgYlswXSB0aHJvdWdoIGJbb2ZmXSBhbmQgZWxlbWVudHMgYltvZmYrbGVuXQorICAgICAgICAqIHRocm91Z2ggYltiLmxlbmd0aC0xXSBhcmUgdW5hZmZlY3RlZC4KKyAgICAgICAgKgorICAgICAgICAqIElmIHRoZSBmaXJzdCBieXRlIGNhbm5vdCBiZSByZWFkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gZW5kIG9mIGZpbGUsCisgICAgICAgICogdGhlbiBhbiBJT0V4Y2VwdGlvbiBpcyB0aHJvd24uIEluIHBhcnRpY3VsYXIsIGFuIElPRXhjZXB0aW9uIGlzIHRocm93bgorICAgICAgICAqIGlmIHRoZSBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAgICAqCisgICAgICAgICogVGhlIHJlYWQoYiwgb2ZmLCBsZW4pIG1ldGhvZCBmb3IgY2xhc3MgSW5wdXRTdHJlYW0gc2ltcGx5IGNhbGxzIHRoZSBtZXRob2QKKyAgICAgICAgKiByZWFkKCkgcmVwZWF0ZWRseS4gSWYgdGhlIGZpcnN0IHN1Y2ggY2FsbCByZXN1bHRzIGluIGFuIElPRXhjZXB0aW9uLAorICAgICAgICAqIHRoYXQgZXhjZXB0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgdG8gdGhlIHJlYWQoYiwgb2ZmLCBsZW4pIG1ldGhvZC4KKyAgICAgICAgKiBJZiBhbnkgc3Vic2VxdWVudCBjYWxsIHRvIHJlYWQoKSByZXN1bHRzIGluIGEgSU9FeGNlcHRpb24sIHRoZSBleGNlcHRpb24KKyAgICAgICAgKiBpcyBjYXVnaHQgYW5kIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBlbmQgb2YgZmlsZTsgdGhlIGJ5dGVzIHJlYWQgdXAgdG8gdGhhdAorICAgICAgICAqIHBvaW50IGFyZSBzdG9yZWQgaW50byBiIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYmVmb3JlIHRoZSBleGNlcHRpb24KKyAgICAgICAgKiBvY2N1cnJlZCBpcyByZXR1cm5lZC4gU3ViY2xhc3NlcyBhcmUgZW5jb3VyYWdlZCB0byBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKKyAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSBiIC0gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBkYXRhIGlzIHJlYWQuCisgICAgICAgICogQHBhcmFtIG9mZiAtIHRoZSBzdGFydCBvZmZzZXQgaW4gYXJyYXkgYiAgYXQgd2hpY2ggdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgICAgKiBAcGFyYW0gbGVuIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB0aGUgYnVmZmVyLAorICAgICAgICAqICAgICAgICAgb3IgLTEgaXMgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGJlY2F1c2UgdGhlIGVuZAorICAgICAgICAqICAgICAgICAgb2YgdGhlIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIHB1YmxpYyBpbnQgcmVhZCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX0JZVEVIb2xkZXIgYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJyZWFkIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9sb25nIChvZmYpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAobGVuKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBpbnQgJHJlc3VsdCA9ICRpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgICAgICAgYi52YWx1ZSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZCAoYiwgb2ZmLCBsZW4gICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gcmVhZAorCisKKyAgLyoqCisgICAgICAgICogQ2xvc2UgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIGNsb3NlICgpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgiY2xvc2UiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICBjbG9zZSAoICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGNsb3NlCisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqCisgICAgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIHRvIGJlIHRyYW5zZmVyZC4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAqLworICBwdWJsaWMgaW50IGxlbmd0aCAoKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImxlbmd0aCIsIHRydWUpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIGludCAkcmVzdWx0ID0gJGluLnJlYWRfbG9uZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZW5ndGggKCAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBsZW5ndGgKKworCisgIC8qKgorICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIHJlc2V0ICgpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgicmVzZXQiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXNldCAoICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHJlc2V0CisKKyAgLy8gVHlwZS1zcGVjaWZpYyBDT1JCQTo6T2JqZWN0IG9wZXJhdGlvbnMKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gX19pZHMgPSB7CisgICAgIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRjoxLjAifTsKKworICBwdWJsaWMgU3RyaW5nW10gX2lkcyAoKQorICB7CisgICAgcmV0dXJuIChTdHJpbmdbXSlfX2lkcy5jbG9uZSAoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0IChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICAgU3RyaW5nIHN0ciA9IHMucmVhZFVURiAoKTsKKyAgICAgU3RyaW5nW10gYXJncyA9IG51bGw7CisgICAgIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHByb3BzID0gbnVsbDsKKyAgICAgb3JnLm9tZy5DT1JCQS5PUkIgb3JiID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoYXJncywgcHJvcHMpOworICAgdHJ5IHsKKyAgICAgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqID0gb3JiLnN0cmluZ190b19vYmplY3QgKHN0cik7CisgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuRGVsZWdhdGUgZGVsZWdhdGUgPSAoKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT2JqZWN0SW1wbCkgb2JqKS5fZ2V0X2RlbGVnYXRlICgpOworICAgICBfc2V0X2RlbGVnYXRlIChkZWxlZ2F0ZSk7CisgICB9IGZpbmFsbHkgeworICAgICBvcmIuZGVzdHJveSgpIDsKKyAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCAoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgeworICAgICBTdHJpbmdbXSBhcmdzID0gbnVsbDsKKyAgICAgamF2YS51dGlsLlByb3BlcnRpZXMgcHJvcHMgPSBudWxsOworICAgICBvcmcub21nLkNPUkJBLk9SQiBvcmIgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0IChhcmdzLCBwcm9wcyk7CisgICB0cnkgeworICAgICBTdHJpbmcgc3RyID0gb3JiLm9iamVjdF90b19zdHJpbmcgKHRoaXMpOworICAgICBzLndyaXRlVVRGIChzdHIpOworICAgfSBmaW5hbGx5IHsKKyAgICAgb3JiLmRlc3Ryb3koKSA7CisgICB9CisgIH0KK30gLy8gY2xhc3MgX0lucHV0U3RyZWFtSUZTdHViCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQ29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWU0MzkxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDI2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5maWxlLkZpbGVTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5FbnRpdHlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXIuQ09SQkFGaWxlU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuZmlsZXRyYW5zZmVyLlRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuRW50aXR5TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLm5vdGlmaWNhdGlvbi5PRFNOb3RpZmljYXRpb25TZXJ2aWNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTRW50aXR5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNRdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5PRFNTZWFyY2hTZXJ2aWNlOworaW1wb3J0IG9yZy5vbWcuQ09SQkEuT1JCOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUY7CisKKy8qKgorICogT0RTQ29udGV4dCBlbmNhcHN1bGF0ZXMgYSBzZXNzaW9uIHRvIHRoZSBBU0FNIE9EUyBDT1JCQSBBUEkgYW5kIHByb3ZpZGVzIHRoZQorICogT0RTIHNwZWNpZmljIHNlcnZpY2VzIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGNsYXNzIE9EU0NvbnRleHQgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNvbnRleHQgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9EU0NvbnRleHQuY2xhc3MpOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnM7CisJcHJpdmF0ZSBmaW5hbCBUcmFuc2ZlciB0cmFuc2ZlciA9IFRyYW5zZmVyLlNPQ0tFVDsKKworCXByaXZhdGUgQ09SQkFGaWxlU2VydmVySUYgZmlsZVNlcnZlcjsKKwlwcml2YXRlIE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXI7CisJcHJpdmF0ZSBPRFNRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlOworCXByaXZhdGUgRW50aXR5TG9hZGVyIGVudGl0eUxvYWRlcjsKKwlwcml2YXRlIE9EU0VudGl0eU1hbmFnZXIgZW50aXR5TWFuYWdlcjsKKwlwcml2YXRlIE9EU1NlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgT0RTIGFwcGxpY2F0aW9uIGNvbnRleHQuCisJICogCisJICogQHBhcmFtIG9yYiAgICAgICAgdGhlIENPUkJBIE9SQiB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIE9EUyBBUEkKKwkgKiBAcGFyYW0gYW9TZXNzaW9uCisJICogQHBhcmFtIGZpbGVTZXJ2ZXIKKwkgKiBAcGFyYW0gcGFyYW1ldGVycworCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgT0RTQ29udGV4dChPUkIgb3JiLCBBb1Nlc3Npb24gYW9TZXNzaW9uLCBDT1JCQUZpbGVTZXJ2ZXJJRiBmaWxlU2VydmVyLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpCisJCQl0aHJvd3MgQW9FeGNlcHRpb24geworCQl0aGlzLmZpbGVTZXJ2ZXIgPSBmaWxlU2VydmVyOworCQl0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworCisJCXRoaXMubW9kZWxNYW5hZ2VyID0gaW5pdE1vZGVsTWFuYWdlcihvcmIsIGFvU2Vzc2lvbik7CisJCXRoaXMucXVlcnlTZXJ2aWNlID0gbmV3IE9EU1F1ZXJ5U2VydmljZSh0aGlzLm1vZGVsTWFuYWdlcik7CisJCXRoaXMuZW50aXR5TWFuYWdlciA9IG5ldyBPRFNFbnRpdHlNYW5hZ2VyKHRoaXMpOworCQl0aGlzLmVudGl0eUxvYWRlciA9IG5ldyBFbnRpdHlMb2FkZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UpOworCQl0aGlzLnNlYXJjaFNlcnZpY2UgPSBuZXcgT0RTU2VhcmNoU2VydmljZSh0aGlzLCBxdWVyeVNlcnZpY2UsIGVudGl0eUxvYWRlcik7CisJCUxPR0dFUi5kZWJ1ZygiT0RTQ29udGV4dCBpbml0aWFsaXplZC4iKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZQ09ORklHUkVQT1NJVE9SWUxPQURFUkNMQVNTX0FUVFJJQlVURV9OQU1FID0gImVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXJDbGFzcyI7CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGUgT0RTTW9kZWxNYW5hZ2VyIHdpdGggYW4gb3B0aW9uYWxseSBjb25maWd1cmVkCisJICoge0BsaW5rIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXJ9IGluIHNlcnZpY2UueG1sCisJICogCisJICogQHJldHVybiBUaGUgaW5pdGlhbGl6ZWQge0BsaW5rIE9EU01vZGVsTWFuYWdlcn0KKwkgKi8KKwlwcml2YXRlIE9EU01vZGVsTWFuYWdlciBpbml0TW9kZWxNYW5hZ2VyKE9SQiBvcmIsIEFvU2Vzc2lvbiBhb1Nlc3Npb24pIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCS8vIGNoZWNrIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyZWQgY3VzdG9tIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIKKwkJU3RyaW5nIGVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXJDbGFzc05hbWUgPSBwYXJhbWV0ZXJzLmdldChFTlRJVFlDT05GSUdSRVBPU0lUT1JZTE9BREVSQ0xBU1NfQVRUUklCVVRFX05BTUUpOworCisJCS8vIGlmIGN1c3RvbSBsb2FkZXIgaXMgY29uZmlndXJlZAorCQlpZiAoZW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlckNsYXNzTmFtZSAhPSBudWxsKSB7CisJCQlFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyIGVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXI7CisJCQl0cnkgeworCQkJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpCisJCQkJCQkubG9hZENsYXNzKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXJDbGFzc05hbWUpLmFzU3ViY2xhc3MoRW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlci5jbGFzcykKKwkJCQkJCS5uZXdJbnN0YW5jZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBqdXN0IGxvZyBhbiBlcnJvciwgYnV0IHJlY292ZXIgdXNpbmcgdGhlIGRlZmF1bHQgbG9hZGVyCisJCQkJTE9HR0VSLmVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyQ2xhc3MuIFVzaW5nIGRlZmF1bHQuIiwgZSk7CisJCQkJcmV0dXJuIG5ldyBPRFNNb2RlbE1hbmFnZXIob3JiLCBhb1Nlc3Npb24pOworCQkJfQorCisJCQlyZXR1cm4gbmV3IE9EU01vZGVsTWFuYWdlcihvcmIsIGFvU2Vzc2lvbiwgZW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcik7CisJCX0KKwkJLy8gaWYgbm90LCB1c2UgZGVmYXVsdAorCQllbHNlIHsKKwkJCXJldHVybiBuZXcgT0RTTW9kZWxNYW5hZ2VyKG9yYiwgYW9TZXNzaW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3B0aW9uYWw8RW50aXR5TWFuYWdlcj4gZ2V0RW50aXR5TWFuYWdlcigpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mKGVudGl0eU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3B0aW9uYWw8RW50aXR5RmFjdG9yeT4gZ2V0RW50aXR5RmFjdG9yeSgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBPcHRpb25hbC5vZihuZXcgT0RTRW50aXR5RmFjdG9yeShtb2RlbE1hbmFnZXIsIGVudGl0eU1hbmFnZXIubG9hZExvZ2dlZE9uVXNlcigpKSk7CisJCX0gY2F0Y2ggKERhdGFBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgaW5zdGFuY2Ugb2YgdGhlIGxvZ2dlZCBpbiB1c2VyLiIpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPcHRpb25hbDxNb2RlbE1hbmFnZXI+IGdldE1vZGVsTWFuYWdlcigpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mKG1vZGVsTWFuYWdlcik7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPcHRpb25hbDxRdWVyeVNlcnZpY2U+IGdldFF1ZXJ5U2VydmljZSgpIHsKKwkJLy8gVE9ETworCQkvLyBqYXZhIGRvY3M6IGNhY2hlIHRoaXMgc2VydmljZSBmb3IgT05FIHJlcXVlc3QhCisJCXJldHVybiBPcHRpb25hbC5vZihuZXcgT0RTUXVlcnlTZXJ2aWNlKG1vZGVsTWFuYWdlcikpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3B0aW9uYWw8U2VhcmNoU2VydmljZT4gZ2V0U2VhcmNoU2VydmljZSgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mKHNlYXJjaFNlcnZpY2UpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3B0aW9uYWw8RmlsZVNlcnZpY2U+IGdldEZpbGVTZXJ2aWNlKCkgeworCQlpZiAoZmlsZVNlcnZlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gT3B0aW9uYWwub2YobmV3IENPUkJBRmlsZVNlcnZpY2UodGhpcywgdHJhbnNmZXIpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9wdGlvbmFsPE5vdGlmaWNhdGlvblNlcnZpY2U+IGdldE5vdGlmaWNhdGlvblNlcnZpY2UoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gT3B0aW9uYWwub2YobmV3IE9EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5KCkuY3JlYXRlKHRoaXMsIHBhcmFtZXRlcnMpKTsKKwkJfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIG5vdGlmaWNhdGlvbiBtYW5hZ2VyLiIsIGUpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhcmFtZXRlcnMoKSB7CisJCXJldHVybiBwYXJhbWV0ZXJzOworCX0KKworCS8qKgorCSAqIEByZXR1cm5zIHRoZSBzdHJpbmcgIm9kcyIKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEFkYXB0ZXJUeXBlKCkgeworCQlyZXR1cm4gIm9kcyI7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQl0cnkgeworCQkJbW9kZWxNYW5hZ2VyLmNsb3NlKCk7CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCUxPR0dFUi53YXJuKCJVbmFibGUgdG8gY2xvc2Ugc2Vzc3Npb24gZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIE9EU01vZGVsTWFuYWdlcn0gdXNlZCBmb3IgdGhpcyBjb250ZXh0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHtAbGluayBPRFNNb2RlbE1hbmFnZXJ9CisJICovCisJcHVibGljIE9EU01vZGVsTWFuYWdlciBnZXRPRFNNb2RlbE1hbmFnZXIoKSB7CisJCXJldHVybiBtb2RlbE1hbmFnZXI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEFvU2Vzc2lvbn0gdXNlZCBmb3IgdGhpcyBjb250ZXh0LgorCSAqIAorCSAqIEByZXR1cm4ge0BsaW5rIEFvU2Vzc2lvbn0gdXNlZCBmb3IgdGhpcyBjb250ZXh0LgorCSAqLworCXB1YmxpYyBBb1Nlc3Npb24gZ2V0QW9TZXNzaW9uKCkgeworCQlyZXR1cm4gbW9kZWxNYW5hZ2VyLmdldEFvU2Vzc2lvbigpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIE9SQiB1c2VkIGZvciB0aGlzIGNvbnRleHQKKwkgKiAKKwkgKiBAcmV0dXJuIE9SQiB1c2VkIGZvciB0aGlzIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgT1JCIGdldE9SQigpIHsKKwkJcmV0dXJuIG1vZGVsTWFuYWdlci5nZXRPUkIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ09SQkFGaWxlU2VydmVySUZ9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENPUkJBRmlsZVNlcnZlcklGfSBpcyByZXR1cm5lZCBvciBudWxsLCBpZiBtaXNzaW5nLgorCSAqLworCXB1YmxpYyBDT1JCQUZpbGVTZXJ2ZXJJRiBnZXRGaWxlU2VydmVyKCkgeworCQlyZXR1cm4gZmlsZVNlcnZlcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBPRFNDb250ZXh0fSB3aXRoIGEgbmV3IE9EUyBjby1zZXNzaW9uLgorCSAqCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgT0RTQ29udGV4dH0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gb24gZXJyb3JzLgorCSAqLworCXB1YmxpYyBPRFNDb250ZXh0IG5ld0NvbnRleHQoKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQlyZXR1cm4gbmV3IE9EU0NvbnRleHQobW9kZWxNYW5hZ2VyLmdldE9SQigpLCBnZXRBb1Nlc3Npb24oKS5jcmVhdGVDb1Nlc3Npb24oKSwgZmlsZVNlcnZlciwgcGFyYW1ldGVycyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0NvbnRleHRGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQ29udGV4dEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTZkMDkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0NvbnRleHRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRmFjdG9yeUhlbHBlcjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkFwcGxpY2F0aW9uQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PYmplY3Q7CitpbXBvcnQgb3JnLm9tZy5Db3NOYW1pbmcuTmFtZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0OworaW1wb3J0IG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRIZWxwZXI7CitpbXBvcnQgb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dFBhY2thZ2UuQ2Fubm90UHJvY2VlZDsKK2ltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZS5JbnZhbGlkTmFtZTsKK2ltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZS5Ob3RGb3VuZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRjsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUZIZWxwZXI7CisKKy8qKgorICogQVNBTSBPRFMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBBcHBsaWNhdGlvbkNvbnRleHRGYWN0b3J5fSBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBPRFNDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uQ29udGV4dEZhY3RvcnkgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTkFNRVNFUlZJQ0UgPSAibmFtZXNlcnZpY2UiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU0VSVklDRU5BTUUgPSAic2VydmljZW5hbWUiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVVNFUiA9ICJ1c2VyIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BBU1NXT1JEID0gInBhc3N3b3JkIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9GT1JfVVNFUiA9ICJmb3JfdXNlciI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT0RTQ29udGV4dEZhY3RvcnkuY2xhc3MpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT1JCIG9yYiA9IE9SQi5pbml0KG5ldyBTdHJpbmdbXSB7fSwgU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKwlwdWJsaWMgT0RTQ29udGV4dEZhY3RvcnkoKSB7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IEdpdmVuIHBhcmFtZXRlcnMge0Bjb2RlIE1hcH0gbXVzdCBjb250YWluIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUKKwkgKiBmb2xsb3dpbmcga2V5czoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0B2YWx1ZSAjUEFSQU1fTkFNRVNFUlZJQ0V9PC9saT4KKwkgKiA8bGk+e0B2YWx1ZSAjUEFSQU1fU0VSVklDRU5BTUV9PC9saT4KKwkgKiA8bGk+e0B2YWx1ZSAjUEFSQU1fVVNFUn08L2xpPgorCSAqIDxsaT57QHZhbHVlICNQQVJBTV9QQVNTV09SRH08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBMaXN0ZWQgbmFtZXMgYXJlIGF2YWlsYWJsZSB2aWEgcHVibGljIGZpZWxkcyBvZiB0aGlzIGNsYXNzLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBcHBsaWNhdGlvbkNvbnRleHQgY29ubmVjdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJQW9TZXNzaW9uIGFvU2Vzc2lvbiA9IG51bGw7CisJCXRyeSAoU2VydmljZUxvY2F0b3Igc2VydmljZUxvY2F0b3IgPSBuZXcgU2VydmljZUxvY2F0b3Iob3JiLCBnZXRQYXJhbWV0ZXIocGFyYW1ldGVycywgUEFSQU1fTkFNRVNFUlZJQ0UpKSkgeworCQkJU3RyaW5nIG5hbWVPZlNlcnZpY2UgPSBnZXRQYXJhbWV0ZXIocGFyYW1ldGVycywgUEFSQU1fU0VSVklDRU5BTUUpLnJlcGxhY2UoIi5BU0FNLU9EUyIsICIiKTsKKworCQkJQW9GYWN0b3J5IGFvRmFjdG9yeSA9IHNlcnZpY2VMb2NhdG9yLnJlc29sdmVGYWN0b3J5KG5hbWVPZlNlcnZpY2UpOworCQkJU3RyaW5nIGFvRmFjdG9yeU5hbWUgPSBhb0ZhY3RvcnkuZ2V0TmFtZSgpOworCQkJTE9HR0VSLmluZm8oIkNvbm5lY3RpbmcgdG8gT0RTIFNlcnZlciAobmFtZToge30sIGRlc2NyaXB0aW9uOiB7fSwgaW50ZXJmYWNlIHZlcnNpb246IHt9LCB0eXBlOiB7fSkgLi4uIiwKKwkJCQkJYW9GYWN0b3J5TmFtZSwgYW9GYWN0b3J5LmdldERlc2NyaXB0aW9uKCksIGFvRmFjdG9yeS5nZXRJbnRlcmZhY2VWZXJzaW9uKCksIGFvRmFjdG9yeS5nZXRUeXBlKCkpOworCisJCQkvLyBDcmVhdGUgYSBwYXJhbWV0ZXJzIG1hcCB3aXRob3V0IHBhc3N3b3JkICh3aGljaCBzaG91bGQgbm90IGJlIHZpc2libGUgZnJvbQorCQkJLy8gdGhpcyBwb2ludCBvbndhcmRzKSwKKwkJCS8vIGxlYXZpbmcgdGhlIG9yaWdpbmFsIG1hcCB1bnRvdWNoZWQ6CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnNXaXRob3V0UGFzc3dvcmQgPSBuZXcgSGFzaE1hcDw+KHBhcmFtZXRlcnMpOworCQkJaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJcGFyYW1ldGVyc1dpdGhvdXRQYXNzd29yZC5wdXQoUEFSQU1fUEFTU1dPUkQsICIqKioqIik7CisJCQkJTE9HR0VSLmRlYnVnKCJDb25uZWN0aW5nIHRvIE9EUyB1c2luZyB0aGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzOiB7fSIsCisJCQkJCQlzZXNzaW9uUGFyYW1ldGVyc0FzU3RyaW5nKHBhcmFtZXRlcnNXaXRob3V0UGFzc3dvcmQpKTsKKwkJCX0KKwkJCXBhcmFtZXRlcnNXaXRob3V0UGFzc3dvcmQucmVtb3ZlKFBBUkFNX1BBU1NXT1JEKTsKKworCQkJYW9TZXNzaW9uID0gYW9GYWN0b3J5Lm5ld1Nlc3Npb24oc2Vzc2lvblBhcmFtZXRlcnNBc1N0cmluZyhwYXJhbWV0ZXJzKSk7CisKKwkJCUxPR0dFUi5pbmZvKCJDb25uZWN0aW9uIHRvIE9EUyBzZXJ2ZXIgJ3t9JyBlc3RhYmxpc2hlZC4iLCBhb0ZhY3RvcnlOYW1lKTsKKworCQkJQ09SQkFGaWxlU2VydmVySUYgZmlsZVNlcnZlciA9IHNlcnZpY2VMb2NhdG9yLnJlc29sdmVGaWxlU2VydmVyKG5hbWVPZlNlcnZpY2UpOworCisJCQlyZXR1cm4gbmV3IE9EU0NvbnRleHQob3JiLCBhb1Nlc3Npb24sIGZpbGVTZXJ2ZXIsIHBhcmFtZXRlcnNXaXRob3V0UGFzc3dvcmQpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQljbG9zZVNlc3Npb24oYW9TZXNzaW9uKTsKKwkJCXRocm93IG5ldyBDb25uZWN0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gY29ubmVjdCB0byBPRFMgc2VydmVyIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIHNlc3Npb25QYXJhbWV0ZXJzQXNTdHJpbmcoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCUltbXV0YWJsZU1hcC5CdWlsZGVyPFN0cmluZywgU3RyaW5nPiBidWlsZGVyID0gSW1tdXRhYmxlTWFwLjxTdHJpbmcsIFN0cmluZz5idWlsZGVyKCkKKwkJCQkucHV0KCJVU0VSIiwgZ2V0UGFyYW1ldGVyKHBhcmFtZXRlcnMsIFBBUkFNX1VTRVIpKQorCQkJCS5wdXQoIlBBU1NXT1JEIiwgZ2V0UGFyYW1ldGVyKHBhcmFtZXRlcnMsIFBBUkFNX1BBU1NXT1JEKSkucHV0KCJDUkVBVEVfQ09TRVNTSU9OX0FMTE9XRUQiLCAiVFJVRSIpOworCisJCVN0cmluZyBmb3JVc2VyTmFtZSA9IHBhcmFtZXRlcnMuZ2V0KFBBUkFNX0ZPUl9VU0VSKTsKKwkJaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZm9yVXNlck5hbWUpKSB7CisJCQlidWlsZGVyLnB1dCgiRk9SX1VTRVIiLCBmb3JVc2VyTmFtZSk7CisJCX0KKwkJcmV0dXJuIEpvaW5lci5vbigiLCIpLndpdGhLZXlWYWx1ZVNlcGFyYXRvcigiPSIpLmpvaW4oYnVpbGRlci5idWlsZCgpKTsKKwl9CisKKwkvKioKKwkgKiBDbG9zZXMgZ2l2ZW4ge0BsaW5rIEFvU2Vzc2lvbn0gd2l0aCBjYXRjaGluZyBhbmQgbG9nZ2luZyBlcnJvcnMuCisJICoKKwkgKiBAcGFyYW0gYW9TZXNzaW9uIFRoZSB7QGNvZGUgQW9TZXNzaW9ufSB0aGF0IHNoYWxsIGJlIGNsb3NlZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlU2Vzc2lvbihBb1Nlc3Npb24gYW9TZXNzaW9uKSB7CisJCWlmIChhb1Nlc3Npb24gPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5IHsKKwkJCWFvU2Vzc2lvbi5jbG9zZSgpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQlMT0dHRVIud2FybigiVW5hYmxlIHRvIGNsb3NlIHNlc3NzaW9uIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlYWRzIHRoZSBwcm9wZXJ0eSBpZGVudGlmaWVkIGJ5IGdpdmVuIHByb3BlcnR5IG5hbWUuCisJICoKKwkgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcHJvcGVydGllcyB7QGNvZGUgTWFwfS4KKwkgKiBAcGFyYW0gbmFtZSAgICAgICBUaGUgcHJvcGVydHkgbmFtZS4KKwkgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24gVGhyb3duIGlmIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0IG9yIGlzIGVtcHR5LgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlTdHJpbmcgdmFsdWUgPSBwYXJhbWV0ZXJzLmdldChuYW1lKTsKKwkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgQ29ubmVjdGlvbkV4Y2VwdGlvbigiQ29ubmVjdGlvbiBwYXJhbWV0ZXIgd2l0aCBuYW1lICciICsgbmFtZSArICInIGlzIGVpdGhlciBtaXNzaW5nIG9yIGVtcHR5LiIpOworCQl9CisKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIFVzZWQgdG8gcmVzb2x2ZSBDT1JCQSBzZXJ2aWNlIG9iamVjdCBieSBJRCBhbmQga2luZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlTG9jYXRvciBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgeworCisJCXByaXZhdGUgTmFtaW5nQ29udGV4dEV4dCBuYW1pbmdDb250ZXh0OworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3Rvci4KKwkJICoKKwkJICogQHBhcmFtIG9yYiAgVGhlIHtAbGluayBPUkJ9IHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkJICogQHBhcmFtIHBhdGggVGhlIG5hbWluZyBjb250ZXh0IHBhdGguCisJCSAqIEB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJlc29sdmUgdGhlIG5hbWluZyBjb250ZXh0LgorCQkgKi8KKwkJcHVibGljIFNlcnZpY2VMb2NhdG9yKE9SQiBvcmIsIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCQluYW1pbmdDb250ZXh0ID0gTmFtaW5nQ29udGV4dEV4dEhlbHBlci5uYXJyb3cob3JiLnN0cmluZ190b19vYmplY3QocGF0aCkpOworCQkJaWYgKG5hbWluZ0NvbnRleHQgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBDb25uZWN0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzb2x2ZSBOYW1lU2VydmljZSAnIiArIHBhdGggKyAiJy4iKTsKKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUge0BsaW5rIEFvRmFjdG9yeX0gc2VydmljZSBmb3IgZ2l2ZW4gSUQuCisJCSAqCisJCSAqIEBwYXJhbSBpZCBVc2VkIGFzIGlkZW50aWZpZXIuCisJCSAqIEByZXR1cm4gVGhlIHtAY29kZSBBb0ZhY3Rvcnl9IGlzIHJldHVybmVkLgorCQkgKiBAdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXNvbHZlIHRoZSB7QGNvZGUKKwkJICogCQlBb0ZhY3Rvcnl9ICAgICAgICAgIC4KKwkJICovCisJCXB1YmxpYyBBb0ZhY3RvcnkgcmVzb2x2ZUZhY3RvcnkoU3RyaW5nIGlkKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCQlyZXR1cm4gQW9GYWN0b3J5SGVscGVyLm5hcnJvdyhyZXNvbHZlKGlkLCAiQVNBTS1PRFMiKSk7CisJCX0KKworCQkvKioKKwkJICogUmVzb2x2ZXMgYW5kIHJldHVybnMgdGhlIHtAbGluayBDT1JCQUZpbGVTZXJ2ZXJJRn0gc2VydmljZSBmb3IgZ2l2ZW4gSUQuCisJCSAqCisJCSAqIEBwYXJhbSBpZCBVc2VkIGFzIGlkZW50aWZpZXIuCisJCSAqIEByZXR1cm4gVGhlIHtAY29kZSBDT1JCQUZpbGVTZXJ2ZXJJRn0gb3IgbnVsbCwgaWYgbm9uZSBmb3VuZCwgaXMgcmV0dXJuZWQuCisJCSAqLworCQlwdWJsaWMgQ09SQkFGaWxlU2VydmVySUYgcmVzb2x2ZUZpbGVTZXJ2ZXIoU3RyaW5nIGlkKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBDT1JCQUZpbGVTZXJ2ZXJJRkhlbHBlci5uYXJyb3cocmVzb2x2ZShpZCwgIkNPUkJBLUZUIikpOworCQkJfSBjYXRjaCAoQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQkJTE9HR0VSLndhcm4oZS5nZXRNZXNzYWdlKCkpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFJlc29sdmVzIGEgQ09SQkEgc2VydmljZSBvYmplY3QgZm9yIGdpdmVuIGlkIGFuZCBraW5kLgorCQkgKgorCQkgKiBAcGFyYW0gaWQgICBVc2VkIGFzIGlkZW50aWZpZXIuCisJCSAqIEBwYXJhbSBraW5kIFVzZWQgYXMgcXVhbGlmaWVyLgorCQkgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCBDT1JCQSBzZXJ2aWNlIG9iamVjdCBpcyByZXR1cm5lZC4KKwkJICogQHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkJICovCisJCXB1YmxpYyBPYmplY3QgcmVzb2x2ZShTdHJpbmcgaWQsIFN0cmluZyBraW5kKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCXJldHVybiBuYW1pbmdDb250ZXh0LnJlc29sdmUobmV3IE5hbWVDb21wb25lbnRbXSB7IG5ldyBOYW1lQ29tcG9uZW50KGlkLCBraW5kKSB9KTsKKwkJCX0gY2F0Y2ggKE5vdEZvdW5kIHwgQ2Fubm90UHJvY2VlZCB8IEludmFsaWROYW1lIGUpIHsKKwkJCQl0aHJvdyBuZXcgQ29ubmVjdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc29sdmUgc2VydmljZSAnIiArIGlkICsgIi4iICsga2luZCArICInLiIsIGUpOworCQkJfQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQkJbmFtaW5nQ29udGV4dC5fcmVsZWFzZSgpOworCQl9CisKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTRW50aXR5TWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0VudGl0eU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjdhMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0VudGl0eU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDQ2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsaWNhdGlvblN0cnVjdHVyZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuRWxlbUlkOworaW1wb3J0IG9yZy5hc2FtLm9kcy5JbnN0YW5jZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGEuUmVhZFJlcXVlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWxHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dERlc2NyaWJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVkVmFsdWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TdGF0dXNBdHRhY2hhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Kb2luVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVjb3JkOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNsYXNzaWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVUZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuZmlsZXRyYW5zZmVyLlRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuRW50aXR5TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZy5LZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudHJhbnNhY3Rpb24uT0RTVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBBU0FNIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEVudGl0eU1hbmFnZXJ9IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIE9EU0VudGl0eU1hbmFnZXIgaW1wbGVtZW50cyBFbnRpdHlNYW5hZ2VyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT0RTRW50aXR5TWFuYWdlci5jbGFzcyk7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCXByaXZhdGUgZmluYWwgVHJhbnNmZXIgdHJhbnNmZXIgPSBUcmFuc2Zlci5TT0NLRVQ7CisKKwlwcml2YXRlIGZpbmFsIE9EU0NvbnRleHQgY29udGV4dDsKKwlwcml2YXRlIGZpbmFsIE9EU01vZGVsTWFuYWdlciBvZHNNb2RlbE1hbmFnZXI7CisJcHJpdmF0ZSBmaW5hbCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlOworCXByaXZhdGUgZmluYWwgRW50aXR5TG9hZGVyIGVudGl0eUxvYWRlcjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0IFRoZSB7QGxpbmsgT0RTQ29udGV4dH0uCisJICovCisJcHVibGljIE9EU0VudGl0eU1hbmFnZXIoT0RTQ29udGV4dCBjb250ZXh0KSB7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJCXRoaXMub2RzTW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRPRFNNb2RlbE1hbmFnZXIoKTsKKwkJdGhpcy5xdWVyeVNlcnZpY2UgPSBjb250ZXh0LmdldFF1ZXJ5U2VydmljZSgpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBTZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24oUXVlcnlTZXJ2aWNlLmNsYXNzKSk7CisJCWVudGl0eUxvYWRlciA9IG5ldyBFbnRpdHlMb2FkZXIob2RzTW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW52aXJvbm1lbnQgbG9hZEVudmlyb25tZW50KCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMaXN0PEVudmlyb25tZW50PiBlbnZpcm9ubWVudHMgPSBsb2FkQWxsKEVudmlyb25tZW50LmNsYXNzKTsKKwkJaWYgKGVudmlyb25tZW50cy5zaXplKCkgIT0gMSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIlVuYWJsZSB0byBsYW9kIHRoZSBlbnZpcm9ubWVudCBlbnRpdHkuIik7CisJCX0KKworCQlyZXR1cm4gZW52aXJvbm1lbnRzLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9wdGlvbmFsPFVzZXI+IGxvYWRMb2dnZWRPblVzZXIoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUluc3RhbmNlRWxlbWVudCBpZVVzZXIgPSBudWxsOworCQl0cnkgeworCQkJaWVVc2VyID0gb2RzTW9kZWxNYW5hZ2VyLmdldEFvU2Vzc2lvbigpLmdldFVzZXIoKTsKKwkJCXJldHVybiBPcHRpb25hbC5vZigKKwkJCQkJZW50aXR5TG9hZGVyLmxvYWQobmV3IEtleTw+KFVzZXIuY2xhc3MpLCBMb25nLnRvU3RyaW5nKE9EU0NvbnZlcnRlci5mcm9tT0RTTG9uZyhpZVVzZXIuZ2V0SWQoKSkpKSk7CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCB0aGUgbG9nZ2VkIGluIHVzZXIgZW50aXR5IGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJaWYgKGllVXNlciAhPSBudWxsKSB7CisJCQkJCWllVXNlci5kZXN0cm95KCk7CisJCQkJCWllVXNlci5fcmVsZWFzZSgpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGFvZSkgeworCQkJCUxPR0dFUi53YXJuKCJVbmFibGUgdG8gZGVzdHJveSB0aGUgQ09SQkEgcmVzb3VyY2UgZHVlIHRvOiAiICsgYW9lLnJlYXNvbiwgYW9lKTsKKwkJCQlpZVVzZXIuX3JlbGVhc2UoKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZChDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29sbGVjdGlvbjxTdHJpbmc+IGluc3RhbmNlSURzKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZW50aXR5TG9hZGVyLmxvYWRBbGwobmV3IEtleTw+KGVudGl0eUNsYXNzKSwgaW5zdGFuY2VJRHMpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZChDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUsCisJCQlDb2xsZWN0aW9uPFN0cmluZz4gaW5zdGFuY2VJRHMpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGVudGl0eUxvYWRlci5sb2FkQWxsKG5ldyBLZXk8PihlbnRpdHlDbGFzcywgY29udGV4dFR5cGUpLCBpbnN0YW5jZUlEcyk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gT3B0aW9uYWw8VD4gbG9hZFBhcmVudChFbnRpdHkgY2hpbGQsIENsYXNzPFQ+IGVudGl0eUNsYXNzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUVudGl0eVR5cGUgcGFyZW50RW50aXR5VHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGVudGl0eUNsYXNzKTsKKwkJRW50aXR5VHlwZSBjaGlsZEVudGl0eVR5cGUgPSBvZHNNb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShjaGlsZCk7CisJCVF1ZXJ5IHF1ZXJ5ID0gcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KCkuc2VsZWN0SUQocGFyZW50RW50aXR5VHlwZSk7CisKKwkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2hhbm5lbCAmJiBDaGFubmVsR3JvdXAuY2xhc3MuZXF1YWxzKGVudGl0eUNsYXNzKSkgeworCQkJLy8gdGhpcyBjb3ZlcnMgdGhlIGdhcCBiZXR3ZWVuIGNoYW5uZWwgYW5kIGNoYW5uZWwgZ3JvdXAgdmlhIGxvY2FsCisJCQkvLyBjb2x1bW4KKwkJCUVudGl0eVR5cGUgbG9jYWxDb2x1bW5FbnRpdHlUeXBlID0gb2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoIkxvY2FsQ29sdW1uIik7CisJCQlxdWVyeS5qb2luKGNoaWxkRW50aXR5VHlwZSwgbG9jYWxDb2x1bW5FbnRpdHlUeXBlKS5qb2luKGxvY2FsQ29sdW1uRW50aXR5VHlwZSwgcGFyZW50RW50aXR5VHlwZSk7CisJCX0gZWxzZSB7CisJCQlxdWVyeS5qb2luKGNoaWxkRW50aXR5VHlwZSwgcGFyZW50RW50aXR5VHlwZSk7CisJCX0KKworCQlPcHRpb25hbDxTdHJpbmc+IGluc3RhbmNlSUQgPSBxdWVyeS5mZXRjaFNpbmdsZXRvbihGaWx0ZXIuaWRPbmx5KGNoaWxkRW50aXR5VHlwZSwgY2hpbGQuZ2V0SUQoKSkpCisJCQkJLm1hcChyIC0+IHIuZ2V0UmVjb3JkKHBhcmVudEVudGl0eVR5cGUpKS5tYXAoUmVjb3JkOjpnZXRJRCk7CisJCWlmIChpbnN0YW5jZUlELmlzUHJlc2VudCgpKSB7CisJCQlyZXR1cm4gT3B0aW9uYWwub2YoZW50aXR5TG9hZGVyLmxvYWQobmV3IEtleTw+KGVudGl0eUNsYXNzKSwgaW5zdGFuY2VJRC5nZXQoKSkpOworCQl9CisKKwkJcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkQWxsKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdHJpbmcgcGF0dGVybikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZW50aXR5TG9hZGVyLmxvYWRBbGwobmV3IEtleTw+KGVudGl0eUNsYXNzKSwgcGF0dGVybik7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+IExpc3Q8VD4gbG9hZEFsbChDbGFzczxUPiBlbnRpdHlDbGFzcywgU3RhdHVzIHN0YXR1cywgU3RyaW5nIHBhdHRlcm4pCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGVudGl0eUNsYXNzKTsKKwkJRW50aXR5VHlwZSBjbGFzc2lmaWNhdGlvblR5cGUgPSBvZHNNb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShDbGFzc2lmaWNhdGlvbi5jbGFzcyk7CisJCUVudGl0eVR5cGUgc3RhdHVzRW50aXR5VHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKHN0YXR1cy5nZXRUeXBlTmFtZSgpKTsKKworCQlMaXN0PFN0cmluZz4gaW5zdGFuY2VJRHMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5qb2luKGVudGl0eVR5cGUsIGNsYXNzaWZpY2F0aW9uVHlwZSkKKwkJCQkuam9pbihjbGFzc2lmaWNhdGlvblR5cGUsIHN0YXR1c0VudGl0eVR5cGUpLnNlbGVjdElEKGVudGl0eVR5cGUpCisJCQkJLmZldGNoKEZpbHRlci5hbmQoKS5pZChzdGF0dXNFbnRpdHlUeXBlLCBzdGF0dXMuZ2V0SUQoKSkubmFtZShlbnRpdHlUeXBlLCBwYXR0ZXJuKSkuc3RyZWFtKCkKKwkJCQkubWFwKHIgLT4gci5nZXRSZWNvcmQoZW50aXR5VHlwZSkpLm1hcChSZWNvcmQ6OmdldElEKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisJCXJldHVybiBlbnRpdHlMb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oZW50aXR5Q2xhc3MpLCBpbnN0YW5jZUlEcyk7CisJfQorCisJLyoKKwkgKiBAT3ZlcnJpZGUgcHVibGljIExpc3Q8U3RhdHVzPiBsb2FkQWxsU3RhdHVzKENsYXNzPD8gZXh0ZW5kcyBTdGF0dXNBdHRhY2hhYmxlPgorCSAqIGVudGl0eUNsYXNzLCBTdHJpbmcgcGF0dGVybikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geyByZXR1cm4KKwkgKiBlbnRpdHlMb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oU3RhdHVzLmNsYXNzLCBlbnRpdHlDbGFzcyksIHBhdHRlcm4pOyB9CisJICovCisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWRBbGwoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlLCBTdHJpbmcgcGF0dGVybikKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGVudGl0eUxvYWRlci5sb2FkQWxsKG5ldyBLZXk8PihlbnRpdHlDbGFzcywgY29udGV4dFR5cGUpLCBwYXR0ZXJuKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWRDaGlsZHJlbihFbnRpdHkgcGFyZW50LCBDbGFzczxUPiBlbnRpdHlDbGFzcywgU3RyaW5nIHBhdHRlcm4pCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUVudGl0eVR5cGUgcGFyZW50RW50aXR5VHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKHBhcmVudCk7CisJCUVudGl0eVR5cGUgY2hpbGRFbnRpdHlUeXBlID0gb2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoZW50aXR5Q2xhc3MpOworCQlRdWVyeSBxdWVyeSA9IHF1ZXJ5U2VydmljZS5jcmVhdGVRdWVyeSgpOworCisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDaGFubmVsR3JvdXAgJiYgQ2hhbm5lbC5jbGFzcy5lcXVhbHMoZW50aXR5Q2xhc3MpKSB7CisJCQkvLyB0aGlzIGNvdmVycyB0aGUgZ2FwIGJldHdlZW4gY2hhbm5lbCBhbmQgY2hhbm5lbCBncm91cCB2aWEgbG9jYWwKKwkJCS8vIGNvbHVtbgorCQkJRW50aXR5VHlwZSBsb2NhbENvbHVtbkVudGl0eVR5cGUgPSBvZHNNb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZSgiTG9jYWxDb2x1bW4iKTsKKwkJCXF1ZXJ5LmpvaW4oY2hpbGRFbnRpdHlUeXBlLCBsb2NhbENvbHVtbkVudGl0eVR5cGUpLmpvaW4obG9jYWxDb2x1bW5FbnRpdHlUeXBlLCBwYXJlbnRFbnRpdHlUeXBlKTsKKwkJfSBlbHNlIHsKKwkJCXF1ZXJ5LmpvaW4oY2hpbGRFbnRpdHlUeXBlLCBwYXJlbnRFbnRpdHlUeXBlKTsKKwkJfQorCisJCUxpc3Q8U3RyaW5nPiBpbnN0YW5jZUlEcyA9IHF1ZXJ5LnNlbGVjdElEKGNoaWxkRW50aXR5VHlwZSkKKwkJCQkuZmV0Y2goRmlsdGVyLmFuZCgpLmlkKHBhcmVudEVudGl0eVR5cGUsIHBhcmVudC5nZXRJRCgpKS5uYW1lKGNoaWxkRW50aXR5VHlwZSwgcGF0dGVybikpLnN0cmVhbSgpCisJCQkJLm1hcChyIC0+IHIuZ2V0UmVjb3JkKGNoaWxkRW50aXR5VHlwZSkpLm1hcChSZWNvcmQ6OmdldElEKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQlyZXR1cm4gZW50aXR5TG9hZGVyLmxvYWRBbGwobmV3IEtleTw+KGVudGl0eUNsYXNzKSwgaW5zdGFuY2VJRHMpOworCX0KKworCS8vIC8qKgorCS8vICoge0Bpbmhlcml0RG9jfQorCS8vICovCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIDxUIGV4dGVuZHMgU3RhdHVzQXR0YWNoYWJsZT4gTGlzdDxUPiBsb2FkQ2hpbGRyZW4oRW50aXR5IHBhcmVudCwKKwkvLyBDbGFzczxUPiBlbnRpdHlDbGFzcywgU3RhdHVzIHN0YXR1cywKKwkvLyBTdHJpbmcgcGF0dGVybikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCS8vIEVudGl0eVR5cGUgcGFyZW50RW50aXR5VHlwZSA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKHBhcmVudCk7CisJLy8gRW50aXR5VHlwZSBjaGlsZEVudGl0eVR5cGUgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShlbnRpdHlDbGFzcyk7CisJLy8gRW50aXR5VHlwZSBzdGF0dXNFbnRpdHlUeXBlID0KKwkvLyBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShzdGF0dXMuZ2V0VHlwZU5hbWUoKSk7CisJLy8KKwkvLyBMaXN0PFN0cmluZz4gaW5zdGFuY2VJRHMgPSBtb2RlbE1hbmFnZXIuY3JlYXRlUXVlcnkoKQorCS8vIC5qb2luKGNoaWxkRW50aXR5VHlwZSwgcGFyZW50RW50aXR5VHlwZSwgc3RhdHVzRW50aXR5VHlwZSkKKwkvLyAuc2VsZWN0SUQoY2hpbGRFbnRpdHlUeXBlKQorCS8vIC5mZXRjaChGaWx0ZXIuYW5kKCkKKwkvLyAuaWQocGFyZW50RW50aXR5VHlwZSwgcGFyZW50LmdldElEKCkpCisJLy8gLmlkKHN0YXR1c0VudGl0eVR5cGUsIHN0YXR1cy5nZXRJRCgpKQorCS8vIC5uYW1lKGNoaWxkRW50aXR5VHlwZSwgcGF0dGVybikpCisJLy8gLnN0cmVhbSgpLm1hcChyIC0+CisJLy8gci5nZXRSZWNvcmQoY2hpbGRFbnRpdHlUeXBlKSkubWFwKFJlY29yZDo6Z2V0SUQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJLy8KKwkvLyByZXR1cm4gZW50aXR5TG9hZGVyLmxvYWRBbGwobmV3IEtleTw+KGVudGl0eUNsYXNzKSwgaW5zdGFuY2VJRHMpOworCS8vIH0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxDb250ZXh0VHlwZT4gbG9hZENvbnRleHRUeXBlcyhDb250ZXh0RGVzY3JpYmFibGUgY29udGV4dERlc2NyaWJhYmxlKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUVudGl0eVR5cGUgY29udGV4dERlc2NyaWJhYmxlRW50aXR5VHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGNvbnRleHREZXNjcmliYWJsZSk7CisJCVF1ZXJ5IHF1ZXJ5ID0gcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KCk7CisKKwkJTWFwPENvbnRleHRUeXBlLCBFbnRpdHlUeXBlPiBjb250ZXh0Um9vdEVudGl0eVR5cGVzID0gbmV3IEVudW1NYXA8PihDb250ZXh0VHlwZS5jbGFzcyk7CisJCWZvciAoQ29udGV4dFR5cGUgY29udGV4dFR5cGUgOiBDb250ZXh0VHlwZS52YWx1ZXMoKSkgeworCQkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gb2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoQ29udGV4dFJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKTsKKwkJCWNvbnRleHRSb290RW50aXR5VHlwZXMucHV0KGNvbnRleHRUeXBlLCBlbnRpdHlUeXBlKTsKKwkJCXF1ZXJ5LmpvaW4oY29udGV4dERlc2NyaWJhYmxlRW50aXR5VHlwZS5nZXRSZWxhdGlvbihlbnRpdHlUeXBlKSwgSm9pblR5cGUuT1VURVIpLnNlbGVjdElEKGVudGl0eVR5cGUpOworCQl9CisKKwkJT3B0aW9uYWw8UmVzdWx0PiByZXN1bHQgPSBxdWVyeQorCQkJCS5mZXRjaFNpbmdsZXRvbihGaWx0ZXIuaWRPbmx5KGNvbnRleHREZXNjcmliYWJsZUVudGl0eVR5cGUsIGNvbnRleHREZXNjcmliYWJsZS5nZXRJRCgpKSk7CisJCWlmIChyZXN1bHQuaXNQcmVzZW50KCkpIHsKKwkJCUxpc3Q8Q29udGV4dFR5cGU+IGNvbnRleHRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJZm9yIChFbnRyeTxDb250ZXh0VHlwZSwgRW50aXR5VHlwZT4gZW50cnkgOiBjb250ZXh0Um9vdEVudGl0eVR5cGVzLmVudHJ5U2V0KCkpIHsKKwkJCQlPcHRpb25hbDxTdHJpbmc+IGluc3RhbmNlSUQgPSByZXN1bHQubWFwKHIgLT4gci5nZXRSZWNvcmQoZW50cnkuZ2V0VmFsdWUoKSkpLm1hcChSZWNvcmQ6OmdldElEKTsKKwkJCQlpZiAoaW5zdGFuY2VJRC5pc1ByZXNlbnQoKSkgeworCQkJCQljb250ZXh0VHlwZXMuYWRkKGVudHJ5LmdldEtleSgpKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBjb250ZXh0VHlwZXM7CisJCX0KKworCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8Q29udGV4dFR5cGUsIENvbnRleHRSb290PiBsb2FkQ29udGV4dHMoQ29udGV4dERlc2NyaWJhYmxlIGNvbnRleHREZXNjcmliYWJsZSwKKwkJCUNvbnRleHRUeXBlLi4uIGNvbnRleHRUeXBlcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlFbnRpdHlUeXBlIGNvbnRleHREZXNjcmliYWJsZUVudGl0eVR5cGUgPSBvZHNNb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShjb250ZXh0RGVzY3JpYmFibGUpOworCQlRdWVyeSBxdWVyeSA9IHF1ZXJ5U2VydmljZS5jcmVhdGVRdWVyeSgpOworCisJCU1hcDxDb250ZXh0VHlwZSwgRW50aXR5VHlwZT4gY29udGV4dFJvb3RFbnRpdHlUeXBlcyA9IG5ldyBFbnVtTWFwPD4oQ29udGV4dFR5cGUuY2xhc3MpOworCQlmb3IgKENvbnRleHRUeXBlIGNvbnRleHRUeXBlIDogY29udGV4dFR5cGVzLmxlbmd0aCA9PSAwID8gQ29udGV4dFR5cGUudmFsdWVzKCkgOiBjb250ZXh0VHlwZXMpIHsKKwkJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKENvbnRleHRSb290LmNsYXNzLCBjb250ZXh0VHlwZSk7CisJCQljb250ZXh0Um9vdEVudGl0eVR5cGVzLnB1dChjb250ZXh0VHlwZSwgZW50aXR5VHlwZSk7CisJCQlxdWVyeS5qb2luKGNvbnRleHREZXNjcmliYWJsZUVudGl0eVR5cGUuZ2V0UmVsYXRpb24oZW50aXR5VHlwZSksIEpvaW5UeXBlLk9VVEVSKS5zZWxlY3RJRChlbnRpdHlUeXBlKTsKKwkJfQorCisJCU9wdGlvbmFsPFJlc3VsdD4gcmVzdWx0ID0gcXVlcnkKKwkJCQkuZmV0Y2hTaW5nbGV0b24oRmlsdGVyLmlkT25seShjb250ZXh0RGVzY3JpYmFibGVFbnRpdHlUeXBlLCBjb250ZXh0RGVzY3JpYmFibGUuZ2V0SUQoKSkpOworCQlpZiAocmVzdWx0LmlzUHJlc2VudCgpKSB7CisJCQlNYXA8Q29udGV4dFR5cGUsIENvbnRleHRSb290PiBjb250ZXh0Um9vdHMgPSBuZXcgRW51bU1hcDw+KENvbnRleHRUeXBlLmNsYXNzKTsKKwkJCWZvciAoRW50cnk8Q29udGV4dFR5cGUsIEVudGl0eVR5cGU+IGVudHJ5IDogY29udGV4dFJvb3RFbnRpdHlUeXBlcy5lbnRyeVNldCgpKSB7CisJCQkJU3RyaW5nIGluc3RhbmNlSUQgPSByZXN1bHQuZ2V0KCkuZ2V0UmVjb3JkKGVudHJ5LmdldFZhbHVlKCkpLmdldElEKCk7CisJCQkJaWYgKE9EU1V0aWxzLmlzVmFsaWRJRChpbnN0YW5jZUlEKSkgeworCQkJCQljb250ZXh0Um9vdHMucHV0KGVudHJ5LmdldEtleSgpLAorCQkJCQkJCWVudGl0eUxvYWRlci5sb2FkKG5ldyBLZXk8PihDb250ZXh0Um9vdC5jbGFzcywgZW50cnkuZ2V0S2V5KCkpLCBpbnN0YW5jZUlEKSk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gY29udGV4dFJvb3RzOworCQl9CisKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkUmVsYXRlZEVudGl0aWVzKEVudGl0eSBlbnRpdHksIFN0cmluZyByZWxhdGlvbk5hbWUsIENsYXNzPFQ+IHJlbGF0ZWRDbGFzcykgeworCQlPRFNFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSAoKE9EU0VudGl0eVR5cGUpIGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShlbnRpdHkpKTsKKwkJRWxlbUlkIGVsZW1JZCA9IG5ldyBFbGVtSWQoZW50aXR5VHlwZS5nZXRPRFNJRCgpLCBPRFNDb252ZXJ0ZXIudG9PRFNJRChlbnRpdHkuZ2V0SUQoKSkpOworCisJCXRyeSB7CisJCQlUX0xPTkdMT05HW10gaW5zdGFuY2VJZHMgPSBjb250ZXh0LmdldEFvU2Vzc2lvbigpLmdldEFwcGxFbGVtQWNjZXNzKCkuZ2V0UmVsSW5zdChlbGVtSWQsIHJlbGF0aW9uTmFtZSk7CisJCQlMaXN0PFN0cmluZz4gaW5zdGFuY2VJRHMgPSBTdHJlYW0ub2YoaW5zdGFuY2VJZHMpLm1hcChPRFNDb252ZXJ0ZXI6OmZyb21PRFNMb25nKS5tYXAobCAtPiBsLnRvU3RyaW5nKCkpCisJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJcmV0dXJuIGVudGl0eUxvYWRlci5sb2FkQWxsKG5ldyBLZXk8PihyZWxhdGVkQ2xhc3MpLCBpbnN0YW5jZUlEcyk7CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCIiICsgZS5yZWFzb24sIGUpOyAvLyBUT0RPCisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8TWVhc3VyZWRWYWx1ZXM+IHJlYWRNZWFzdXJlZFZhbHVlcyhSZWFkUmVxdWVzdCByZWFkUmVxdWVzdCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IFJlYWRSZXF1ZXN0SGFuZGxlcihvZHNNb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSkuZXhlY3V0ZShyZWFkUmVxdWVzdCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBUcmFuc2FjdGlvbiBzdGFydFRyYW5zYWN0aW9uKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIG5ldyBPRFNUcmFuc2FjdGlvbihjb250ZXh0LCBsb2FkRW52aXJvbm1lbnQoKSwgdHJhbnNmZXIpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIHN0YXJ0IHRyYW5zYWN0aW9uIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHJpdmVzIHRoZSBBU0FNIHBhdGhzIGZvciB0aGUgZ2l2ZW4gZW50aXRpZXMuIFRoZSBBU0FNIHBhdGhzIGFyZSBwcmVmaXhlZAorCSAqIHdpdGggYSBzZXJ2aWNlbmFtZSwgaW4gdGhlIGZvcm0KKwkgKiA8Y29kZT5jb3JiYWxvYzpbaW9wfHNzbGlvcF06MS4yQEhPU1ROQU1FOlBPUlQvTmFtZVNlcnZpY2UvTURNLkFTQU0tT0RTLzwvY29kZT4KKwkgKiAKKwkgKiBAcmV0dXJucyByZXR1cm5zIGEgbWFwIHdpdGggdGhlIEFTQU0gcGF0aHMgdG8gdGhlIGdpdmVuIGVudGl0aWVzLiBJZiBhIGVudGl0eQorCSAqICAgICAgICAgIGlzIG5vdCBmb3VuZCBpbiB0aGUgT0RTIHNlcnZlciB0aGUgZW50aXR5IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUKKwkgKiAgICAgICAgICByZXN1bHQgbWFwLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiAgICAgIGlmIGxpbmtzIGNvdWxkIG5vdCBiZSBsb2FkZWQgZm9yIHRoZSBnaXZlbgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSB0aGUgc291cmNlIG9yIHR5cGVOYW1lIG9mIGFuIGVudGl0eSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5CYXNlRW50aXR5TWFuYWdlciNnZXRMaW5rcyhDb2xsZWN0aW9uKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8RW50aXR5LCBTdHJpbmc+IGdldExpbmtzKENvbGxlY3Rpb248RW50aXR5PiBlbnRpdGllcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCisJCU1hcDxFbnRpdHksIFN0cmluZz4gbGlua01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlBcHBsaWNhdGlvblN0cnVjdHVyZSBhcHBTdHJ1Y3R1cmU7CisJCXRyeSB7CisJCQlhcHBTdHJ1Y3R1cmUgPSBvZHNNb2RlbE1hbmFnZXIuZ2V0QW9TZXNzaW9uKCkuZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKTsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGFwcGxpY2F0aW9uIHN0cnVjdHVyZSEgUmVhc29uOiAiICsgZS5yZWFzb24sIGUpOworCQl9CisKKwkJU3RyaW5nIHNlcnZlclJvb3QgPSBjb250ZXh0LmdldFBhcmFtZXRlcnMoKS5nZXQoT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0UpICsgIi8iCisJCQkJKyBjb250ZXh0LmdldFBhcmFtZXRlcnMoKS5nZXQoT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fU0VSVklDRU5BTUUpOworCisJCU1hcDxTdHJpbmcsIExpc3Q8RW50aXR5Pj4gZW50aXRpZXNCeVR5cGVOYW1lID0gZW50aXRpZXMuc3RyZWFtKCkuZmlsdGVyKGUgLT4gZS5nZXRUeXBlTmFtZSgpICE9IG51bGwpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KEVudGl0eTo6Z2V0VHlwZU5hbWUpKTsKKworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8RW50aXR5Pj4gZW50cnkgOiBlbnRpdGllc0J5VHlwZU5hbWUuZW50cnlTZXQoKSkgeworCQkJT0RTRW50aXR5VHlwZSBldCA9IChPRFNFbnRpdHlUeXBlKSBvZHNNb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShlbnRyeS5nZXRLZXkoKSk7CisKKwkJCUxpc3Q8RWxlbUlkPiBlbGVtSWRzID0gZW50cnkuZ2V0VmFsdWUoKS5zdHJlYW0oKQorCQkJCQkubWFwKGUgLT4gbmV3IEVsZW1JZChldC5nZXRPRFNJRCgpLCBPRFNDb252ZXJ0ZXIudG9PRFNMb25nKExvbmcucGFyc2VMb25nKGUuZ2V0SUQoKSkpKSkKKwkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJCXRyeSB7CisJCQkJSW5zdGFuY2VFbGVtZW50W10gaW5zdGFuY2VzID0gYXBwU3RydWN0dXJlLmdldEluc3RhbmNlc0J5SWQoZWxlbUlkcy50b0FycmF5KG5ldyBFbGVtSWRbMF0pKTsKKworCQkJCWZvciAoSW5zdGFuY2VFbGVtZW50IGllIDogaW5zdGFuY2VzKSB7CisJCQkJCVN0cmluZyBpZCA9IExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGllLmdldElkKCkpKTsKKwkJCQkJU3RyaW5nIGFzYW1QYXRoID0gc2VydmVyUm9vdCArIGllLmdldEFzYW1QYXRoKCk7CisJCQkJCWVudHJ5LmdldFZhbHVlKCkuc3RyZWFtKCkuZmlsdGVyKGUgLT4gZS5nZXRJRCgpLmVxdWFscyhpZCkpLmZpbmRGaXJzdCgpCisJCQkJCQkJLmlmUHJlc2VudChlIC0+IGxpbmtNYXAucHV0KGUsIGFzYW1QYXRoKSk7CisJCQkJfQorCQkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJCUxPR0dFUi5kZWJ1ZygiQ291bGQgbm90IGxvYWQgbGlua3MgZm9yIGVudGl0aWVzOiAiICsgZW50aXRpZXMgKyAiLiBSZWFzb246ICIgKyBlLnJlYXNvbiwgZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbGlua01hcDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9wdGlvbmFsPFRlbXBsYXRlVGVzdD4gbG9hZFRlbXBsYXRlKFRlc3QgdGVzdCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2YoT0RTRW50aXR5RmFjdG9yeS5leHRyYWN0KHRlc3QpLmdldE11dGFibGVTdG9yZSgpLmdldChUZW1wbGF0ZVRlc3QuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9wdGlvbmFsPFRlbXBsYXRlVGVzdFN0ZXA+IGxvYWRUZW1wbGF0ZShUZXN0U3RlcCB0ZXN0U3RlcCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2YoT0RTRW50aXR5RmFjdG9yeS5leHRyYWN0KHRlc3RTdGVwKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVUZXN0U3RlcC5jbGFzcykpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9SZWFkUmVxdWVzdEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9SZWFkUmVxdWVzdEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWJkNmFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL1JlYWRSZXF1ZXN0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5QYWlyOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQ29sdW1uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtSWQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLk5hbWVWYWx1ZVNlcVVuaXQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlZhbHVlTWF0cml4OworaW1wb3J0IG9yZy5hc2FtLm9kcy5WYWx1ZU1hdHJpeE1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhLlJlYWRSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5SZWFkUmVxdWVzdC5WYWx1ZXNNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlZFZhbHVlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkNvbXBhcmlzb25PcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiBSZWFkcyBtYXNzIGRhdGEgc3BlY2lmaWVkIGluIHtAbGluayBSZWFkUmVxdWVzdH1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVhZFJlcXVlc3RIYW5kbGVyIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENvbHVtbkF0dHJpYnV0ZXMgeworCQlwcml2YXRlIFN0cmluZyBuYW1lOworCQlwcml2YXRlIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwkJcHJpdmF0ZSBkb3VibGVbXSBnZW5lcmF0aW9uUGFyYW1ldGVyczsKKwkJcHJpdmF0ZSBib29sZWFuIGluZGVwZW5kZW50OworCQlwcml2YXRlIEF4aXNUeXBlIGF4aXNUeXBlOworCisJCXB1YmxpYyBDb2x1bW5BdHRyaWJ1dGVzKFN0cmluZyBuYW1lLCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIHNlcXVlbmNlUmVwcmVzZW50YXRpb24sCisJCQkJZG91YmxlW10gZ2VuZXJhdGlvblBhcmFtZXRlcnMsIGJvb2xlYW4gaW5kZXBlbmRlbnQsIEF4aXNUeXBlIGF4aXNUeXBlKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy5zZXF1ZW5jZVJlcHJlc2VudGF0aW9uID0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwkJCXRoaXMuZ2VuZXJhdGlvblBhcmFtZXRlcnMgPSBnZW5lcmF0aW9uUGFyYW1ldGVyczsKKwkJCXRoaXMuaW5kZXBlbmRlbnQgPSBpbmRlcGVuZGVudDsKKwkJCXRoaXMuYXhpc1R5cGUgPSBheGlzVHlwZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIGdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKSB7CisJCQlyZXR1cm4gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQl0aGlzLnNlcXVlbmNlUmVwcmVzZW50YXRpb24gPSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworCQl9CisKKwkJcHVibGljIGRvdWJsZVtdIGdldEdlbmVyYXRpb25QYXJhbWV0ZXJzKCkgeworCQkJcmV0dXJuIGdlbmVyYXRpb25QYXJhbWV0ZXJzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGlvblBhcmFtZXRlcnMoZG91YmxlW10gZ2VuZXJhdGlvblBhcmFtZXRlcnMpIHsKKwkJCXRoaXMuZ2VuZXJhdGlvblBhcmFtZXRlcnMgPSBnZW5lcmF0aW9uUGFyYW1ldGVyczsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzSW5kZXBlbmRlbnRDb2x1bW4oKSB7CisJCQlyZXR1cm4gaW5kZXBlbmRlbnQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRJbmRlcGVuZGVudENvbHVtbihib29sZWFuIGluZGVwZW5kZW50KSB7CisJCQl0aGlzLmluZGVwZW5kZW50ID0gaW5kZXBlbmRlbnQ7CisJCX0KKworCQlwdWJsaWMgQXhpc1R5cGUgZ2V0QXhpc1R5cGUoKSB7CisJCQlyZXR1cm4gYXhpc1R5cGU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRBeGlzVHlwZShBeGlzVHlwZSBheGlzVHlwZSkgeworCQkJdGhpcy5heGlzVHlwZSA9IGF4aXNUeXBlOworCQl9CisKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyOworCXByaXZhdGUgZmluYWwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBnYWluIGFjY2VzcyB0byB2YWx1ZSBtYXRyaWNlcy4KKwkgKi8KKwlwdWJsaWMgUmVhZFJlcXVlc3RIYW5kbGVyKE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UpIHsKKwkJdGhpcy5tb2RlbE1hbmFnZXIgPSBtb2RlbE1hbmFnZXI7CisJCXRoaXMucXVlcnlTZXJ2aWNlID0gcXVlcnlTZXJ2aWNlOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIExvYWRzIHtAbGluayBNZWFzdXJlZFZhbHVlc30gYXMgZGVmaW5lZCBpbiBnaXZlbiB7QGxpbmsgUmVhZFJlcXVlc3R9LgorCSAqCisJICogQHBhcmFtIHJlYWRSZXF1ZXN0IFRoZSB7QGNvZGUgTWVhc3VyZWRWYWx1ZXN9IHJlcXVlc3QgY29uZmlndXJhdGlvbi4KKwkgKiBAcmV0dXJuIFRoZSBsb2FkZWQge0Bjb2RlIE1lYXN1cmVkVmFsdWVzfSBhcmUgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCB7QGNvZGUKKwkgKiAJCU1lYXN1cmVkVmFsdWVzfSAgICAgLgorCSAqLworCXB1YmxpYyBMaXN0PE1lYXN1cmVkVmFsdWVzPiBleGVjdXRlKFJlYWRSZXF1ZXN0IHJlYWRSZXF1ZXN0KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCVZhbHVlTWF0cml4IHZhbHVlTWF0cml4ID0gbnVsbDsKKwkJQ29sdW1uW10gYXJyQ29sdW1ucyA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCXZhbHVlTWF0cml4ID0gZ2V0VmFsdWVNYXRyaXgocmVhZFJlcXVlc3QpOworCQkJTGlzdDxQYWlyPENvbHVtbiwgQ29sdW1uQXR0cmlidXRlcz4+IGxpc3RDb2x1bW5QYWlycyA9IGdldE9EU0NvbHVtbnMocmVhZFJlcXVlc3QsIHZhbHVlTWF0cml4KTsKKworCQkJYXJyQ29sdW1ucyA9IGxpc3RDb2x1bW5QYWlycy5zdHJlYW0oKS5tYXAoUGFpcjo6Z2V0TGVmdCkudG9BcnJheShDb2x1bW5bXTo6bmV3KTsKKwkJCUNvbHVtbkF0dHJpYnV0ZXNbXSBhcnJDb2x1bW5BdHRyaWJ1dGVzID0gbGlzdENvbHVtblBhaXJzLnN0cmVhbSgpLm1hcChQYWlyOjpnZXRSaWdodCkKKwkJCQkJLnRvQXJyYXkoQ29sdW1uQXR0cmlidXRlc1tdOjpuZXcpOworCisJCQlOYW1lVmFsdWVTZXFVbml0W10gbnZzdXMgPSB2YWx1ZU1hdHJpeC5nZXRWYWx1ZShhcnJDb2x1bW5zLCByZWFkUmVxdWVzdC5nZXRTdGFydEluZGV4KCksCisJCQkJCXJlYWRSZXF1ZXN0LmdldFJlcXVlc3RTaXplKCkpOworCQkJcmV0dXJuIE9EU0NvbnZlcnRlci5mcm9tT0RTTWVhc3VyZWRWYWx1ZXNTZXEobnZzdXMsIGFyckNvbHVtbkF0dHJpYnV0ZXMpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBhb2UpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKGFvZS5yZWFzb24sIGFvZSk7CisJCX0gZmluYWxseSB7CisJCQlyZWxlYXNlQ29sdW1ucyhhcnJDb2x1bW5zKTsKKwkJCXJlbGVhc2VWYWx1ZU1hdHJpeCh2YWx1ZU1hdHJpeCk7CisJCX0KKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTG9hZHMgYWxsIGZvciBlYWNoIGRlZmluZWQge0BsaW5rIENoYW5uZWx9IGluIGdpdmVuIHtAbGluayBSZWFkUmVxdWVzdH0gYW5kCisJICogbG9hZHMgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIENvbHVtbn0gdXNpbmcgZ2l2ZW4ge0BsaW5rIFZhbHVlTWF0cml4fS4KKwkgKgorCSAqIEBwYXJhbSByZWFkUmVxdWVzdCBEZWZpbmVzIHJlcXVpcmVkIHtAY29kZSBDb2x1bW59cy4KKwkgKiBAcGFyYW0gdmFsdWVNYXRyaXggVXNlZCB0byBsb2FkIHJlcXVpcmVkIHtAY29kZSBDb2x1bW59cy4KKwkgKiBAcmV0dXJuIHtAY29kZSBDb2x1bW59IGNvbmZpZ3VyZWQgaW4gZ2l2ZW4ge0Bjb2RlIFJlYWRSZXF1ZXN0fSBhcmUgcmV0dXJuZWQKKwkgKiAgICAgICAgIHdpdGggZGVmaW5lZCB7QGxpbmsgVW5pdH0gc2V0dXAuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiAgICAgICAgIFRocm93IGlmIHVuYWJsZSB0byBsb2FkIGFsbCBhdmFpbGFibGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIENvbHVtbn1zLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gb24gd3Jvbmcge0Bjb2RlIFJlYWRSZXF1ZXN0fSBzZXR1cC4KKwkgKi8KKwlwcml2YXRlIExpc3Q8UGFpcjxDb2x1bW4sIENvbHVtbkF0dHJpYnV0ZXM+PiBnZXRPRFNDb2x1bW5zKFJlYWRSZXF1ZXN0IHJlYWRSZXF1ZXN0LCBWYWx1ZU1hdHJpeCB2YWx1ZU1hdHJpeCkKKwkJCXRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8UGFpcjxDb2x1bW4sIENvbHVtbkF0dHJpYnV0ZXM+PiBsaXN0Q29sdW1uUGFpcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTWFwPFN0cmluZywgQ29sdW1uPiBtYXBDb2x1bW5zID0gbmV3IEhhc2hNYXA8PigpOworCisJCXRyeSB7CisJCQlpZiAocmVhZFJlcXVlc3QuaXNMb2FkQWxsQ2hhbm5lbHMoKSkgeworCQkJCS8vIFRPRE8gc2hvdWxkIGl0IGJlIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSB0aGUgdW5pdCBvZiBzb21lCisJCQkJLy8gY2hhbm5lbHM/IQorCQkJCS8vIC0+IHRoaXMgcmVzdWx0cyBpbiBhIHBlcmZvcm1hbmNlIGlzc3VlIHNpbmNlIHdlIG5lZWQgdG8gY2FsbAorCQkJCS8vIGdldE5hbWUoKQorCQkJCS8vIG9uIGVhY2ggY29sdW1uIGZvciBtYXBwaW5nISAobm8gbG9uZ2VyLCBzZWUgYmVsb3chKQorCQkJCUNvbHVtbltdIGNvbHVtbnMgPSB2YWx1ZU1hdHJpeC5nZXRDb2x1bW5zKCIqIik7CisKKwkJCQlpZiAobnVsbCAhPSBjb2x1bW5zKSB7CisJCQkJCWZvciAoQ29sdW1uIGNvbHVtbiA6IGNvbHVtbnMpIHsKKwkJCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gY29sdW1uLmdldE5hbWUoKTsKKwkJCQkJCWlmIChtYXBDb2x1bW5zLmNvbnRhaW5zS2V5KGNvbHVtbk5hbWUpKSB7CisJCQkJCQkJcmVsZWFzZUNvbHVtbnMoY29sdW1ucyk7CisJCQkJCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oCisJCQkJCQkJCQlTdHJpbmcuZm9ybWF0KCJEdXBsaWNhdGUgY29sdW1uIG5hbWUgJyVzJyBmb3VuZCB3aXRoaW4gc3VibWF0cml4IElEICVkISIsCisJCQkJCQkJCQkJCWNvbHVtbk5hbWUsIExvbmcudmFsdWVPZihyZWFkUmVxdWVzdC5nZXRDaGFubmVsR3JvdXAoKS5nZXRJRCgpKSkpOworCQkJCQkJfQorCisJCQkJCQltYXBDb2x1bW5zLnB1dChjb2x1bW5OYW1lLCBjb2x1bW4pOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKEVudHJ5PENoYW5uZWwsIFVuaXQ+IGVudHJ5IDogcmVhZFJlcXVlc3QuZ2V0Q2hhbm5lbHMoKS5lbnRyeVNldCgpKSB7CisJCQkJCUNoYW5uZWwgY2hhbm5lbCA9IGVudHJ5LmdldEtleSgpOworCQkJCQlVbml0IHVuaXQgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCQlTdHJpbmcgY2hhbm5lbE5hbWUgPSBjaGFubmVsLmdldE5hbWUoKTsKKwkJCQkJQ29sdW1uW10gY29sdW1ucyA9IHZhbHVlTWF0cml4LmdldENvbHVtbnMoY2hhbm5lbE5hbWUpOworCQkJCQlpZiAoY29sdW1ucyA9PSBudWxsIHx8IGNvbHVtbnMubGVuZ3RoICE9IDEpIHsKKwkJCQkJCXJlbGVhc2VDb2x1bW5zKGNvbHVtbnMpOworCQkJCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKwkJCQkJCQkJIlplcm8gb3IgbW9yZSB0aGFuIG9uZSBjb2x1bW4gd2l0aCBuYW1lICclcycgZm91bmQgd2l0aGluIHN1Ym1hdHJpeCBJRCAlZCEiLAorCQkJCQkJCQljaGFubmVsTmFtZSwgTG9uZy52YWx1ZU9mKHJlYWRSZXF1ZXN0LmdldENoYW5uZWxHcm91cCgpLmdldElEKCkpKSk7CisJCQkJCX0KKworCQkJCQlDb2x1bW4gY29sdW1uID0gY29sdW1uc1swXTsKKwkJCQkJaWYgKCF1bml0Lm5hbWVFcXVhbHMoY2hhbm5lbC5nZXRVbml0KCkuZ2V0TmFtZSgpKSkgeworCQkJCQkJY29sdW1uLnNldFVuaXQodW5pdC5nZXROYW1lKCkpOworCQkJCQl9CisKKwkJCQkJbWFwQ29sdW1ucy5wdXQoY2hhbm5lbE5hbWUsIGNvbHVtbik7CisJCQkJfQorCQkJfQorCisJCQlpZiAobWFwQ29sdW1ucy5zaXplKCkgPiAwKSB7CisJCQkJRW50aXR5VHlwZSBsb2NhbENvbHVtbkVudGl0eVR5cGUgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZSgiTG9jYWxDb2x1bW4iKTsKKwkJCQlBdHRyaWJ1dGUgaWRBdHRyID0gbG9jYWxDb2x1bW5FbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiSWQiKTsKKwkJCQlBdHRyaWJ1dGUgbmFtZUF0dHIgPSBsb2NhbENvbHVtbkVudGl0eVR5cGUuZ2V0QXR0cmlidXRlKCJOYW1lIik7CisJCQkJQXR0cmlidXRlIHN1Ym1hdHJpeEF0dHIgPSBsb2NhbENvbHVtbkVudGl0eVR5cGUuZ2V0QXR0cmlidXRlKCJTdWJNYXRyaXgiKTsKKworCQkJCS8vIERvbid0IHF1ZXJ5IEdlbmVyYXRpb25QYXJhbWV0ZXJzIHRvZ2V0aGVyIHdpdGggb3RoZXIgbm9uLUlEIGF0dHJpYnV0ZXMgYXMKKwkJCQkvLyBBdmFsb24gZGlzbGlrZXMgdGhpczoKKwkJCQlRdWVyeSBxdWVyeTEgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKQorCQkJCQkJLnNlbGVjdChMaXN0cy5uZXdBcnJheUxpc3QoaWRBdHRyLCBuYW1lQXR0ciwKKwkJCQkJCQkJbG9jYWxDb2x1bW5FbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiU2VxdWVuY2VSZXByZXNlbnRhdGlvbiIpLAorCQkJCQkJCQlsb2NhbENvbHVtbkVudGl0eVR5cGUuZ2V0QXR0cmlidXRlKCJJbmRlcGVuZGVudEZsYWciKSwKKwkJCQkJCQkJbG9jYWxDb2x1bW5FbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiYXhpc3R5cGUiKSkpOworCisJCQkJRmlsdGVyIGZpbHRlciA9IEZpbHRlci5hbmQoKS5hZGQoQ29tcGFyaXNvbk9wZXJhdG9yLkVRVUFMLmNyZWF0ZShzdWJtYXRyaXhBdHRyLAorCQkJCQkJTG9uZy52YWx1ZU9mKHJlYWRSZXF1ZXN0LmdldENoYW5uZWxHcm91cCgpLmdldElEKCkpKSk7CisKKwkJCQlTZXQ8U3RyaW5nPiBzZXRDb2x1bW5OYW1lcyA9IG1hcENvbHVtbnMua2V5U2V0KCk7CisKKwkJCQlNYXA8U3RyaW5nLCBDb2x1bW5BdHRyaWJ1dGVzPiBtYXBDb2x1bW5BdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8PigpOworCisJCQkJZm9yIChSZXN1bHQgcmVzdWx0IDogcXVlcnkxLmZldGNoKGZpbHRlcikpIHsKKwkJCQkJTWFwPFN0cmluZywgVmFsdWU+IG1hcFZhbHVlcyA9IHJlc3VsdC5nZXRSZWNvcmQobG9jYWxDb2x1bW5FbnRpdHlUeXBlKS5nZXRWYWx1ZXMoKTsKKworCQkJCQlTdHJpbmcgY29sdW1uTmFtZSA9IG1hcFZhbHVlcy5nZXQoIk5hbWUiKS5leHRyYWN0KCk7CisKKwkJCQkJaWYgKHNldENvbHVtbk5hbWVzLmNvbnRhaW5zKGNvbHVtbk5hbWUpKSB7CisJCQkJCQlDb2x1bW5BdHRyaWJ1dGVzIGNhID0gbmV3IENvbHVtbkF0dHJpYnV0ZXMoY29sdW1uTmFtZSwKKwkJCQkJCQkJKFZhbHVlc01vZGUuQ0FMQ1VMQVRFRCA9PSByZWFkUmVxdWVzdC5nZXRWYWx1ZXNNb2RlKCkgPyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lUCisJCQkJCQkJCQkJOiBtYXBWYWx1ZXMuZ2V0KCJTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIikuZXh0cmFjdCgpKSwKKwkJCQkJCQkJbmV3IGRvdWJsZVswXSwgKChzaG9ydCkgbWFwVmFsdWVzLmdldCgiSW5kZXBlbmRlbnRGbGFnIikuZXh0cmFjdCgpICE9IDApLAorCQkJCQkJCQltYXBWYWx1ZXMuZ2V0KCJheGlzdHlwZSIpLmV4dHJhY3QoKSk7CisKKwkJCQkJCW1hcENvbHVtbkF0dHJpYnV0ZXMucHV0KG1hcFZhbHVlcy5nZXQoIklkIikuZXh0cmFjdCgpLCBjYSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoVmFsdWVzTW9kZS5DQUxDVUxBVEVEICE9IHJlYWRSZXF1ZXN0LmdldFZhbHVlc01vZGUoKSkgeworCQkJCQlRdWVyeSBxdWVyeTIgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3QoaWRBdHRyLAorCQkJCQkJCWxvY2FsQ29sdW1uRW50aXR5VHlwZS5nZXRBdHRyaWJ1dGUoIkdlbmVyYXRpb25QYXJhbWV0ZXJzIikpOworCisJCQkJCWZvciAoUmVzdWx0IHJlc3VsdCA6IHF1ZXJ5Mi5mZXRjaChmaWx0ZXIpKSB7CisJCQkJCQlNYXA8U3RyaW5nLCBWYWx1ZT4gbWFwVmFsdWVzID0gcmVzdWx0LmdldFJlY29yZChsb2NhbENvbHVtbkVudGl0eVR5cGUpLmdldFZhbHVlcygpOworCisJCQkJCQlDb2x1bW5BdHRyaWJ1dGVzIGNhID0gbWFwQ29sdW1uQXR0cmlidXRlcy5nZXQobWFwVmFsdWVzLmdldCgiSWQiKS5leHRyYWN0KCkpOworCisJCQkJCQlpZiAoY2EgIT0gbnVsbCkgeworCQkJCQkJCWNhLnNldEdlbmVyYXRpb25QYXJhbWV0ZXJzKG1hcFZhbHVlcy5nZXQoIkdlbmVyYXRpb25QYXJhbWV0ZXJzIikuZXh0cmFjdCgpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29sdW1uQXR0cmlidXRlcz4gbWUgOiBtYXBDb2x1bW5BdHRyaWJ1dGVzLmVudHJ5U2V0KCkpIHsKKwkJCQkJQ29sdW1uQXR0cmlidXRlcyBjYSA9IG1lLmdldFZhbHVlKCk7CisJCQkJCWxpc3RDb2x1bW5QYWlycy5hZGQobmV3IEltbXV0YWJsZVBhaXI8Q29sdW1uLCBDb2x1bW5BdHRyaWJ1dGVzPihtYXBDb2x1bW5zLmdldChjYS5nZXROYW1lKCkpLCBjYSkpOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIGxpc3RDb2x1bW5QYWlyczsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJcmVsZWFzZUNvbHVtbnMobGlzdENvbHVtblBhaXJzLnN0cmVhbSgpLm1hcChQYWlyOjpnZXRMZWZ0KS50b0FycmF5KENvbHVtbltdOjpuZXcpKTsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBjb2x1bW4gZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFZhbHVlTWF0cml4fSBDT1JCQSBzZXJ2aWNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4KKwkgKiB7QGxpbmsgUmVhZFJlcXVlc3R9LgorCSAqCisJICogQHBhcmFtIHJlYWRSZXF1ZXN0IFRoZSB7QGNvZGUgUmVhZFJlcXVlc3R9LgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBWYWx1ZU1hdHJpeH0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgdGhlIHtAY29kZSBWYWx1ZU1hdHJpeH0uCisJICovCisJcHJpdmF0ZSBWYWx1ZU1hdHJpeCBnZXRWYWx1ZU1hdHJpeChSZWFkUmVxdWVzdCByZWFkUmVxdWVzdCkgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJRW50aXR5IGVudGl0eSA9IHJlYWRSZXF1ZXN0LmdldENoYW5uZWxHcm91cCgpOworCQlUX0xPTkdMT05HIGlpZCA9IE9EU0NvbnZlcnRlci50b09EU0lEKGVudGl0eS5nZXRJRCgpKTsKKwkJVF9MT05HTE9ORyBhaWQgPSAoKE9EU0VudGl0eVR5cGUpIG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGVudGl0eSkpLmdldE9EU0lEKCk7CisJCVZhbHVlTWF0cml4TW9kZSB2YWx1ZU1hdHJpeE1vZGUgPSBWYWx1ZU1hdHJpeE1vZGUuQ0FMQ1VMQVRFRDsKKwkJc3dpdGNoIChyZWFkUmVxdWVzdC5nZXRWYWx1ZXNNb2RlKCkpIHsKKwkJY2FzZSBDQUxDVUxBVEVEOgorCQkJdmFsdWVNYXRyaXhNb2RlID0gVmFsdWVNYXRyaXhNb2RlLkNBTENVTEFURUQ7CisJCQlicmVhazsKKwkJY2FzZSBTVE9SQUdFOgorCQkJdmFsdWVNYXRyaXhNb2RlID0gVmFsdWVNYXRyaXhNb2RlLlNUT1JBR0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKAorCQkJCQlTdHJpbmcuZm9ybWF0KCJVbnN1cHBvcnRlZCBWYWx1ZU1vZGUgJXMhIiwgcmVhZFJlcXVlc3QuZ2V0VmFsdWVzTW9kZSgpLm5hbWUoKSkpOworCQl9CisKKwkJcmV0dXJuIG1vZGVsTWFuYWdlci5nZXRBcHBsRWxlbUFjY2VzcygpLmdldFZhbHVlTWF0cml4SW5Nb2RlKG5ldyBFbGVtSWQoYWlkLCBpaWQpLCB2YWx1ZU1hdHJpeE1vZGUpOworCX0KKworCS8qKgorCSAqIFJlbGVhc2VzIGdpdmVuIHtAbGluayBWYWx1ZU1hdHJpeH0gQ09SQkEgb2JqZWN0LgorCSAqCisJICogQHBhcmFtIHZhbHVlTWF0cml4IFdpbGwgYmUgcmVsZWFzZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbGVhc2VWYWx1ZU1hdHJpeChWYWx1ZU1hdHJpeCB2YWx1ZU1hdHJpeCkgeworCQlpZiAodmFsdWVNYXRyaXggPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5IHsKKwkJCXZhbHVlTWF0cml4LmRlc3Ryb3koKTsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gYW9lKSB7CisJCQkvLyBpZ25vcmUKKwkJfSBmaW5hbGx5IHsKKwkJCXZhbHVlTWF0cml4Ll9yZWxlYXNlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZWxlYXNlcyBlYWNoIENPUkJBIHtAbGluayBDb2x1bW59IG9iamVjdC4KKwkgKgorCSAqIEBwYXJhbSBjb2x1bW5zIFdpbGwgYmUgcmVsZWFzZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbGVhc2VDb2x1bW5zKENvbHVtbltdIGNvbHVtbnMpIHsKKwkJaWYgKGNvbHVtbnMgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChDb2x1bW4gY29sdW1uIDogY29sdW1ucykgeworCQkJdHJ5IHsKKwkJCQljb2x1bW4uZGVzdHJveSgpOworCQkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0gZmluYWxseSB7CisJCQkJY29sdW1uLl9yZWxlYXNlKCk7CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9maWxldHJhbnNmZXIvQ09SQkFGaWxlU2VydmVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL0NPUkJBRmlsZVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmM5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL0NPUkJBRmlsZVNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNTIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmZpbGV0cmFuc2ZlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Nb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLkludmFsaWROYW1lOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BSGVscGVyOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UuQWRhcHRlckluYWN0aXZlOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZS5PYmplY3ROb3RBY3RpdmU7CitpbXBvcnQgb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0FQYWNrYWdlLlNlcnZhbnRBbHJlYWR5QWN0aXZlOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZS5Xcm9uZ1BvbGljeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUY7CitpbXBvcnQgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX0JZVEVIb2xkZXI7CitpbXBvcnQgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZTsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRjsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRlBPQTsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnOworCisvKioKKyAqIFNlcnZpY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBsb3cgbGV2ZWwge0BsaW5rIENPUkJBRmlsZVNlcnZlcklGfSBmaWxlCisgKiBzZXJ2aWNlIEFQSS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworZmluYWwgY2xhc3MgQ09SQkFGaWxlU2VydmVyIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDT1JCQUZpbGVTZXJ2ZXIuY2xhc3MpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gMTAwXzAwMDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVQgPSA1XzAwMDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJGQUNFX05BTUVfUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmZpbGV0cmFuc2Zlci5pbnRlcmZhY2VOYW1lIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVF9OQU1FX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXIuaG9zdG5hbWUiOworCisJcHJpdmF0ZSBmaW5hbCBDT1JCQUZpbGVTZXJ2ZXJJRiBmaWxlU2VydmVyOworCXByaXZhdGUgZmluYWwgQW9TZXNzaW9uIGFvU2Vzc2lvbjsKKwlwcml2YXRlIGZpbmFsIE9SQiBvcmI7CisKKwlwcml2YXRlIGZpbmFsIFRyYW5zZmVyIHRyYW5zZmVyOworCisJcHJpdmF0ZSBmaW5hbCBpbnQgYnVmZmVyU2l6ZTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvbnRleHQgIFVzZWQgZm9yIHNldHVwLgorCSAqIEBwYXJhbSB0cmFuc2ZlciBUaGUgdHJhbnNmZXIgdHlwZSBmb3IgdXAtIGFuZCBkb3dubG9hZHMuCisJICovCisJQ09SQkFGaWxlU2VydmVyKE9EU0NvbnRleHQgY29udGV4dCwgVHJhbnNmZXIgdHJhbnNmZXIpIHsKKwkJTW9kZWxNYW5hZ2VyIG1tID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKE1vZGVsTWFuYWdlci5jbGFzcykpOworCQlpZiAoIShtbSBpbnN0YW5jZW9mIE9EU01vZGVsTWFuYWdlcikpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzdXBwbGllZCBNb2RlbE1hbmFnZXIgbXVzdCBiZSBhbiBPRFNNb2RlbE1hbmFnZXIhIik7CisJCX0KKworCQlmaWxlU2VydmVyID0gY29udGV4dC5nZXRGaWxlU2VydmVyKCk7CisJCWFvU2Vzc2lvbiA9IGNvbnRleHQuZ2V0QW9TZXNzaW9uKCk7CisJCW9yYiA9IGNvbnRleHQuZ2V0T1JCKCk7CisJCXRoaXMudHJhbnNmZXIgPSB0cmFuc2ZlcjsKKworCQlidWZmZXJTaXplID0gZ2V0QnVmZmVyU2l6ZSgpOworCX0KKworCS8qKgorCSAqIE9wZW5zIGEgY29uc3VtYWJsZSBkb3dubG9hZCB7QGxpbmsgSW5wdXRTdHJlYW19IGZvciBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9LgorCSAqCisJICogQHBhcmFtIGZpbGVMaW5rIFVzZWQgdG8gYWNjZXNzIHRoZSByZW1vdGUgcGF0aC4KKwkgKiBAcGFyYW0gZWxlbUlkICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEByZXR1cm4gVGhlIGNvbnN1bWFibGUge0Bjb2RlIElucHV0U3RyZWFtfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gb3BlbiBhbiB0aGUge0Bjb2RlIElucHV0U3RyZWFtfS4KKwkgKi8KKwlwdWJsaWMgSW5wdXRTdHJlYW0gb3BlblN0cmVhbShGaWxlTGluayBmaWxlTGluaywgRWxlbUlkIGVsZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CisJCWlmICh0cmFuc2Zlci5pc1N0cmVhbSgpKSB7CisJCQlpbnB1dFN0cmVhbSA9IG5ldyBJbnB1dFN0cmVhbUFkYXB0ZXIob3BlblNpbXBsZVN0cmVhbShmaWxlTGluaywgZWxlbUlkKSk7CisJCX0gZWxzZSBpZiAodHJhbnNmZXIuaXNTb2NrZXQoKSkgeworCQkJaW5wdXRTdHJlYW0gPSBvcGVuU29ja2V0U3RyZWFtKGZpbGVMaW5rLCBlbGVtSWQpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHJhbnNmZXIgc3RhdGUgJyIgKyB0cmFuc2ZlciArICInIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisJCX0KKworCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIGJ1ZmZlclNpemUpOworCX0KKworCS8qKgorCSAqIFVwbG9hZHMgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfSBmb3IgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUge0Bjb2RlIElucHV0U3RyZWFtfSB0byBiZSB1cGxvYWRlZC4KKwkgKiBAcGFyYW0gZmlsZUxpbmsgICAgVGhlIGFzc29jaWF0ZWQge0Bjb2RlIEZpbGVMaW5rfS4KKwkgKiBAcGFyYW0gZWxlbUlkICAgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byB1cGxvYWQgZ2l2ZW4ge0Bjb2RlIElucHV0U3RyZWFtfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGxvYWRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIEZpbGVMaW5rIGZpbGVMaW5rLCBFbGVtSWQgZWxlbUlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgcmVtb3RlUGF0aDsKKwkJaWYgKHRyYW5zZmVyLmlzU3RyZWFtKCkpIHsKKwkJCXJlbW90ZVBhdGggPSB1cGxvYWRWSUFTdHJlYW0oaW5wdXRTdHJlYW0sIGZpbGVMaW5rLCBlbGVtSWQpOworCQl9IGVsc2UgaWYgKHRyYW5zZmVyLmlzU29ja2V0KCkpIHsKKwkJCXJlbW90ZVBhdGggPSB1cGxvYWRWSUFTb2NrZXQoaW5wdXRTdHJlYW0sIGZpbGVMaW5rLCBlbGVtSWQpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHJhbnNmZXIgc3RhdGUgJyIgKyB0cmFuc2ZlciArICInIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisJCX0KKworCQlmaWxlTGluay5zZXRSZW1vdGVQYXRoKHJlbW90ZVBhdGgpOworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSBmaWxlIHNpemUgZm9yIGdpdmVuIHtAbGluayBGaWxlTGlua30uCisJICoKKwkgKiBAcGFyYW0gZmlsZUxpbmsgVGhlIHtAY29kZSBGaWxlTGlua30gd2hvc2UgZmlsZSBzaXplIHdpbGwgYmUgbG9hZGVkLgorCSAqIEBwYXJhbSBlbGVtSWQgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHJldHVybiBUaGUgZmlsZSBzaXplIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIHRoZSBmaWxlIHNpemUuCisJICovCisJcHVibGljIGxvbmcgbG9hZFNpemUoRmlsZUxpbmsgZmlsZUxpbmssIEVsZW1JZCBlbGVtSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gZmlsZVNlcnZlci5nZXRTaXplRm9ySW5zdGFuY2UoYW9TZXNzaW9uLCBmaWxlTGluay5nZXRSZW1vdGVQYXRoKCksIGVsZW1JZC5haWQsIGVsZW1JZC5paWQpOworCQl9IGNhdGNoIChDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gcXVlcnkgZmlsZSBzaXplIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIERlbGV0ZXMgdGhlIHtAbGluayBGaWxlTGlua30gZnJvbSB0aGUgcmVtb3RlIHN0b3JhZ2UuCisJICoKKwkgKiBAcGFyYW0gZmlsZUxpbmsgV2lsbCBiZSBkZWxldGVkIGZyb20gdGhlIHJlbW90ZSBzdG9yYWdlLgorCSAqIEBwYXJhbSBlbGVtSWQgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGRlbGV0ZSBnaXZlbiB7QGNvZGUgRmlsZUxpbmt9LgorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0ZShGaWxlTGluayBmaWxlTGluaywgRWxlbUlkIGVsZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWZpbGVTZXJ2ZXIuZGVsZXRlRm9ySW5zdGFuY2UoYW9TZXNzaW9uLCBmaWxlTGluay5nZXRSZW1vdGVQYXRoKCksIGVsZW1JZC5haWQsIGVsZW1JZC5paWQpOworCQl9IGNhdGNoIChDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIHJlbW90ZSBmaWxlIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIE9wZW5zIGEgc2ltcGxlIHtAbGluayBJbnB1dFN0cmVhbUlGfSB1c2luZyB0aGUge0BsaW5rIENPUkJBRmlsZVNlcnZlcklGfS4KKwkgKgorCSAqIEBwYXJhbSBmaWxlTGluayBVc2VkIHRvIGFjY2VzcyB0aGUgcmVtb3RlIHBhdGguCisJICogQHBhcmFtIGVsZW1JZCAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgSW5wdXRTdHJlYW1JRn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIG9wZW4gdGhlIHtAY29kZSBJbnB1dFN0cmVhbUlGfS4KKwkgKi8KKwlwcml2YXRlIElucHV0U3RyZWFtSUYgb3BlblNpbXBsZVN0cmVhbShGaWxlTGluayBmaWxlTGluaywgRWxlbUlkIGVsZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBmaWxlU2VydmVyLnJlYWRGb3JJbnN0YW5jZShhb1Nlc3Npb24sIGZpbGVMaW5rLmdldFJlbW90ZVBhdGgoKSwgZWxlbUlkLmFpZCwgZWxlbUlkLmlpZCk7CisJCX0gY2F0Y2ggKENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBvcGVuIHN0cmVhbSBmb3IgZmlsZSB0cmFuc2ZlciBkdWUgdG86ICIgKyBlLnJlYXNvbiwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBPcGVucyBhIHNvY2tldCB7QGxpbmsgSW5wdXRTdHJlYW19IHVzaW5nIHRoZSB7QGxpbmsgQ09SQkFGaWxlU2VydmVySUZ9LgorCSAqCisJICogQHBhcmFtIGZpbGVMaW5rIFVzZWQgdG8gYWNjZXNzIHRoZSByZW1vdGUgcGF0aC4KKwkgKiBAcGFyYW0gZWxlbUlkICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIG9wZW4gdGhlIHNvY2tldCB7QGNvZGUKKwkgKiAJCUlucHV0U3RyZWFtfS4KKwkgKi8KKwlwcml2YXRlIElucHV0U3RyZWFtIG9wZW5Tb2NrZXRTdHJlYW0oRmlsZUxpbmsgZmlsZUxpbmssIEVsZW1JZCBlbGVtSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIGF1dG8gYXNzaWduZWQgcG9ydCB3aXRoIGF3YWl0aW5nIGV4YWN0bHkgT05FIGluY29taW5nIGNvbm5lY3Rpb24KKwkJdHJ5IChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwLCAxLCBnZXRJbnRlcmZhY2VBZGRyZXNzKCkpKSB7CisJCQlzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KFNPQ0tFVF9USU1FT1VUICogNik7CisKKwkJCW5ldyBUaHJlYWQoKCkgLT4geworCQkJCXRyeSB7CisJCQkJCS8qCisJCQkJCSAqIE5PVEU6IFNpbmNlIGEgc29ja2V0IGZpbGUgdHJhbnNmZXIgcmVnaXN0cmF0aW9uIG1heSBibG9jayB1bnRpbCB0aGlzIHNlcnZlcgorCQkJCQkgKiBzb2NrZXQncyBhY2NlcHQgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHJlZ2lzdHJhdGlvbiBpcyBkb25lIGFzeW5jaHJvbm91c2x5IQorCQkJCQkgKi8KKwkJCQkJZmlsZVNlcnZlci5nZXRGb3JJbnN0YW5jZUJ5U29ja2V0KGFvU2Vzc2lvbiwgZmlsZUxpbmsuZ2V0UmVtb3RlUGF0aCgpLCBlbGVtSWQuYWlkLCBlbGVtSWQuaWlkLAorCQkJCQkJCXNlcnZlclNvY2tldC5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCksIHNlcnZlclNvY2tldC5nZXRMb2NhbFBvcnQoKSk7CisJCQkJfSBjYXRjaCAoQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGUpIHsKKwkJCQkJTE9HR0VSLmVycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBzb2NrZXQgc3RyZWFtLCBhd2FpdGluZyBzb2NrZXQgdGltZW91dC4iLCBlKTsKKwkJCQl9CisJCQl9KS5zdGFydCgpOworCisJCQlTb2NrZXQgY2xpZW50ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworCQkJY2xpZW50LnNldFNvVGltZW91dChTT0NLRVRfVElNRU9VVCk7CisJCQlyZXR1cm4gY2xpZW50LmdldElucHV0U3RyZWFtKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEluZXRBZGRyZXNzIGdldEludGVyZmFjZUFkZHJlc3MoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJU3RyaW5nIGhvc3RuYW1lUHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSE9TVF9OQU1FX1BST1BFUlRZKTsKKwkJaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGhvc3RuYW1lUHJvcGVydHkpKSB7CisJCQlMT0dHRVIuZGVidWcoIlVzaW5nIGhvc3QgbmFtZSAnIiArIGhvc3RuYW1lUHJvcGVydHkgKyAiJyBmb3IgZmlsZSB0cmFuc2Zlci4iKTsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIEluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0bmFtZVByb3BlcnR5KTsKKwkJCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKwkJCQlMT0dHRVIud2FybigiU3BlY2lmaWVkIGhvc3QgbmFtZSAnIiArIGhvc3RuYW1lUHJvcGVydHkgKyAiJyBjYW5ub3QgYmUgdXNlZCBmb3IgZmlsZSB0cmFuc2Zlci4iLCBlKTsKKwkJCQkvLyBjb250aW51ZSB3aXRoIGxvb2t1cCBieSBpbnRlcmZhY2UgbmFtZQorCQkJfQorCQl9CisKKwkJU3RyaW5nIHByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KElOVEVSRkFDRV9OQU1FX1BST1BFUlRZKTsKKwkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocHJvcGVydHkpKSB7CisJCQlMT0dHRVIuZGVidWcoIlVzaW5nIG5vIHNwZWNpZmllZCBpbnRlcmZhY2UgZm9yIGZpbGUgdHJhbnNmZXIsIHByb3BlcnR5IG5vdCBzZXQuIik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlMaXN0PE5ldHdvcmtJbnRlcmZhY2U+IGludGVyZmFjZXMgPSBnZXRJbnRlcmZhY2VMaXN0KCk7CisJCUxpc3Q8TmV0d29ya0ludGVyZmFjZT4gZmlsdGVyZWRJbnRlcmZhY2VzID0gZ2V0RmlsdGVyZWRJbnRlcmZhY2VzKGludGVyZmFjZXMpOworCQlmb3IgKE5ldHdvcmtJbnRlcmZhY2UgZmlsdGVyZWRJbnRlcmZhY2UgOiBmaWx0ZXJlZEludGVyZmFjZXMpIHsKKwkJCWlmIChmaWx0ZXJlZEludGVyZmFjZS5nZXROYW1lKCkuZXF1YWxzKHByb3BlcnR5KQorCQkJCQkmJiBmaWx0ZXJlZEludGVyZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCkuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCQlJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IGZpbHRlcmVkSW50ZXJmYWNlLmdldEluZXRBZGRyZXNzZXMoKS5uZXh0RWxlbWVudCgpOworCQkJCUxPR0dFUi5kZWJ1ZygiVXNpbmcgaW50ZXJmYWNlIHt9IHdpdGggYWRkcmVzcyB7fSBmb3IgZmlsZSB0cmFuc2Zlci4iLCBmaWx0ZXJlZEludGVyZmFjZS5nZXROYW1lKCksCisJCQkJCQlpbmV0QWRkcmVzcyk7CisJCQkJcmV0dXJuIGluZXRBZGRyZXNzOworCQkJfQorCQl9CisJCXJldHVybiBnZXRGYWxsYmFjayhmaWx0ZXJlZEludGVyZmFjZXMpOworCX0KKworCXByaXZhdGUgSW5ldEFkZHJlc3MgZ2V0RmFsbGJhY2soTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiBmaWx0ZXJlZEludGVyZmFjZXMpIHsKKwkJaWYgKGZpbHRlcmVkSW50ZXJmYWNlcy5pc0VtcHR5KCkpIHsKKwkJCUxPR0dFUi5kZWJ1ZygiVXNpbmcgbm8gc3BlY2lmaWVkIGludGVyZmFjZSBmb3IgZmlsZSB0cmFuc2ZlciwgcHJvcGVydHkgc2V0IGJ1dCBubyBydW5uaW5nIGludGVyZmFjZS4iKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCU5ldHdvcmtJbnRlcmZhY2UgbmV0d29ya0ludGVyZmFjZSA9IGZpbHRlcmVkSW50ZXJmYWNlcy5nZXQoMCk7CisJCUVudW1lcmF0aW9uPEluZXRBZGRyZXNzPiBpbmV0QWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCk7CisJCWlmIChpbmV0QWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlJbmV0QWRkcmVzcyBhZGRyZXNzID0gaW5ldEFkZHJlc3Nlcy5uZXh0RWxlbWVudCgpOworCQkJTE9HR0VSLmRlYnVnKCJVc2luZyBpbnRlcmZhY2Uge30gd2l0aCBhZGRyZXNzIHt9IGZvciBmaWxlIHRyYW5zZmVyLiIsIG5ldHdvcmtJbnRlcmZhY2UuZ2V0TmFtZSgpLCBhZGRyZXNzKTsKKwkJCXJldHVybiBhZGRyZXNzOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiBnZXRGaWx0ZXJlZEludGVyZmFjZXMoTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiBpbnRlcmZhY2VzKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiBmaWx0ZXJlZEludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChOZXR3b3JrSW50ZXJmYWNlIGFuSW50ZXJmYWNlIDogaW50ZXJmYWNlcykgeworCQkJaWYgKGFuSW50ZXJmYWNlLmlzVXAoKSAmJiAhYW5JbnRlcmZhY2UuaXNMb29wYmFjaygpICYmICFhbkludGVyZmFjZS5pc1ZpcnR1YWwoKSkgeworCQkJCWZpbHRlcmVkSW50ZXJmYWNlcy5hZGQoYW5JbnRlcmZhY2UpOworCQkJfQorCQl9CisJCXJldHVybiBmaWx0ZXJlZEludGVyZmFjZXM7CisJfQorCisJcHJpdmF0ZSBMaXN0PE5ldHdvcmtJbnRlcmZhY2U+IGdldEludGVyZmFjZUxpc3QoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRW51bWVyYXRpb248TmV0d29ya0ludGVyZmFjZT4gbmV0d29ya0ludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7CisJCXdoaWxlIChuZXR3b3JrSW50ZXJmYWNlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJcmVzdWx0LmFkZChuZXR3b3JrSW50ZXJmYWNlcy5uZXh0RWxlbWVudCgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFVwbG9hZHMgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfSBmb3IgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSB1c2luZyB0aGUKKwkgKiB7QGxpbmsgQ09SQkFGaWxlU2VydmVySUZ9LgorCSAqCisJICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSB7QGNvZGUgSW5wdXRTdHJlYW19IHRvIGJlIHVwbG9hZGVkLgorCSAqIEBwYXJhbSBmaWxlTGluayAgICBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgRmlsZUxpbmt9LgorCSAqIEBwYXJhbSBlbGVtSWQgICAgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHJldHVybiBUaGUgcmVtb3RlIHBhdGggb2YgdGhlIHVwbG9hZGVkIHtAY29kZSBJbnB1dFN0cmVhbX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHVwbG9hZCBnaXZlbiB7QGNvZGUgSW5wdXRTdHJlYW19LgorCSAqLworCXByaXZhdGUgU3RyaW5nIHVwbG9hZFZJQVN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRmlsZUxpbmsgZmlsZUxpbmssIEVsZW1JZCBlbGVtSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSAoQ09SQkFJbnB1dFN0cmVhbUFkYXB0ZXIgc3RyZWFtID0gbmV3IENPUkJBSW5wdXRTdHJlYW1BZGFwdGVyKG9yYiwgaW5wdXRTdHJlYW0sIGZpbGVMaW5rLmdldFNpemUoKSkpIHsKKwkJCXJldHVybiBmaWxlU2VydmVyLnNhdmVGb3JJbnN0YW5jZShhb1Nlc3Npb24sIGZpbGVMaW5rLmdldEZpbGVOYW1lKCksICIiLCBlbGVtSWQuYWlkLCBlbGVtSWQuaWlkLAorCQkJCQlzdHJlYW0uX3RoaXMoKSk7CisJCX0gY2F0Y2ggKENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byB1cGxvYWQgZmlsZSB2aWEgc3RyZWFtIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwbG9hZHMgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfSBmb3IgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSB2aWEgc29ja2V0CisJICogdXBsb2FkIHVzaW5nIHRoZSB7QGxpbmsgQ09SQkFGaWxlU2VydmVySUZ9LgorCSAqCisJICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSB7QGNvZGUgSW5wdXRTdHJlYW19IHRvIGJlIHVwbG9hZGVkLgorCSAqIEBwYXJhbSBmaWxlTGluayAgICBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgRmlsZUxpbmt9LgorCSAqIEBwYXJhbSBlbGVtSWQgICAgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHJldHVybiBUaGUgcmVtb3RlIHBhdGggb2YgdGhlIHVwbG9hZGVkIHtAY29kZSBJbnB1dFN0cmVhbX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHVwbG9hZCBnaXZlbiB7QGNvZGUgSW5wdXRTdHJlYW19LgorCSAqLworCXByaXZhdGUgU3RyaW5nIHVwbG9hZFZJQVNvY2tldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRmlsZUxpbmsgZmlsZUxpbmssIEVsZW1JZCBlbGVtSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIGF1dG8gYXNzaWduZWQgcG9ydCB3aXRoIGF3YWl0aW5nIGV4YWN0bHkgT05FIGluY29taW5nIGNvbm5lY3Rpb24KKwkJdHJ5IChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwLCAxLCBnZXRJbnRlcmZhY2VBZGRyZXNzKCkpKSB7CisJCQlzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KFNPQ0tFVF9USU1FT1VUICogNik7CisKKwkJCW5ldyBUaHJlYWQoKCkgLT4geworCQkJCXRyeSAoU29ja2V0IGNsaWVudCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IGNsaWVudC5nZXRPdXRwdXRTdHJlYW0oKSkgeworCQkJCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CisKKwkJCQkJaW50IGxlbmd0aDsKKwkJCQkJd2hpbGUgKChsZW5ndGggPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpID4gLTEpIHsKKwkJCQkJCW91dHB1dFN0cmVhbS53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCUxPR0dFUi5lcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUgc29ja2V0IHN0cmVhbSwgYXdhaXRpbmcgc29ja2V0IHRpbWVvdXQuIiwgZSk7CisJCQkJfQorCQkJfSkuc3RhcnQoKTsKKworCQkJaW50IGxvY2FsUG9ydCA9IHNlcnZlclNvY2tldC5nZXRMb2NhbFBvcnQoKTsKKwkJCVN0cmluZyBsb2NhbEhvc3ROYW1lID0gc2VydmVyU29ja2V0LmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKTsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIGZpbGVTZXJ2ZXIuc2F2ZUZvckluc3RhbmNlQnlTb2NrZXQoYW9TZXNzaW9uLCBmaWxlTGluay5nZXRGaWxlTmFtZSgpLCAiIiwgZWxlbUlkLmFpZCwgZWxlbUlkLmlpZCwKKwkJCQkJCWxvY2FsSG9zdE5hbWUsIGxvY2FsUG9ydCk7CisJCQl9IGNhdGNoIChDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZSkgeworCQkJCVN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIHVwbG9hZCBmaWxlIHZpYSBzb2NrZXQgdG8gJXM6JWQgZHVlIHRvOiAlcyIsIGxvY2FsSG9zdE5hbWUsCisJCQkJCQlsb2NhbFBvcnQsIGUucmVhc29uKTsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24obWVzc2FnZSwgZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUcmllcyB0byBsb2FkIHRoZSBidWZmZXIgc2l6ZSB1c2VkIGJ5IHRoZSB7QGxpbmsgQ09SQkFGaWxlU2VydmVySUZ9IHRvIHJlYWNoCisJICogYmVzdCBwZXJmb3JtYW5jZS4gSW4gY2FzZSBvZiBlcnJvcnMgYSBkZWZhdWx0IGJ1ZmZlciBzaXplIG9mIG9mCisJICoge0B2YWx1ZSAjREVGQVVMVF9CVUZGRVJfU0laRX0gaXMgdXNlZC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGJ1ZmZlciBzaXplIGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgaW50IGdldEJ1ZmZlclNpemUoKSB7CisJCXRyeSB7CisJCQkvLyB0cnkgdG8gdXNlIHRoZSBzYW1lIGJ1ZmZlciBzaXplIGFzIHRoZSBjb3JiYSBmaWxlIHNlcnZlciBmb3IgYmVzdAorCQkJLy8gcGVyZm9ybWFuY2UKKwkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGZpbGVTZXJ2ZXIuZ2V0Q29udGV4dChhb1Nlc3Npb24sICJDT1JCQUZpbGVTZXJ2ZXIuQnVmZmVyU2l6ZSIpKTsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHwgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBERUZBVUxUX0JVRkZFUl9TSVpFOworCQl9CisJfQorCisJLyoqCisJICogQSBzaW1wbGUge0BsaW5rIElucHV0U3RyZWFtfSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGZvciBhbgorCSAqIHtAbGluayBJbnB1dFN0cmVhbUlGfS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnB1dFN0cmVhbUFkYXB0ZXIgZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKwkJcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbUlGIGlucHV0U3RyZWFtOworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3Rvci4KKwkJICoKKwkJICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSB3cmFwcGVkIHtAbGluayBJbnB1dFN0cmVhbUlGfS4KKwkJICovCisJCXByaXZhdGUgSW5wdXRTdHJlYW1BZGFwdGVyKElucHV0U3RyZWFtSUYgaW5wdXRTdHJlYW0pIHsKKwkJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbMV07CisJCQlyZXR1cm4gcmVhZChiKSA9PSAtMSA/IC0xIDogYlswXTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCURTX0JZVEVIb2xkZXIgYnl0ZUhvbGRlciA9IG5ldyBEU19CWVRFSG9sZGVyKCk7CisJCQkJaW50IHJlY2VpdmVkQnl0ZXMgPSBpbnB1dFN0cmVhbS5yZWFkKGJ5dGVIb2xkZXIsIG9mZnNldCwgbGVuZ3RoKTsKKwkJCQlpZiAocmVjZWl2ZWRCeXRlcyA+IDApIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShieXRlSG9sZGVyLnZhbHVlLCAwLCBidWZmZXIsIDAsIHJlY2VpdmVkQnl0ZXMpOworCQkJCX0KKwkJCQlyZXR1cm4gcmVjZWl2ZWRCeXRlczsKKwkJCX0gY2F0Y2ggKENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmV0cmlldmUgYnl0ZXMgZnJvbSBDT1JCQSBpbnB1dCBzdHJlYW0gZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7CisJCQl9IGNhdGNoIChDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNsb3NlIENPUkJBIGlucHV0IHN0cmVhbSBkdWUgdG86ICIgKyBlLnJlYXNvbiwgZSk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlucHV0U3RyZWFtLl9yZWxlYXNlKCk7CisJCQl9CisJCX0KKworCX0KKworCS8vIHJlbW90ZWx5IGNvbnN1bWFibGUgbG9jYWwgaW5wdXQgc3RyZWFtCisJLyoqCisJICogQSBzaW1wbGUge0BsaW5rIElucHV0U3RyZWFtSUZ9IGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gZm9yIGFuCisJICoge0BsaW5rIElucHV0U3RyZWFtfS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDT1JCQUlucHV0U3RyZWFtQWRhcHRlciBleHRlbmRzIElucHV0U3RyZWFtSUZQT0EgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKworCQlwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOworCQlwcml2YXRlIGZpbmFsIGxvbmcgbGVuZ3RoOworCisJCXByaXZhdGUgZmluYWwgYnl0ZVtdIG9iamVjdElEOworCQlwcml2YXRlIGZpbmFsIFBPQSBwb2E7CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yLgorCQkgKgorCQkgKiBAcGFyYW0gb3JiICAgICAgICAgVXNlZCB0byBhY2Nlc3MgdGhlIHJvb3Qge0BsaW5rIFBPQX0gdG8gYWN0aXZhdGUgdGhpcyBDT1JCQQorCQkgKiAgICAgICAgICAgICAgICAgICAgc2VydmljZSBvYmplY3QuCisJCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUgd3JhcHBlZCB7QGxpbmsgSW5wdXRTdHJlYW19LgorCQkgKiBAcGFyYW0gbGVuZ3RoICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgd3JhcHBlZCB7QGNvZGUgSW5wdXRTdHJlYW19LgorCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBvbiBlcnJvcnMuCisJCSAqLworCQlwcml2YXRlIENPUkJBSW5wdXRTdHJlYW1BZGFwdGVyKE9SQiBvcmIsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBsb25nIGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKwkJCXRoaXMubGVuZ3RoID0gbGVuZ3RoOworCisJCQl0cnkgeworCQkJCXBvYSA9IFBPQUhlbHBlci5uYXJyb3cob3JiLnJlc29sdmVfaW5pdGlhbF9yZWZlcmVuY2VzKCJSb290UE9BIikpOworCQkJCXBvYS50aGVfUE9BTWFuYWdlcigpLmFjdGl2YXRlKCk7CisJCQkJb2JqZWN0SUQgPSBwb2EuYWN0aXZhdGVfb2JqZWN0KHRoaXMpOworCQkJfSBjYXRjaCAoQWRhcHRlckluYWN0aXZlIHwgSW52YWxpZE5hbWUgfCBTZXJ2YW50QWxyZWFkeUFjdGl2ZSB8IFdyb25nUG9saWN5IGUpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgQ09SQkEgaW5wdXQgc3RyZWFtLiIsIGUpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHJlYWQoRFNfQllURUhvbGRlciBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIHsKKwkJCWIudmFsdWUgPSBuZXcgYnl0ZVtsZW5dOworCisJCQl0cnkgeworCQkJCXJldHVybiBpbnB1dFN0cmVhbS5yZWFkKGIudmFsdWUsIG9mZiwgbGVuKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uKEVycm9yQ29kZS5GSUxFU0VSVkVSX0lPX0VYQ0VQVElPTiwgU2V2ZXJpdHlGbGFnLkVSUk9SLAorCQkJCQkJZS5nZXRNZXNzYWdlKCkpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24geworCQkJdHJ5IHsKKwkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24oRXJyb3JDb2RlLkZJTEVTRVJWRVJfSU9fRVhDRVBUSU9OLCBTZXZlcml0eUZsYWcuRVJST1IsCisJCQkJCQllLmdldE1lc3NhZ2UoKSk7CisJCQl9IGZpbmFsbHkgeworCQkJCXRyeSB7CisJCQkJCXBvYS5kZWFjdGl2YXRlX29iamVjdChvYmplY3RJRCk7CisJCQkJfSBjYXRjaCAoT2JqZWN0Tm90QWN0aXZlIHwgV3JvbmdQb2xpY3kgZSkgeworCQkJCQlMT0dHRVIud2FybigiVW5hYmxlIHRvIGRlYWN0aXZlIENPUkJBIGlucHV0IHN0cmVhbSIsIGUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBsZW5ndGgoKSB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIHsKKwkJCS8qCisJCQkgKiBOT1RFOiBBIGZpbGUgbGVuZ3RoIGlzIG9mIHR5cGUgbG9uZyBhbmQgdGhlcmVmb3JlLCBmb3IgdmVyeSBsYXJnZSBmaWxlcyAoPgorCQkJICogMi4xNCBHQiksIHRoZSBleGFjdCBsZW5ndGggaXMgbG9zdCBkdWUgdG8gbmFycm93aW5nIGNvbnZlcnNpb24hCisJCQkgKi8KKwkJCXJldHVybiAoaW50KSBsZW5ndGg7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCWlucHV0U3RyZWFtLnJlc2V0KCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbihFcnJvckNvZGUuRklMRVNFUlZFUl9JT19FWENFUFRJT04sIFNldmVyaXR5RmxhZy5FUlJPUiwKKwkJCQkJCWUuZ2V0TWVzc2FnZSgpKTsKKwkJCX0KKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL0NPUkJBRmlsZVNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9maWxldHJhbnNmZXIvQ09SQkFGaWxlU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMGVmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL0NPUkJBRmlsZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDQ1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLmdyb3VwaW5nQnk7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy5yZWR1Y2luZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLnRpbWUuRHVyYXRpb247CitpbXBvcnQgamF2YS50aW1lLkxvY2FsVGltZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Nb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmZpbGUuRmlsZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmlsZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIENPUkJBIGZpbGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEZpbGVTZXJ2aWNlfSBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBDT1JCQUZpbGVTZXJ2aWNlIGltcGxlbWVudHMgRmlsZVNlcnZpY2UgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDT1JCQUZpbGVTZXJ2aWNlLmNsYXNzKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJFQURfUE9PTF9TSVpFID0gNTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIENPUkJBRmlsZVNlcnZlciBmaWxlU2VydmVyOworCXByaXZhdGUgZmluYWwgTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29udGV4dCAgVXNlZCBmb3Ige0BsaW5rIEVudGl0eX0gdG8ge0BsaW5rIEVsZW1JZH0gY29udmVyc2lvbi4KKwkgKiBAcGFyYW0gdHJhbnNmZXIgVGhlIHRyYW5zZmVyIHR5cGUgZm9yIHVwLSBhbmQgZG93bmxvYWRzLgorCSAqLworCXB1YmxpYyBDT1JCQUZpbGVTZXJ2aWNlKE9EU0NvbnRleHQgY29udGV4dCwgVHJhbnNmZXIgdHJhbnNmZXIpIHsKKwkJdGhpcy5tb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBTZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24oTW9kZWxNYW5hZ2VyLmNsYXNzKSk7CisKKwkJZmlsZVNlcnZlciA9IG5ldyBDT1JCQUZpbGVTZXJ2ZXIoY29udGV4dCwgdHJhbnNmZXIpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFNlcXVlbnRpYWwoRW50aXR5IGVudGl0eSwgUGF0aCB0YXJnZXQsIENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcywKKwkJCVByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgTGlzdDxGaWxlTGluaz4+IGdyb3VwcyA9IGZpbGVMaW5rcy5zdHJlYW0oKS5maWx0ZXIoRmlsZUxpbms6OmlzUmVtb3RlKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShGaWxlTGluazo6Z2V0UmVtb3RlUGF0aCkpOworCisJCWxvbmcgdG90YWxTaXplID0gY2FsY3VsYXRlRG93bmxvYWRTaXplKGVudGl0eSwgZ3JvdXBzKTsKKwkJZmluYWwgQXRvbWljTG9uZyB0cmFuc2ZlcnJlZCA9IG5ldyBBdG9taWNMb25nKCk7CisJCUxvY2FsVGltZSBzdGFydCA9IExvY2FsVGltZS5ub3coKTsKKwkJVVVJRCBpZCA9IFVVSUQucmFuZG9tVVVJRCgpOworCQlMT0dHRVIuZGVidWcoIlNlcXVlbnRpYWwgZG93bmxvYWQgb2Yge30gZmlsZShzKSB3aXRoIGlkICd7fScgc3RhcnRlZC4iLCBncm91cHMuc2l6ZSgpLCBpZCk7CisJCWZvciAoTGlzdDxGaWxlTGluaz4gZ3JvdXAgOiBncm91cHMudmFsdWVzKCkpIHsKKwkJCUZpbGVMaW5rIGZpbGVMaW5rID0gZ3JvdXAuZ2V0KDApOworCisJCQlkb3dubG9hZChlbnRpdHksIHRhcmdldCwgZmlsZUxpbmssIChiLCBwKSAtPiB7CisJCQkJZG91YmxlIHRyYW5mZXJyZWRCeXRlcyA9IHRyYW5zZmVycmVkLmFkZEFuZEdldChiKTsKKwkJCQlpZiAocHJvZ3Jlc3NMaXN0ZW5lciAhPSBudWxsKSB7CisJCQkJCXByb2dyZXNzTGlzdGVuZXIucHJvZ3Jlc3MoYiwgKGZsb2F0KSAodHJhbmZlcnJlZEJ5dGVzIC8gdG90YWxTaXplKSk7CisJCQkJfQorCQkJfSk7CisKKwkJCWZvciAoRmlsZUxpbmsgb3RoZXIgOiBncm91cC5zdWJMaXN0KDEsIGdyb3VwLnNpemUoKSkpIHsKKwkJCQlvdGhlci5zZXRMb2NhbFBhdGgoZmlsZUxpbmsuZ2V0TG9jYWxQYXRoKCkpOworCQkJfQorCQl9CisJCUxPR0dFUi5kZWJ1ZygiU2VxdWVudGlhbCBkb3dubG9hZCB3aXRoIGlkICd7fScgZmluaXNoZWQgaW4ge30uIiwgaWQsIER1cmF0aW9uLmJldHdlZW4oc3RhcnQsIExvY2FsVGltZS5ub3coKSkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFBhcmFsbGVsKEVudGl0eSBlbnRpdHksIFBhdGggdGFyZ2V0LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsCisJCQlQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIExpc3Q8RmlsZUxpbms+PiBncm91cHMgPSBmaWxlTGlua3Muc3RyZWFtKCkuZmlsdGVyKEZpbGVMaW5rOjppc1JlbW90ZSkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoRmlsZUxpbms6OmdldFJlbW90ZVBhdGgpKTsKKworCQlsb25nIHRvdGFsU2l6ZSA9IGNhbGN1bGF0ZURvd25sb2FkU2l6ZShlbnRpdHksIGdyb3Vwcyk7CisJCWZpbmFsIEF0b21pY0xvbmcgdHJhbnNmZXJyZWQgPSBuZXcgQXRvbWljTG9uZygpOworCQlMaXN0PENhbGxhYmxlPFZvaWQ+PiBkb3dubG9hZFRhc2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoTGlzdDxGaWxlTGluaz4gZ3JvdXAgOiBncm91cHMudmFsdWVzKCkpIHsKKwkJCWRvd25sb2FkVGFza3MuYWRkKCgpIC0+IHsKKwkJCQlGaWxlTGluayBmaWxlTGluayA9IGdyb3VwLmdldCgwKTsKKworCQkJCWRvd25sb2FkKGVudGl0eSwgdGFyZ2V0LCBmaWxlTGluaywgKGIsIHApIC0+IHsKKwkJCQkJZG91YmxlIHRyYW5mZXJyZWRCeXRlcyA9IHRyYW5zZmVycmVkLmFkZEFuZEdldChiKTsKKwkJCQkJaWYgKHByb2dyZXNzTGlzdGVuZXIgIT0gbnVsbCkgeworCQkJCQkJcHJvZ3Jlc3NMaXN0ZW5lci5wcm9ncmVzcyhiLCAoZmxvYXQpICh0cmFuZmVycmVkQnl0ZXMgLyB0b3RhbFNpemUpKTsKKwkJCQkJfQorCQkJCX0pOworCisJCQkJZm9yIChGaWxlTGluayBvdGhlciA6IGdyb3VwLnN1Ykxpc3QoMSwgZ3JvdXAuc2l6ZSgpKSkgeworCQkJCQlvdGhlci5zZXRMb2NhbFBhdGgoZmlsZUxpbmsuZ2V0TG9jYWxQYXRoKCkpOworCQkJCX0KKworCQkJCXJldHVybiBudWxsOworCQkJfSk7CisJCX0KKworCQlFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChUSFJFQURfUE9PTF9TSVpFKTsKKwkJTG9jYWxUaW1lIHN0YXJ0ID0gTG9jYWxUaW1lLm5vdygpOworCQlVVUlEIGlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisJCUxPR0dFUi5kZWJ1ZygiUGFyYWxsZWwgZG93bmxvYWQgb2Yge30gZmlsZShzKSB3aXRoIGlkICd7fScgc3RhcnRlZC4iLCBncm91cHMuc2l6ZSgpLCBpZCk7CisJCXRyeSB7CisJCQlMaXN0PFRocm93YWJsZT4gZXJyb3JzID0gZXhlY3V0b3JTZXJ2aWNlLmludm9rZUFsbChkb3dubG9hZFRhc2tzKS5zdHJlYW0oKS5tYXAoZnV0dXJlIC0+IHsKKwkJCQl0cnkgeworCQkJCQlmdXR1cmUuZ2V0KCk7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJTE9HR0VSLmVycm9yKCJEb3dubG9hZCBvZiBmYWlsZWQgZHVlIHRvOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCQlyZXR1cm4gZTsKKwkJCQl9CisJCQl9KS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQkJaWYgKCFlcnJvcnMuaXNFbXB0eSgpKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEb3dubG9hZCBmYWlsZCBmb3IgJyIgKyBlcnJvcnMuc2l6ZSgpICsgIicgZmlsZXMuIik7CisJCQl9CisJCQlMT0dHRVIuZGVidWcoIlBhcmFsbGVsIGRvd25sb2FkIHdpdGggaWQgJ3t9JyBmaW5pc2hlZCBpbiB7fS4iLCBpZCwKKwkJCQkJRHVyYXRpb24uYmV0d2VlbihzdGFydCwgTG9jYWxUaW1lLm5vdygpKSk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGRvd25sb2FkIGZpbGVzIGR1ZSB0bzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvd25sb2FkKEVudGl0eSBlbnRpdHksIFBhdGggdGFyZ2V0LCBGaWxlTGluayBmaWxlTGluaywgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKEZpbGVzLmV4aXN0cyh0YXJnZXQpKSB7CisJCQlpZiAoIUZpbGVzLmlzRGlyZWN0b3J5KHRhcmdldCkpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXJnZXQgcGF0aCBpcyBub3QgYSBkaXJlY3RvcnkuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlGaWxlcy5jcmVhdGVEaXJlY3RvcnkodGFyZ2V0KTsKKwkJfQorCisJCXRyeSAoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBvcGVuU3RyZWFtKGVudGl0eSwgZmlsZUxpbmssIHByb2dyZXNzTGlzdGVuZXIpKSB7CisJCQlmaWxlTGluay5zZXRMb2NhbFBhdGgodGFyZ2V0LnJlc29sdmUoZmlsZUxpbmsuZ2V0RmlsZU5hbWUoKSkpOworCQkJUGF0aCBhYnNvbHV0ZVBhdGggPSBmaWxlTGluay5nZXRMb2NhbFBhdGgoKS50b0Fic29sdXRlUGF0aCgpOworCQkJU3RyaW5nIHJlbW90ZVBhdGggPSBmaWxlTGluay5nZXRSZW1vdGVQYXRoKCk7CisJCQlMT0dHRVIuZGVidWcoIlN0YXJ0aW5nIGRvd25sb2FkIG9mIGZpbGUgJ3t9JyB0byAne30nLiIsIHJlbW90ZVBhdGgsIGFic29sdXRlUGF0aCk7CisJCQlMb2NhbFRpbWUgc3RhcnQgPSBMb2NhbFRpbWUubm93KCk7CisJCQlGaWxlcy5jb3B5KGlucHV0U3RyZWFtLCBmaWxlTGluay5nZXRMb2NhbFBhdGgoKSk7CisJCQlMT0dHRVIuZGVidWcoIkZpbGUgJ3t9JyBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBpbiB7fSB0byAne30nLiIsIHJlbW90ZVBhdGgsCisJCQkJCUR1cmF0aW9uLmJldHdlZW4oc3RhcnQsIExvY2FsVGltZS5ub3coKSksIGFic29sdXRlUGF0aCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElucHV0U3RyZWFtIG9wZW5TdHJlYW0oRW50aXR5IGVudGl0eSwgRmlsZUxpbmsgZmlsZUxpbmssIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbTsKKwkJaWYgKGZpbGVMaW5rLmlzTG9jYWwoKSkgeworCQkJLy8gZmlsZSBpcyBsb2NhbGx5IGF2YWlsYWJsZSAtPiBVU0UgdGhpcyBzaG9ydGN1dCEKKwkJCXNvdXJjZVN0cmVhbSA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKGZpbGVMaW5rLmdldExvY2FsUGF0aCgpKTsKKwkJfSBlbHNlIGlmIChmaWxlTGluay5pc1JlbW90ZSgpKSB7CisJCQlzb3VyY2VTdHJlYW0gPSBmaWxlU2VydmVyLm9wZW5TdHJlYW0oZmlsZUxpbmssIHRvRWxlbUlEKGVudGl0eSkpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmlsZSBsaW5rIGlzIG5laXRoZXIgaW4gbG9jYWwgbm9yIHJlbW90ZSBzdGF0ZTogIiArIGZpbGVMaW5rKTsKKwkJfQorCisJCS8vIE5PVEU6IEFjY2VzcyB0byBpbW1lZGlhdGUgaW5wdXQgc3RyZWFtIGlzIGJ1ZmZlcmVkLgorCQlpZiAocHJvZ3Jlc3NMaXN0ZW5lciAhPSBudWxsKSB7CisJCQlsb2FkU2l6ZShlbnRpdHksIGZpbGVMaW5rKTsKKwkJCS8vIE5PVEU6IFByb2dyZXNzIHVwZGF0ZXMgaW1tZWRpYXRlbHkgdHJpZ2dlcmVkIGJ5IHRoZSBzdHJlYW0KKwkJCS8vIGNvbnN1bWVyLgorCQkJcmV0dXJuIG5ldyBUcmFjZWRJbnB1dFN0cmVhbShzb3VyY2VTdHJlYW0sIHByb2dyZXNzTGlzdGVuZXIsIGZpbGVMaW5rLmdldFNpemUoKSk7CisJCX0KKworCQlyZXR1cm4gc291cmNlU3RyZWFtOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBsb2FkU2l6ZShFbnRpdHkgZW50aXR5LCBGaWxlTGluayBmaWxlTGluaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGZpbGVMaW5rLmdldFNpemUoKSA+IC0xKSB7CisJCQkvLyBmaWxlIHNpemUgaXMgYWxyZWFkeSBrbm93bgorCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKGZpbGVMaW5rLmlzTG9jYWwoKSkgeworCQkJZmlsZUxpbmsuc2V0RmlsZVNpemUoRmlsZXMuc2l6ZShmaWxlTGluay5nZXRMb2NhbFBhdGgoKSkpOworCQl9IGVsc2UgaWYgKGZpbGVMaW5rLmlzUmVtb3RlKCkpIHsKKwkJCWZpbGVMaW5rLnNldEZpbGVTaXplKGZpbGVTZXJ2ZXIubG9hZFNpemUoZmlsZUxpbmssIHRvRWxlbUlEKGVudGl0eSkpKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbGUgbGluayBpcyBuZWl0aGVyIGluIGxvY2FsIG5vciByZW1vdGUgc3RhdGU6ICIgKyBmaWxlTGluayk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZXF1ZW50aWFsIHVwbG9hZCBvZiBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9cy4gTG9jYWwge0BsaW5rIFBhdGh9cyBsaW5rZWQKKwkgKiBtdWx0aXBsZSB0aW1lcyBhcmUgdXBsb2FkZWQgb25seSBvbmNlLiBUaGUgdXBsb2FkIHByb2dyZXNzIG1heSBiZSB0cmFjZWQgd2l0aAorCSAqIGEgcHJvZ3Jlc3MgbGlzdGVuZXIuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5ICAgICAgICAgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHBhcmFtIGZpbGVMaW5rcyAgICAgICAgQ29sbGVjdGlvbiBvZiB7QGNvZGUgRmlsZUxpbmt9cyB0byB1cGxvYWQuCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgVGhlIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byB1cGxvYWQgZmlsZXMuCisJICovCisJcHVibGljIHZvaWQgdXBsb2FkU2VxdWVudGlhbChFbnRpdHkgZW50aXR5LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxQYXRoLCBMaXN0PEZpbGVMaW5rPj4gZ3JvdXBzID0gZmlsZUxpbmtzLnN0cmVhbSgpLmZpbHRlcihGaWxlTGluazo6aXNMb2NhbCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoRmlsZUxpbms6OmdldExvY2FsUGF0aCkpOworCisJCWxvbmcgdG90YWxTaXplID0gZ3JvdXBzLnZhbHVlcygpLnN0cmVhbSgpLm1hcChsIC0+IGwuZ2V0KDApKS5tYXBUb0xvbmcoRmlsZUxpbms6OmdldFNpemUpLnN1bSgpOworCQlmaW5hbCBBdG9taWNMb25nIHRyYW5zZmVycmVkID0gbmV3IEF0b21pY0xvbmcoKTsKKwkJTG9jYWxUaW1lIHN0YXJ0ID0gTG9jYWxUaW1lLm5vdygpOworCQlVVUlEIGlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisJCUxPR0dFUi5kZWJ1ZygiU2VxdWVudGlhbCB1cGxvYWQgb2Yge30gZmlsZShzKSB3aXRoIGlkICd7fScgc3RhcnRlZC4iLCBncm91cHMuc2l6ZSgpLCBpZCk7CisJCWZvciAoTGlzdDxGaWxlTGluaz4gZ3JvdXAgOiBncm91cHMudmFsdWVzKCkpIHsKKwkJCUZpbGVMaW5rIGZpbGVMaW5rID0gZ3JvdXAuZ2V0KDApOworCisJCQl1cGxvYWQoZW50aXR5LCBmaWxlTGluaywgKGIsIHApIC0+IHsKKwkJCQlkb3VibGUgdHJhbmZlcnJlZEJ5dGVzID0gdHJhbnNmZXJyZWQuYWRkQW5kR2V0KGIpOworCQkJCWlmIChwcm9ncmVzc0xpc3RlbmVyICE9IG51bGwpIHsKKwkJCQkJcHJvZ3Jlc3NMaXN0ZW5lci5wcm9ncmVzcyhiLCAoZmxvYXQpICh0cmFuZmVycmVkQnl0ZXMgLyB0b3RhbFNpemUpKTsKKwkJCQl9CisJCQl9KTsKKworCQkJZm9yIChGaWxlTGluayBvdGhlciA6IGdyb3VwLnN1Ykxpc3QoMSwgZ3JvdXAuc2l6ZSgpKSkgeworCQkJCW90aGVyLnNldFJlbW90ZVBhdGgoZmlsZUxpbmsuZ2V0UmVtb3RlUGF0aCgpKTsKKwkJCX0KKwkJfQorCQlMT0dHRVIuZGVidWcoIlNlcXVlbnRpYWwgdXBsb2FkIHdpdGggaWQgJ3t9JyBmaW5pc2hlZCBpbiB7fS4iLCBpZCwgRHVyYXRpb24uYmV0d2VlbihzdGFydCwgTG9jYWxUaW1lLm5vdygpKSk7CisJfQorCisJLyoqCisJICogUGFyYWxsZWwgdXBsb2FkIG9mIGdpdmVuIHtAbGluayBGaWxlTGlua31zLiBMb2NhbCB7QGxpbmsgUGF0aH1zIGxpbmtlZAorCSAqIG11bHRpcGxlIHRpbWVzIGFyZSB1cGxvYWRlZCBvbmx5IG9uY2UuIFRoZSB1cGxvYWQgcHJvZ3Jlc3MgbWF5IGJlIHRyYWNlZCB3aXRoCisJICogYSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICAgICAgICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gZmlsZUxpbmtzICAgICAgICBDb2xsZWN0aW9uIG9mIHtAY29kZSBGaWxlTGlua31zIHRvIHVwbG9hZC4KKwkgKiBAcGFyYW0gcHJvZ3Jlc3NMaXN0ZW5lciBUaGUgcHJvZ3Jlc3MgbGlzdGVuZXIuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHVwbG9hZCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGxvYWRQYXJhbGxlbChFbnRpdHkgZW50aXR5LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxQYXRoLCBMaXN0PEZpbGVMaW5rPj4gZ3JvdXBzID0gZmlsZUxpbmtzLnN0cmVhbSgpLmZpbHRlcihGaWxlTGluazo6aXNMb2NhbCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoRmlsZUxpbms6OmdldExvY2FsUGF0aCkpOworCisJCWxvbmcgdG90YWxTaXplID0gZ3JvdXBzLnZhbHVlcygpLnN0cmVhbSgpLm1hcChsIC0+IGwuZ2V0KDApKS5tYXBUb0xvbmcoRmlsZUxpbms6OmdldFNpemUpLnN1bSgpOworCQlmaW5hbCBBdG9taWNMb25nIHRyYW5zZmVycmVkID0gbmV3IEF0b21pY0xvbmcoKTsKKwkJTGlzdDxDYWxsYWJsZTxWb2lkPj4gZG93bmxvYWRUYXNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKExpc3Q8RmlsZUxpbms+IGdyb3VwIDogZ3JvdXBzLnZhbHVlcygpKSB7CisJCQlkb3dubG9hZFRhc2tzLmFkZCgoKSAtPiB7CisJCQkJRmlsZUxpbmsgZmlsZUxpbmsgPSBncm91cC5nZXQoMCk7CisKKwkJCQl1cGxvYWQoZW50aXR5LCBmaWxlTGluaywgKGIsIHApIC0+IHsKKwkJCQkJZG91YmxlIHRyYW5mZXJyZWRCeXRlcyA9IHRyYW5zZmVycmVkLmFkZEFuZEdldChiKTsKKwkJCQkJaWYgKHByb2dyZXNzTGlzdGVuZXIgIT0gbnVsbCkgeworCQkJCQkJcHJvZ3Jlc3NMaXN0ZW5lci5wcm9ncmVzcyhiLCAoZmxvYXQpICh0cmFuZmVycmVkQnl0ZXMgLyB0b3RhbFNpemUpKTsKKwkJCQkJfQorCQkJCX0pOworCisJCQkJZm9yIChGaWxlTGluayBvdGhlciA6IGdyb3VwLnN1Ykxpc3QoMSwgZ3JvdXAuc2l6ZSgpKSkgeworCQkJCQlvdGhlci5zZXRSZW1vdGVQYXRoKGZpbGVMaW5rLmdldFJlbW90ZVBhdGgoKSk7CisJCQkJfQorCisJCQkJcmV0dXJuIG51bGw7CisJCQl9KTsKKwkJfQorCisJCUV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKFRIUkVBRF9QT09MX1NJWkUpOworCQlMb2NhbFRpbWUgc3RhcnQgPSBMb2NhbFRpbWUubm93KCk7CisJCVVVSUQgaWQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKwkJTE9HR0VSLmRlYnVnKCJQYXJhbGxlbCB1cGxvYWQgb2Yge30gZmlsZShzKSB3aXRoIGlkICd7fScgc3RhcnRlZC4iLCBncm91cHMuc2l6ZSgpLCBpZCk7CisJCXRyeSB7CisJCQlMaXN0PFRocm93YWJsZT4gZXJyb3JzID0gZXhlY3V0b3JTZXJ2aWNlLmludm9rZUFsbChkb3dubG9hZFRhc2tzKS5zdHJlYW0oKS5tYXAoZnV0dXJlIC0+IHsKKwkJCQl0cnkgeworCQkJCQlmdXR1cmUuZ2V0KCk7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJTE9HR0VSLmVycm9yKCJVcGxvYWQgb2YgZmFpbGVkIGR1ZSB0bzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQkJcmV0dXJuIGU7CisJCQkJfQorCQkJfSkuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJCWlmICghZXJyb3JzLmlzRW1wdHkoKSkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVXBsb2FkIGZhaWxkIGZvciAnIiArIGVycm9ycy5zaXplKCkgKyAiJyBmaWxlcy4iKTsKKwkJCX0KKwkJCUxPR0dFUi5kZWJ1ZygiUGFyYWxsZWwgdXBsb2FkIHdpdGggaWQgJ3t9JyBmaW5pc2hlZCBpbiB7fS4iLCBpZCwgRHVyYXRpb24uYmV0d2VlbihzdGFydCwgTG9jYWxUaW1lLm5vdygpKSk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIHVwbG9hZCBmaWxlcyBkdWUgdG86ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0gZmluYWxseSB7CisJCQlleGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKwkJfQorCX0KKworCS8qKgorCSAqIERlbGV0ZXMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfXMgZm9ybSB0aGUgcmVtb3RlIHN0b3JhZ2UuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5ICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gZmlsZUxpbmtzIENvbGxlY3Rpb24gb2Yge0Bjb2RlIEZpbGVMaW5rfXMgdG8gZGVsZXRlLgorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0ZShFbnRpdHkgZW50aXR5LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MpIHsKKwkJZmlsZUxpbmtzLnN0cmVhbSgpLmZpbHRlcihGaWxlTGluazo6aXNSZW1vdGUpCisJCQkJLmNvbGxlY3QoZ3JvdXBpbmdCeShGaWxlTGluazo6Z2V0UmVtb3RlUGF0aCwgcmVkdWNpbmcoKGZsMSwgZmwyKSAtPiBmbDEpKSkudmFsdWVzKCkuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKE9wdGlvbmFsOjppc1ByZXNlbnQpLm1hcChPcHRpb25hbDo6Z2V0KS5mb3JFYWNoKGZsIC0+IGRlbGV0ZShlbnRpdHksIGZsKSk7CisJfQorCisJLyoqCisJICogRGVsZXRlcyBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9IGZvcm0gdGhlIHJlbW90ZSBzdG9yYWdlLgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gZmlsZUxpbmsgVGhlIHtAY29kZSBGaWxlTGlua31zIHRvIGRlbGV0ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxldGUoRW50aXR5IGVudGl0eSwgRmlsZUxpbmsgZmlsZUxpbmspIHsKKwkJaWYgKCFmaWxlTGluay5pc1JlbW90ZSgpKSB7CisJCQkvLyBub3RoaW5nIHRvIGRvCisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJZmlsZVNlcnZlci5kZWxldGUoZmlsZUxpbmssIHRvRWxlbUlEKGVudGl0eSkpOworCQkJTE9HR0VSLmRlYnVnKCJGaWxlICd7fScgc3VjZXNzZnVsbHkgZGVsZXRlZC4iLCBmaWxlTGluay5nZXRSZW1vdGVQYXRoKCkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlMT0dHRVIud2FybigiRmFpbGVkIHRvIGRlbGV0ZSByZW1vdGUgZmlsZS4iLCBlKTsKKwkJfQorCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBVcGxvYWRzIGdpdmVuIHtAbGluayBGaWxlTGlua30uIFRoZSB1cGxvYWQgcHJvZ3Jlc3MgbWF5IGJlIHRyYWNlZCB3aXRoIGEKKwkgKiBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICAgICAgICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gZmlsZUxpbmsgICAgICAgICBUaGUge0Bjb2RlIEZpbGVMaW5rfSB0byB1cGxvYWQuCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgVGhlIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byB1cGxvYWQgZmlsZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBsb2FkKEVudGl0eSBlbnRpdHksIEZpbGVMaW5rIGZpbGVMaW5rLCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChmaWxlTGluay5pc1JlbW90ZSgpKSB7CisJCQkvLyBub3RoaW5nIHRvIGRvCisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoIWZpbGVMaW5rLmlzTG9jYWwoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmlsZSBsaW5rIGRvZXMgbm90IGhhdmUgYSBsb2NhbCBwYXRoLiIpOworCQl9CisKKwkJSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oZmlsZUxpbmsuZ2V0TG9jYWxQYXRoKCkpOworCQlpZiAocHJvZ3Jlc3NMaXN0ZW5lciAhPSBudWxsKSB7CisJCQlzb3VyY2VTdHJlYW0gPSBuZXcgVHJhY2VkSW5wdXRTdHJlYW0oc291cmNlU3RyZWFtLCBwcm9ncmVzc0xpc3RlbmVyLCBmaWxlTGluay5nZXRTaXplKCkpOworCQl9CisKKwkJUGF0aCBhYnNvbHV0ZVBhdGggPSBmaWxlTGluay5nZXRMb2NhbFBhdGgoKS50b0Fic29sdXRlUGF0aCgpOworCQlMT0dHRVIuZGVidWcoIlN0YXJ0aW5nIHVwbG9hZCBvZiBmaWxlICd7fScuIiwgYWJzb2x1dGVQYXRoKTsKKwkJTG9jYWxUaW1lIHN0YXJ0ID0gTG9jYWxUaW1lLm5vdygpOworCQlmaWxlU2VydmVyLnVwbG9hZFN0cmVhbShzb3VyY2VTdHJlYW0sIGZpbGVMaW5rLCB0b0VsZW1JRChlbnRpdHkpKTsKKwkJTE9HR0VSLmRlYnVnKCJGaWxlICd7fScgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIGluIHt9IHRvICd7fScuIiwgYWJzb2x1dGVQYXRoLAorCQkJCUR1cmF0aW9uLmJldHdlZW4oc3RhcnQsIExvY2FsVGltZS5ub3coKSksIGZpbGVMaW5rLmdldFJlbW90ZVBhdGgoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBPRFMgZW50aXR5IGlkZW50aXR5IHtAbGluayBFbGVtSWR9IG9iamVjdCBmb3IgZ2l2ZW4KKwkgKiB7QGxpbmsgRW50aXR5fS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIHtAY29kZSBFbnRpdHl9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIEVsZW1JZH0gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBFbGVtSWQgdG9FbGVtSUQoRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gbmV3IEVsZW1JZCgoKE9EU0VudGl0eVR5cGUpIG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGVudGl0eSkpLmdldE9EU0lEKCksCisJCQkJT0RTQ29udmVydGVyLnRvT0RTSUQoZW50aXR5LmdldElEKCkpKTsKKwl9CisKKwkvKioKKwkgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCBkb3dubG9hZCBzaXplIGZvciBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9IGdyb3Vwcy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSBncm91cHMgVGhlIHtAY29kZSBGaWxlTGlua30gZ3JvdXBzLgorCSAqIEByZXR1cm4gVGhlIHRvdGFsIGRvd25sb2FkIHNpemUgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgdGhlIGZpbGUgc2l6ZS4KKwkgKi8KKwlwcml2YXRlIGxvbmcgY2FsY3VsYXRlRG93bmxvYWRTaXplKEVudGl0eSBlbnRpdHksIE1hcDxTdHJpbmcsIExpc3Q8RmlsZUxpbms+PiBncm91cHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUxpc3Q8RmlsZUxpbms+IGxpbmtzID0gZ3JvdXBzLnZhbHVlcygpLnN0cmVhbSgpLm1hcChsIC0+IGwuZ2V0KDApKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQlsb25nIHRvdGFsU2l6ZSA9IDA7CisJCWZvciAoRmlsZUxpbmsgZmlsZUxpbmsgOiBsaW5rcykgeworCQkJbG9hZFNpemUoZW50aXR5LCBmaWxlTGluayk7CisJCQkvLyBvdmVyZmxvdyBtYXkgb2NjdXIgaW4gY2FzZSBvZiB0b3RhbCBzaXplIGV4Y2VlZHMgOTIyMyBQQiEKKwkJCXRvdGFsU2l6ZSA9IE1hdGguYWRkRXhhY3QodG90YWxTaXplLCBmaWxlTGluay5nZXRTaXplKCkpOworCQl9CisKKwkJcmV0dXJuIHRvdGFsU2l6ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9maWxldHJhbnNmZXIvVHJhY2VkSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9maWxldHJhbnNmZXIvVHJhY2VkSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDdmYzY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2ZpbGV0cmFuc2Zlci9UcmFjZWRJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuZmlsZXRyYW5zZmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmZpbGUuRmlsZVNlcnZpY2UuUHJvZ3Jlc3NMaXN0ZW5lcjsKKworLyoqCisgKiBUaGlzIGlzIGFuIHtAbGluayBJbnB1dFN0cmVhbX0gd3JhcHBlciBpbXBsZW1lbnRhdGlvbiB0byB0cmFjZSB0aGUgcHJvZ3Jlc3MKKyAqIG9mIGFuIHtAY29kZSBJbnB1dFN0cmVhbX0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIFRyYWNlZElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyOworCXByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CisJcHJpdmF0ZSBmaW5hbCBsb25nIHNpemU7CisKKwlwcml2YXRlIGRvdWJsZSB0cmFuc2ZlcnJlZCA9IDA7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gaW5wdXRTdHJlYW0gICAgICBUaGUgdHJhY2VkIHtAbGluayBJbnB1dFN0cmVhbX0uCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgVGhlIGxpc3RlbmVyIHdpbGwgYmUgdXNlZCB0byBmaXJlIHVwZGF0ZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMuCisJICogQHBhcmFtIGxlbmd0aCAgICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgY29uc3VtZWQge0Bjb2RlIElucHV0U3RyZWFtfS4KKwkgKi8KKwlUcmFjZWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyLCBsb25nIGxlbmd0aCkgeworCQl0aGlzLnByb2dyZXNzTGlzdGVuZXIgPSBwcm9ncmVzc0xpc3RlbmVyOworCQl0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07CisJCXNpemUgPSBsZW5ndGg7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBpbnB1dFN0cmVhbS5yZWFkKCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbnQgcmVhZCA9IGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisJCWlmIChyZWFkID4gLTEpIHsKKwkJCXRyYW5zZmVycmVkICs9IHJlYWQ7CisJCQlwcm9ncmVzc0xpc3RlbmVyLnByb2dyZXNzKHJlYWQsIChmbG9hdCkgKHRyYW5zZmVycmVkIC8gc2l6ZSkpOworCQl9CisJCXJldHVybiByZWFkOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlucHV0U3RyZWFtLmNsb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL1RyYW5zZmVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL1RyYW5zZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwNTM2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9maWxldHJhbnNmZXIvVHJhbnNmZXIuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmZpbGV0cmFuc2ZlcjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogVHJhbnNmZXIgdHlwZSBlbnVtZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGVudW0gVHJhbnNmZXIgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEVudW0gY29uc3RhbnRzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogU2ltcGxlIHtAbGluayBJbnB1dFN0cmVhbX1zIGFyZSB1c2VkIGZvciB1cC0gYW5kIGRvd25sb2Fkcy4KKwkgKi8KKwlTVFJFQU0sCisKKwkvKioKKwkgKiBTb2NrZXQge0BsaW5rIElucHV0U3RyZWFtfXMgYXJlIHVzZWQgZm9yIHVwLSBhbmQgZG93bmxvYWRzLgorCSAqLworCVNPQ0tFVDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgdHJhbnNmZXIgaXMge0BsaW5rICNTVFJFQU19LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIGlzIHtAbGluayAjU1RSRUFNfS4KKwkgKi8KKwlib29sZWFuIGlzU3RyZWFtKCkgeworCQlyZXR1cm4gU1RSRUFNID09IHRoaXM7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyB0cmFuc2ZlciBpcyB7QGxpbmsgI1NPQ0tFVH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgaXMge0BsaW5rICNTT0NLRVR9LgorCSAqLworCWJvb2xlYW4gaXNTb2NrZXQoKSB7CisJCXJldHVybiBTT0NLRVQgPT0gdGhpczsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0NhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0NhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiYTczZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvQ2FjaGUuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWc7CisKKy8qKgorICogVXNlZCB0byB0ZW1wb3JhcmlseSBjYWNoZSB7QGxpbmsgRW50aXR5UmVzdWx0fXMgZm9yZSByZXVzZSBpbiBzdWJzZXF1ZW50CisgKiB7QGxpbmsgRW50aXR5UmVxdWVzdH1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitmaW5hbCBjbGFzcyBDYWNoZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBNYXA8RW50aXR5Q29uZmlnPD8+LCBFbnRpdHlSZXN1bHQ8Pz4+IGNhY2hlID0gbmV3IEhhc2hNYXA8PigpOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ2FjaGVzIGdpdmVuIHtAbGluayBFbnRpdHlSZXN1bHR9LgorCSAqCisJICogQHBhcmFtIGVudGl0eVJlc3VsdCBUaGUge0BsaW5rIEVudGl0eVJlc3VsdH0uCisJICovCisJcHVibGljIHZvaWQgYWRkKEVudGl0eVJlc3VsdDw/PiBlbnRpdHlSZXN1bHQpIHsKKwkJY2FjaGUucHV0KGVudGl0eVJlc3VsdC5yZXF1ZXN0LmVudGl0eUNvbmZpZywgZW50aXR5UmVzdWx0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjYWNoZWQge0BsaW5rIEVudGl0eVJlc3VsdH0gYXNzb2NpYXRlZCB3aXRoIGdpdmVuCisJICoge0BsaW5rIEVudGl0eUNvbmZpZ30uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlnIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgRW50aXR5UmVzdWx0fSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgcmVxdWVzdGVkIHtAY29kZQorCSAqIAkJRW50aXR5UmVzdWx0fSAgICAgICAgICAgIG5vdCBmb3VuZC4KKwkgKi8KKwlwdWJsaWMgRW50aXR5UmVzdWx0PD8+IGdldChFbnRpdHlDb25maWc8Pz4gZW50aXR5Q29uZmlnKSB7CisJCUVudGl0eVJlc3VsdDw/PiBlbnRpdHlSZXN1bHQgPSBjYWNoZS5nZXQoZW50aXR5Q29uZmlnKTsKKwkJaWYgKGVudGl0eVJlc3VsdCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnRpdHkgcmVzdWx0IG5vdCBmb3VuZCIpOworCQl9CisKKwkJcmV0dXJuIGVudGl0eVJlc3VsdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvQ2hpbGRSZXF1ZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0NoaWxkUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzBhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0NoaWxkUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb25jYXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Db21wYXJpc29uT3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWc7CisKKy8qKgorICogRXh0ZW5kcyB7QGxpbmsgRW50aXR5UmVxdWVzdH0gdG8gbG9hZCBjaGlsZHJlbiBmb3IgYSBnaXZlbgorICoge0BsaW5rIEVudGl0eVJlcXVlc3R9LgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIENoaWxkUmVxdWVzdDxUIGV4dGVuZHMgRGVsZXRhYmxlPiBleHRlbmRzIEVudGl0eVJlcXVlc3Q8VD4geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgRW50aXR5UmVxdWVzdDw/PiBwYXJlbnQ7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UmVxdWVzdCBUaGUgcGFyZW50IHtAbGluayBFbnRpdHlSZXF1ZXN0fS4KKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlnICBUaGUge0BsaW5rIEVudGl0eUNvbmZpZ30uCisJICovCisJQ2hpbGRSZXF1ZXN0KEVudGl0eVJlcXVlc3Q8Pz4gcGFyZW50UmVxdWVzdCwgRW50aXR5Q29uZmlnPFQ+IGVudGl0eUNvbmZpZykgeworCQlzdXBlcihwYXJlbnRSZXF1ZXN0LCBlbnRpdHlDb25maWcpOworCQlwYXJlbnQgPSBwYXJlbnRSZXF1ZXN0OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIExvYWRzIGFsbCByZWxhdGVkIGNoaWxkIGVudGl0aWVzLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBxdWVyaWVkIHtAY29kZSBFbnRpdHlSZXN1bHR9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgZW50aXRpZXMuCisJICovCisJcHVibGljIEVudGl0eVJlc3VsdDxUPiBsb2FkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlmaWx0ZXJlZCA9IHBhcmVudC5maWx0ZXJlZDsKKworCQlFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBlbnRpdHlDb25maWcuZ2V0RW50aXR5VHlwZSgpOworCQlSZWxhdGlvbiBwYXJlbnRSZWxhdGlvbiA9IGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCkuZ2V0UmVsYXRpb24ocGFyZW50LmVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCkpOworCQlSZWxhdGlvbiByZWZsZXhpdmVSZWxhdGlvbiA9IGVudGl0eUNvbmZpZy5pc1JlZmxleGl2ZSgpID8gZW50aXR5VHlwZS5nZXRSZWxhdGlvbihlbnRpdHlUeXBlKSA6IG51bGw7CisKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKQorCQkJCS8vIHNlbGVjdCBlbnRpdHkgYXR0cmlidXRlcworCQkJCS5zZWxlY3RBbGwoZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKSkKKwkJCQkvLyBzZWxlY3QgcGFyZW50IGVudGl0eSBJRAorCQkJCS5zZWxlY3QocGFyZW50UmVsYXRpb24uZ2V0QXR0cmlidXRlKCkpOworCisJCWlmIChlbnRpdHlDb25maWcuaXNSZWZsZXhpdmUoKSkgeworCQkJcXVlcnkuc2VsZWN0KHJlZmxleGl2ZVJlbGF0aW9uLmdldEF0dHJpYnV0ZSgpKTsKKwkJCS8vIGVudGl0aWVzIHdpdGggY2hpbGRyZW4gaGF2ZSB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZWlyCisJCQkvLyBjaGlsZHJlbiEKKwkJCXF1ZXJ5Lm9yZGVyKGVudGl0eVR5cGUuZ2V0SURBdHRyaWJ1dGUoKSk7CisJCX0KKworCQkvLyBwcmVwYXJlIHJlbGF0aW9ucyBzZWxlY3Qgc3RhdGVtZW50cworCQlMaXN0PFJlbGF0aW9uQ29uZmlnPiBvcHRpb25hbFJlbGF0aW9ucyA9IHNlbGVjdFJlbGF0aW9ucyhxdWVyeSwgZW50aXR5Q29uZmlnLmdldE9wdGlvbmFsQ29uZmlncygpLCBmYWxzZSk7CisJCUxpc3Q8UmVsYXRpb25Db25maWc+IG1hbmRhdG9yeVJlbGF0aW9ucyA9IHNlbGVjdFJlbGF0aW9ucyhxdWVyeSwgZW50aXR5Q29uZmlnLmdldE1hbmRhdG9yeUNvbmZpZ3MoKSwgdHJ1ZSk7CisJCUxpc3Q8UmVsYXRpb25Db25maWc+IGluaGVyaXRlZFJlbGF0aW9ucyA9IHNlbGVjdFJlbGF0aW9ucyhxdWVyeSwgZW50aXR5Q29uZmlnLmdldEluaGVyaXRlZENvbmZpZ3MoKSwgdHJ1ZSk7CisKKwkJLy8gY29uZmlndXJlIGZpbHRlcgorCQlGaWx0ZXIgYWRqdXN0ZWRGaWx0ZXIgPSBGaWx0ZXIub3IoKTsKKwkJaWYgKGZpbHRlcmVkKSB7CisJCQkvLyBwcmVzZXJ2ZSBjdXJyZW50IGNvbmRpdGlvbnMKKwkJCWFkanVzdGVkRmlsdGVyLmlkcyhwYXJlbnRSZWxhdGlvbiwgcGFyZW50LmVudGl0eVJlc3VsdC5nZXRJRHMoKSk7CisJCQlpZiAoZW50aXR5Q29uZmlnLmlzUmVmbGV4aXZlKCkpIHsKKwkJCQkvLyBleHRlbmQgdG8gcmV0cmlldmUgYWxsIHJlZmxleGl2ZSBjaGlsZCBjYW5kaWRhdGVzCisJCQkJYWRqdXN0ZWRGaWx0ZXIuYWRkKENvbXBhcmlzb25PcGVyYXRvci5JU19OT1RfTlVMTC5jcmVhdGUocmVmbGV4aXZlUmVsYXRpb24uZ2V0QXR0cmlidXRlKCksIDBMKSk7CisJCQl9CisJCX0KKworCQkvLyBsb2FkIGVudGl0aWVzIGFuZCBwcmVwYXJlIG1hcHBpbmdzIGZvciByZXF1aXJlZCByZWxhdGVkIGVudGl0aWVzCisJCUxpc3Q8RW50aXR5UmVjb3JkPD8+PiBwYXJlbnRSZWNvcmRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoUmVjb3JkIHJlY29yZCA6IGNvbGxlY3RSZWNvcmRzKHF1ZXJ5LmZldGNoKGFkanVzdGVkRmlsdGVyKSkpIHsKKwkJCU9wdGlvbmFsPFN0cmluZz4gcGFyZW50SUQgPSByZWNvcmQuZ2V0SUQocGFyZW50UmVsYXRpb24pOworCQkJT3B0aW9uYWw8U3RyaW5nPiByZWZsZXhpdmVQYXJlbnRJRCA9IE9wdGlvbmFsLmVtcHR5KCk7CisJCQlpZiAoZW50aXR5Q29uZmlnLmlzUmVmbGV4aXZlKCkpIHsKKwkJCQlyZWZsZXhpdmVQYXJlbnRJRCA9IHJlY29yZC5nZXRJRChyZWZsZXhpdmVSZWxhdGlvbik7CisJCQl9CisJCQlFbnRpdHlSZWNvcmQ8VD4gZW50aXR5UmVjb3JkOworCisJCQlpZiAocGFyZW50SUQuaXNQcmVzZW50KCkpIHsKKwkJCQlFbnRpdHlSZXN1bHQ8Pz4gcGFyZW50UmVzdWx0ID0gcGFyZW50LmVudGl0eVJlc3VsdDsKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCisJCQkJT3B0aW9uYWw8RW50aXR5UmVjb3JkPD8+PiBwYXJlbnRSZWNvcmQgPSAoT3B0aW9uYWwpIHBhcmVudFJlc3VsdC5nZXQocGFyZW50SUQuZ2V0KCkpOworCQkJCWlmICghcGFyZW50UmVjb3JkLmlzUHJlc2VudCgpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWVudGl0eVJlY29yZCA9IGVudGl0eVJlc3VsdC5hZGQocGFyZW50UmVjb3JkLmdldCgpLCByZWNvcmQpOworCQkJCXBhcmVudFJlY29yZHMuYWRkKHBhcmVudFJlY29yZC5nZXQoKSk7CisJCQl9IGVsc2UgaWYgKGVudGl0eUNvbmZpZy5pc1JlZmxleGl2ZSgpICYmIHJlZmxleGl2ZVBhcmVudElELmlzUHJlc2VudCgpKSB7CisJCQkJT3B0aW9uYWw8RW50aXR5UmVjb3JkPFQ+PiBwYXJlbnRSZWNvcmQgPSBlbnRpdHlSZXN1bHQuZ2V0KHJlZmxleGl2ZVBhcmVudElELmdldCgpKTsKKwkJCQlpZiAoIXBhcmVudFJlY29yZC5pc1ByZXNlbnQoKSkgeworCQkJCQkvLyB0aGlzIGVudGl0eSdzIHBhcmVudCB3YXMgbm90IGxvYWRlZCAtPiBza2lwCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvLyByZWZsZXhpdmUgY2hpbGQKKwkJCQllbnRpdHlSZWNvcmQgPSBlbnRpdHlSZXN1bHQuYWRkKHBhcmVudFJlY29yZC5nZXQoKSwgcmVjb3JkKTsKKwkJCQlwYXJlbnRSZWNvcmRzLmFkZChwYXJlbnRSZWNvcmQuZ2V0KCkpOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnRpdHkgd2l0aG91dCBwYXJlbnQgZm91bmQiKTsKKwkJCX0KKworCQkJLy8gY29sbGVjdCByZWxhdGVkIGluc3RhbmNlIElEcworCQkJY29uY2F0KGNvbmNhdChvcHRpb25hbFJlbGF0aW9ucy5zdHJlYW0oKSwgbWFuZGF0b3J5UmVsYXRpb25zLnN0cmVhbSgpKSwgaW5oZXJpdGVkUmVsYXRpb25zLnN0cmVhbSgpKQorCQkJCQkuZm9yRWFjaChyYyAtPiByYy5hZGQoZW50aXR5UmVjb3JkLCByZWNvcmQpKTsKKwkJfQorCisJCWlmIChlbnRpdHlSZXN1bHQuaXNFbXB0eSgpKSB7CisJCQkvLyBubyBlbnRpdGllcyBmb3VuZCAtPiBuZWl0aGVyIHJlbGF0ZWQgbm9yIGNoaWxkIGVudGl0aWVzIHJlcXVpcmVkCisJCQlyZXR1cm4gZW50aXR5UmVzdWx0OworCQl9CisKKwkJLy8gbG9hZCBhbmQgbWFwIHJlbGF0ZWQgZW50aXRpZXMKKwkJbG9hZFJlbGF0ZWRFbnRpdGllcyhvcHRpb25hbFJlbGF0aW9ucyk7CisJCWxvYWRSZWxhdGVkRW50aXRpZXMobWFuZGF0b3J5UmVsYXRpb25zKTsKKwkJYXNzaWduUmVsYXRlZEVudGl0aWVzKGluaGVyaXRlZFJlbGF0aW9ucyk7CisKKwkJLy8gc29ydCBjaGlsZHJlbiBvZiBwYXJlbnQKKwkJZm9yIChFbnRpdHlSZWNvcmQ8Pz4gZW50aXR5UmVjb3JkIDogcGFyZW50UmVjb3JkcykgeworCQkJZW50aXR5UmVjb3JkLmNvcmUuZ2V0Q2hpbGRyZW5TdG9yZSgpLnNvcnQoZW50aXR5Q29uZmlnLmdldEVudGl0eUNsYXNzKCksIGVudGl0eUNvbmZpZy5nZXRDb21wYXJhdG9yKCkpOworCQl9CisKKwkJLy8gbG9hZCBjaGlsZHJlbgorCQlmb3IgKEVudGl0eUNvbmZpZzw/IGV4dGVuZHMgRGVsZXRhYmxlPiBjaGlsZENvbmZpZyA6IGVudGl0eUNvbmZpZy5nZXRDaGlsZENvbmZpZ3MoKSkgeworCQkJY2FjaGUuYWRkKG5ldyBDaGlsZFJlcXVlc3Q8Pih0aGlzLCBjaGlsZENvbmZpZykubG9hZCgpKTsKKwkJfQorCisJCXJldHVybiBlbnRpdHlSZXN1bHQ7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIE1hcHMgcmVsYXRlZCBlbnRpdGllcyBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgUmVsYXRpb25Db25maWd9IHVzaW5nIHRoZQorCSAqIGVudGl0aWVzIGxvYWRlZCBpbiBwcmV2aW91cyB7QGxpbmsgRW50aXR5UmVxdWVzdH0uCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb25Db25maWdzIFRoZSB7QGNvZGUgUmVsYXRpb25Db25maWd9cy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIHJlbGF0ZWQgZW50aXRpZXMuCisJICovCisJcHJpdmF0ZSB2b2lkIGFzc2lnblJlbGF0ZWRFbnRpdGllcyhMaXN0PFJlbGF0aW9uQ29uZmlnPiByZWxhdGlvbkNvbmZpZ3MpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJZm9yIChSZWxhdGlvbkNvbmZpZyByZWxhdGlvbkNvbmZpZyA6IHJlbGF0aW9uQ29uZmlncykgeworCQkJRW50aXR5Q29uZmlnPD8+IHJlbGF0ZWRDb25maWcgPSByZWxhdGlvbkNvbmZpZy5lbnRpdHlDb25maWc7CisKKwkJCWJvb2xlYW4gaXNDb250ZXh0VHlwZURlZmluZWQgPSBlbnRpdHlDb25maWcuZ2V0Q29udGV4dFR5cGUoKS5pc1ByZXNlbnQoKTsKKwkJCWZvciAoRW50aXR5IHJlbGF0ZWRFbnRpdHkgOiBjYWNoZS5nZXQocmVsYXRlZENvbmZpZykuZ2V0RW50aXRpZXMoKSkgeworCQkJCWJvb2xlYW4gc2V0QnlDb250ZXh0VHlwZSA9ICFpc0NvbnRleHRUeXBlRGVmaW5lZCAmJiByZWxhdGVkQ29uZmlnLmdldENvbnRleHRUeXBlKCkuaXNQcmVzZW50KCk7CisJCQkJTGlzdDxFbnRpdHlSZWNvcmQ8Pz4+IGVudGl0eVJlY29yZHMgPSByZWxhdGlvbkNvbmZpZy5kZXBlbmRhbnRzLnJlbW92ZShyZWxhdGVkRW50aXR5LmdldElEKCkpOworCQkJCWVudGl0eVJlY29yZHMgPSBlbnRpdHlSZWNvcmRzID09IG51bGwgPyBuZXcgQXJyYXlMaXN0PEVudGl0eVJlY29yZDw/Pj4oKSA6IGVudGl0eVJlY29yZHM7CisJCQkJZm9yIChFbnRpdHlSZWNvcmQ8Pz4gZW50aXR5UmVjb3JkIDogZW50aXR5UmVjb3JkcykgeworCQkJCQlzZXRSZWxhdGVkRW50aXR5KGVudGl0eVJlY29yZCwgcmVsYXRlZEVudGl0eSwKKwkJCQkJCQlzZXRCeUNvbnRleHRUeXBlID8gcmVsYXRlZENvbmZpZy5nZXRDb250ZXh0VHlwZSgpLmdldCgpIDogbnVsbCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIXJlbGF0aW9uQ29uZmlnLmRlcGVuZGFudHMuaXNFbXB0eSgpKSB7CisJCQkJLy8gdGhpcyBtYXkgb2NjdXIgaWYgdGhlIGluc3RhbmNlIGlkIG9mIHRoZSByZWxhdGVkIGVudGl0eQorCQkJCS8vIGlzIGRlZmluZWQsIGJ1dCB0aGUgZW50aXR5IGl0c2VsZiBkb2VzIG5vdCBleGlzdAorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIHJlbGF0ZWQgZW50aXRpZXMuIik7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eUxvYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9FbnRpdHlMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWM4MWE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9FbnRpdHlMb2FkZXIuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZy5LZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKKworLyoqCisgKiBMb2FkcyBjb21wbGV0ZSB7QGxpbmsgRW50aXR5fXMgYnkgdXNpbmcgdGhlIHtAbGluayBFbnRpdHlDb25maWd9IGlkZW50aWZpZWQKKyAqIGJ5IGdpdmVuIHtAbGluayBLZXl9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgRW50aXR5TG9hZGVyIHsKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyOworCXByaXZhdGUgZmluYWwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZTsKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbW9kZWxNYW5hZ2VyIFRoZSB7QGxpbmsgT0RTTW9kZWxNYW5hZ2VyfS4KKwkgKi8KKwlwdWJsaWMgRW50aXR5TG9hZGVyKE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UpIHsKKwkJdGhpcy5tb2RlbE1hbmFnZXIgPSBtb2RlbE1hbmFnZXI7CisJCXRoaXMucXVlcnlTZXJ2aWNlID0gcXVlcnlTZXJ2aWNlOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIExvYWRzIHRoZSBlbnRpdHkgd2l0aCBnaXZlbiBpbnN0YW5jZSBJRC4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgIFRoZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0ga2V5ICAgICAgICBVc2VkIHRvIHJlc29sdmUgdGhlIGVudGl0eSBjb25maWd1cmF0aW9uLgorCSAqIEBwYXJhbSBpbnN0YW5jZUlEIFRoZSBpbnN0YW5jZSBJRC4KKwkgKiBAcmV0dXJuIFRoZSBxdWVyaWVkIHtAY29kZSBFbnRpdHl9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgZW50aXRpZXMuCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBUIGxvYWQoS2V5PFQ+IGtleSwgU3RyaW5nIGluc3RhbmNlSUQpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTGlzdDxUPiBlbnRpdGllcyA9IGxvYWRBbGwoa2V5LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGluc3RhbmNlSUQpKTsKKwkJaWYgKGVudGl0aWVzLnNpemUoKSAhPSAxKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiRmFpbGVkIHRvIGxvYWQgZW50aXR5IGJ5IGluc3RhbmNlIElELiIpOworCQl9CisJCXJldHVybiBlbnRpdGllcy5nZXQoMCk7CisJfQorCisJLyoqCisJICogTG9hZHMgYWxsIGVudGl0aWVzIG1hdGNoaW5nIGdpdmVuIG5hbWUgcGF0dGVybi4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgIFRoZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0ga2V5ICAgICBVc2VkIHRvIHJlc29sdmUgdGhlIGVudGl0eSBjb25maWd1cmF0aW9uLgorCSAqIEBwYXJhbSBwYXR0ZXJuIElzIGFsd2F5cyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycworCSAqICAgICAgICAgICAgICAgIGFzIGZvbGxvd3M6ICI/IiBmb3Igb25lIG1hdGNoaW5nIGNoYXJhY3RlciBhbmQgIioiIGZvciBhCisJICogICAgICAgICAgICAgICAgc2VxdWVuY2Ugb2YgbWF0Y2hpbmcgY2hhcmFjdGVycy4KKwkgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IHdpdGggcXVlcmllZCBlbnRpdGllcyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIGVudGl0aWVzLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkQWxsKEtleTxUPiBrZXksIFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVSZXF1ZXN0KGtleSkubG9hZEFsbChwYXR0ZXJuKTsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyBhbGwgZW50aXRpZXMgbWF0Y2hpbmcgZ2l2ZW4gaW5zdGFuY2UgSURzLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIFRoZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0ga2V5ICAgICAgICAgVXNlZCB0byByZXNvbHZlIHRoZSBlbnRpdHkgY29uZmlndXJhdGlvbi4KKwkgKiBAcGFyYW0gaW5zdGFuY2VJRHMgVGhlIGluc3RhbmNlIElEcy4KKwkgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IHdpdGggcXVlcmllZCBlbnRpdGllcyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIGVudGl0aWVzLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkQWxsKEtleTxUPiBrZXksIENvbGxlY3Rpb248U3RyaW5nPiBpbnN0YW5jZUlEcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlUmVxdWVzdChrZXkpLmxvYWRBbGwoaW5zdGFuY2VJRHMpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBFbnRpdHlSZXF1ZXN0fSBmb3IgZ2l2ZW4ge0BsaW5rIEtleX0uCisJICoKKwkgKiBAcGFyYW0gPFQ+IFRoZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0ga2V5IFVzZWQgdG8gcmVzb2x2ZSB0aGUgZW50aXR5IGNvbmZpZ3VyYXRpb24uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgRW50aXR5UmVxdWVzdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSA8VCBleHRlbmRzIEVudGl0eT4gRW50aXR5UmVxdWVzdDxUPiBjcmVhdGVSZXF1ZXN0KEtleTxUPiBrZXkpIHsKKwkJLyoKKwkJICogVE9ETzogYWRkIGN1c3RvbSByZXF1ZXN0IGltcGxlbWVudGF0aW9ucyBoZXJlIQorCQkgKi8KKwkJcmV0dXJuIG5ldyBFbnRpdHlSZXF1ZXN0PD4obW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIGtleSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eVJlY29yZC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9FbnRpdHlSZWNvcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjVlOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9FbnRpdHlSZWNvcmQuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIGdyb3VwIHtAbGluayBFbnRpdHl9IGFuZCBpdHMge0BsaW5rIENvcmV9LgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbnRpdHlSZWNvcmQ8VCBleHRlbmRzIEVudGl0eT4geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCWZpbmFsIENvcmUgY29yZTsKKwlmaW5hbCBUIGVudGl0eTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIHtAbGluayBFbnRpdHl9LgorCSAqIEBwYXJhbSBjb3JlICAgVGhlIHtAbGluayBDb3JlfSBvZiB0aGUge0Bjb2RlIEVudGl0eX0uCisJICovCisJRW50aXR5UmVjb3JkKFQgZW50aXR5LCBDb3JlIGNvcmUpIHsKKwkJdGhpcy5lbnRpdHkgPSBlbnRpdHk7CisJCXRoaXMuY29yZSA9IGNvcmU7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkVudGl0eVJlY29yZCBbY29yZT0iICsgY29yZSArICIsIGVudGl0eT0iICsgZW50aXR5ICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9FbnRpdHlSZXF1ZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eVJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDg0MDc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9FbnRpdHlSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwzMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRTZW5zb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQ29tcGFyaXNvbk9wZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5UZW1wbGF0ZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlU2Vuc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CisKKy8qKgorICogUmVjdXJzaXZlbHkgbG9hZHMgZW50aXRpZXMgZm9yIGEgZ2l2ZW4ge0BsaW5rIEVudGl0eUNvbmZpZ30gd2l0aCBhbGwgcmVzb2x2ZWQKKyAqIGRlcGVuZGVuY2llcyAob3B0aW9uYWwsIG1hbmRhdG9yeSBjaGlsZHJlbikuCisgKgorICogQHBhcmFtIDxUPiBUaGUgZW50aXR5IHR5cGUuCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIEVudGl0eVJlcXVlc3Q8VCBleHRlbmRzIEVudGl0eT4geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCWZpbmFsIE9EU01vZGVsTWFuYWdlciBvZHNNb2RlbE1hbmFnZXI7CisJZmluYWwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZTsKKwlmaW5hbCBFbnRpdHlDb25maWc8VD4gZW50aXR5Q29uZmlnOworCWZpbmFsIEVudGl0eVJlc3VsdDxUPiBlbnRpdHlSZXN1bHQgPSBuZXcgRW50aXR5UmVzdWx0PD4odGhpcyk7CisKKwlmaW5hbCBDYWNoZSBjYWNoZTsKKworCWJvb2xlYW4gZmlsdGVyZWQ7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbW9kZWxNYW5hZ2VyIFRoZSB7QGxpbmsgT0RTTW9kZWxNYW5hZ2VyfS4KKwkgKiBAcGFyYW0gY29uZmlnICAgICAgIFRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfS4KKwkgKi8KKwlwdWJsaWMgRW50aXR5UmVxdWVzdChPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBLZXk8VD4ga2V5KSB7CisJCXRoaXMub2RzTW9kZWxNYW5hZ2VyID0gbW9kZWxNYW5hZ2VyOworCQl0aGlzLnF1ZXJ5U2VydmljZSA9IHF1ZXJ5U2VydmljZTsKKwkJdGhpcy5lbnRpdHlDb25maWcgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5Q29uZmlnKGtleSk7CisJCWNhY2hlID0gbmV3IENhY2hlKCk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UmVxdWVzdCBUaGUgcGFyZW50IHtAbGluayBFbnRpdHlSZXF1ZXN0fS4KKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlnICBUaGUge0BsaW5rIEVudGl0eUNvbmZpZ30uCisJICovCisJcHJvdGVjdGVkIEVudGl0eVJlcXVlc3QoRW50aXR5UmVxdWVzdDw/PiBwYXJlbnRSZXF1ZXN0LCBFbnRpdHlDb25maWc8VD4gZW50aXR5Q29uZmlnKSB7CisJCW9kc01vZGVsTWFuYWdlciA9IHBhcmVudFJlcXVlc3Qub2RzTW9kZWxNYW5hZ2VyOworCQlxdWVyeVNlcnZpY2UgPSBwYXJlbnRSZXF1ZXN0LnF1ZXJ5U2VydmljZTsKKwkJY2FjaGUgPSBwYXJlbnRSZXF1ZXN0LmNhY2hlOworCQl0aGlzLmVudGl0eUNvbmZpZyA9IGVudGl0eUNvbmZpZzsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBMb2FkcyBhbGwgZW50aXRpZXMgbWF0Y2hpbmcgZ2l2ZW4gbmFtZSBwYXR0ZXJuLgorCSAqCisJICogQHBhcmFtIHBhdHRlcm4gSXMgYWx3YXlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzCisJICogICAgICAgICAgICAgICAgYXMgZm9sbG93czogIj8iIGZvciBvbmUgbWF0Y2hpbmcgY2hhcmFjdGVyIGFuZCAiKiIgZm9yIGEKKwkgKiAgICAgICAgICAgICAgICBzZXF1ZW5jZSBvZiBtYXRjaGluZyBjaGFyYWN0ZXJzLgorCSAqIEByZXR1cm4gQSBzb3J0ZWQge0BsaW5rIExpc3R9IHdpdGggcXVlcmllZCBlbnRpdGllcyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIGVudGl0aWVzLgorCSAqLworCXB1YmxpYyBMaXN0PFQ+IGxvYWRBbGwoU3RyaW5nIHBhdHRlcm4pIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvYWQoRmlsdGVyLm5hbWVPbmx5KGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCksIHBhdHRlcm4pKS5nZXRTb3J0ZWRFbnRpdGllcygpOworCX0KKworCS8qKgorCSAqIExvYWRzIGFsbCBlbnRpdGllcyBtYXRjaGluZyBnaXZlbiBpbnN0YW5jZSBJRHMuCisJICoKKwkgKiBAcGFyYW0gaW5zdGFuY2VJRHMgVGhlIGluc3RhbmNlIElEcy4KKwkgKiBAcmV0dXJuIEEgc29ydGVkIHtAbGluayBMaXN0fSB3aXRoIHF1ZXJpZWQgZW50aXRpZXMgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCBlbnRpdGllcy4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUPiBsb2FkQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpbnN0YW5jZUlEcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlpZiAoaW5zdGFuY2VJRHMuaXNFbXB0eSgpKSB7CisJCQkvLyBqdXN0IHRvIGJlIHN1cmUuLi4KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJfQorCisJCXJldHVybiBsb2FkKEZpbHRlci5pZHNPbmx5KGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCksIGluc3RhbmNlSURzKSkuZ2V0U29ydGVkRW50aXRpZXMoKTsKKwl9CisKKwlwdWJsaWMgT0RTTW9kZWxNYW5hZ2VyIGdldE9EU01vZGVsTWFuYWdlcigpIHsKKwkJcmV0dXJuIG9kc01vZGVsTWFuYWdlcjsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJvdGVjdGVkIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBZGRzIGZvcmVpZ24ga2V5IHNlbGVjdCBzdGF0ZW1lbnRzIHRvIGdpdmVuIHtAbGluayBRdWVyeX0gZm9yIGVhY2ggZ2l2ZW4KKwkgKiB7QGxpbmsgRW50aXR5Q29uZmlnfS4KKwkgKgorCSAqIEBwYXJhbSBxdWVyeSAgICAgICAgICBUaGUge0BsaW5rIFF1ZXJ5fS4KKwkgKiBAcGFyYW0gcmVsYXRlZENvbmZpZ3MgVGhlIHtAY29kZSBFbnRpdHlDb25maWd9cy4KKwkgKiBAcGFyYW0gbWFuZGF0b3J5ICAgICAgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciBnaXZlbiB7QGNvZGUgRW50aXR5Q29uZmlnfXMgYXJlCisJICogICAgICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeSBvciBub3QuCisJICogQHJldHVybiBGb3IgZWFjaCB7QGNvZGUgRW50aXR5Q29uZmlnfSBhIGNvcnJlc3BvbmRpbmcge0Bjb2RlCisJICogCQlSZWxhdGlvbkNvbmZpZ30gaXMgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICovCisJcHJvdGVjdGVkIExpc3Q8UmVsYXRpb25Db25maWc+IHNlbGVjdFJlbGF0aW9ucyhRdWVyeSBxdWVyeSwgTGlzdDxFbnRpdHlDb25maWc8Pz4+IHJlbGF0ZWRDb25maWdzLAorCQkJYm9vbGVhbiBtYW5kYXRvcnkpIHsKKwkJTGlzdDxSZWxhdGlvbkNvbmZpZz4gcmVsYXRpb25Db25maWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCk7CisJCWZvciAoRW50aXR5Q29uZmlnPD8+IHJlbGF0ZWRFbnRpdHlDb25maWcgOiByZWxhdGVkQ29uZmlncykgeworCQkJUmVsYXRpb25Db25maWcgcmVsYXRpb25Db25maWcgPSBuZXcgUmVsYXRpb25Db25maWcoZW50aXR5VHlwZSwgcmVsYXRlZEVudGl0eUNvbmZpZywgbWFuZGF0b3J5KTsKKwkJCXF1ZXJ5LnNlbGVjdChyZWxhdGlvbkNvbmZpZy5yZWxhdGlvbi5nZXRBdHRyaWJ1dGUoKSk7CisJCQlyZWxhdGlvbkNvbmZpZ3MuYWRkKHJlbGF0aW9uQ29uZmlnKTsKKwkJfQorCisJCXJldHVybiByZWxhdGlvbkNvbmZpZ3M7CisJfQorCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIGNvbGxlY3RzIHRoZSBxdWVyaWVkIHtAbGluayBSZWNvcmR9IGZyb20gZWFjaAorCSAqIHtAbGluayBSZXN1bHR9LgorCSAqCisJICogQHBhcmFtIHJlc3VsdHMgVGhlIHtAY29kZSBSZXN1bHR9cy4KKwkgKiBAcmV0dXJuIFRoZSBxdWVyaWVkIHtAbGluayBSZWNvcmR9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHJvdGVjdGVkIExpc3Q8UmVjb3JkPiBjb2xsZWN0UmVjb3JkcyhMaXN0PFJlc3VsdD4gcmVzdWx0cykgeworCQlyZXR1cm4gcmVzdWx0cy5zdHJlYW0oKS5tYXAociAtPiByLmdldFJlY29yZChlbnRpdHlDb25maWcuZ2V0RW50aXR5VHlwZSgpKSkuY29sbGVjdCh0b0xpc3QoKSk7CisJfQorCisJLyoqCisJICogTG9hZHMgYW5kIG1hcHMgcmVsYXRlZCBlbnRpdGllcyBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgUmVsYXRpb25Db25maWd9LgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uQ29uZmlncyBUaGUge0Bjb2RlIFJlbGF0aW9uQ29uZmlnfXMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCByZWxhdGVkIGVudGl0aWVzLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGxvYWRSZWxhdGVkRW50aXRpZXMoTGlzdDxSZWxhdGlvbkNvbmZpZz4gcmVsYXRpb25Db25maWdzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWZvciAoUmVsYXRpb25Db25maWcgcmVsYXRpb25Db25maWcgOiByZWxhdGlvbkNvbmZpZ3MpIHsKKwkJCUVudGl0eUNvbmZpZzw/PiByZWxhdGVkQ29uZmlnID0gcmVsYXRpb25Db25maWcuZW50aXR5Q29uZmlnOworCisJCQlib29sZWFuIGlzQ29udGV4dFR5cGVEZWZpbmVkID0gZW50aXR5Q29uZmlnLmdldENvbnRleHRUeXBlKCkuaXNQcmVzZW50KCk7CisJCQlmb3IgKEVudGl0eSByZWxhdGVkRW50aXR5IDogbmV3IEVudGl0eVJlcXVlc3Q8Pih0aGlzLCByZWxhdGVkQ29uZmlnKQorCQkJCQkubG9hZEFsbChyZWxhdGlvbkNvbmZpZy5kZXBlbmRhbnRzLmtleVNldCgpKSkgeworCQkJCWJvb2xlYW4gc2V0QnlDb250ZXh0VHlwZSA9ICFpc0NvbnRleHRUeXBlRGVmaW5lZCAmJiByZWxhdGVkQ29uZmlnLmdldENvbnRleHRUeXBlKCkuaXNQcmVzZW50KCk7CisJCQkJZm9yIChFbnRpdHlSZWNvcmQ8Pz4gZW50aXR5UmVjb3JkIDogcmVsYXRpb25Db25maWcuZGVwZW5kYW50cy5yZW1vdmUocmVsYXRlZEVudGl0eS5nZXRJRCgpKSkgeworCQkJCQlzZXRSZWxhdGVkRW50aXR5KGVudGl0eVJlY29yZCwgcmVsYXRlZEVudGl0eSwKKwkJCQkJCQlzZXRCeUNvbnRleHRUeXBlID8gcmVsYXRlZENvbmZpZy5nZXRDb250ZXh0VHlwZSgpLmdldCgpIDogbnVsbCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIXJlbGF0aW9uQ29uZmlnLmRlcGVuZGFudHMuaXNFbXB0eSgpKSB7CisJCQkJLy8gdGhpcyBtYXkgb2NjdXIgaWYgdGhlIGluc3RhbmNlIGlkIG9mIHRoZSByZWxhdGVkIGVudGl0eQorCQkJCS8vIGlzIGRlZmluZWQsIGJ1dCB0aGUgZW50aXR5IGl0c2VsZiBkb2VzIG5vdCBleGlzdAorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisJCQkJCQkiVW5hYmxlIHRvIGxvYWQgcmVsYXRlZCBlbnRpdGllczogIiArIHJlbGF0aW9uQ29uZmlnLmRlcGVuZGFudHMudG9TdHJpbmcoKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBBc3NpZ25zIGdpdmVuIHJlbGF0ZWQge0BsaW5rIEVudGl0eX0gdG8gZ2l2ZW4ge0BsaW5rIEVudGl0eVJlY29yZH0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5UmVjb3JkICBUaGUge0Bjb2RlIEVudGl0eVJlY29yZH0gd2hpY2ggcmVmZXJlbmNlcyBnaXZlbgorCSAqICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBFbnRpdHl9LgorCSAqIEBwYXJhbSByZWxhdGVkRW50aXR5IFRoZSByZWxhdGVkIHtAY29kZSBFbnRpdHl9LgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSAgIFVzZWQgYXMgcXVhbGlmaWVyIGZvciByZWxhdGlvbiBhc3NpZ25tZW50LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFJlbGF0ZWRFbnRpdHkoRW50aXR5UmVjb3JkPD8+IGVudGl0eVJlY29yZCwgRW50aXR5IHJlbGF0ZWRFbnRpdHksIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCWlmIChjb250ZXh0VHlwZSA9PSBudWxsKSB7CisJCQllbnRpdHlSZWNvcmQuY29yZS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQocmVsYXRlZEVudGl0eSk7CisJCX0gZWxzZSB7CisJCQllbnRpdHlSZWNvcmQuY29yZS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQocmVsYXRlZEVudGl0eSwgY29udGV4dFR5cGUpOworCQl9CisKKwkJTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gdGVtcGxhdGVBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWlmIChlbnRpdHlSZWNvcmQuZW50aXR5IGluc3RhbmNlb2YgQ29udGV4dENvbXBvbmVudCAmJiByZWxhdGVkRW50aXR5IGluc3RhbmNlb2YgVGVtcGxhdGVDb21wb25lbnQpIHsKKwkJCXRlbXBsYXRlQXR0cmlidXRlcy5hZGRBbGwoKChUZW1wbGF0ZUNvbXBvbmVudCkgcmVsYXRlZEVudGl0eSkuZ2V0VGVtcGxhdGVBdHRyaWJ1dGVzKCkpOworCQl9IGVsc2UgaWYgKGVudGl0eVJlY29yZC5lbnRpdHkgaW5zdGFuY2VvZiBDb250ZXh0U2Vuc29yICYmIHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBUZW1wbGF0ZVNlbnNvcikgeworCQkJdGVtcGxhdGVBdHRyaWJ1dGVzLmFkZEFsbCgoKFRlbXBsYXRlU2Vuc29yKSByZWxhdGVkRW50aXR5KS5nZXRUZW1wbGF0ZUF0dHJpYnV0ZXMoKSk7CisJCX0KKworCQlpZiAoIXRlbXBsYXRlQXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKKwkJCS8vIGhpZGUgVmFsdWUgY29udGFpbmVycyB0aGF0IGFyZSBtaXNzaW5nIGluIHRoZSB0ZW1wbGF0ZQorCQkJU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDw+KGVudGl0eVJlY29yZC5jb3JlLmdldFZhbHVlcygpLmtleVNldCgpKTsKKwkJCW5hbWVzLnJlbW92ZShFbnRpdHkuQVRUUl9OQU1FKTsKKwkJCW5hbWVzLnJlbW92ZShFbnRpdHkuQVRUUl9NSU1FVFlQRSk7CisJCQl0ZW1wbGF0ZUF0dHJpYnV0ZXMuc3RyZWFtKCkubWFwKEVudGl0eTo6Z2V0TmFtZSkuZm9yRWFjaChuYW1lczo6cmVtb3ZlKTsKKwkJCWVudGl0eVJlY29yZC5jb3JlLmhpZGVWYWx1ZXMobmFtZXMpOworCQl9CisJfQorCisJLyoqCisJICogTG9hZHMgYWxsIGVudGl0aWVzIG1hdGNoaW5nIGdpdmVuIHtAbGluayBGaWx0ZXJ9IGluY2x1ZGluZyBhbGwgb2YgcmVsYXRlZAorCSAqIGVudGl0aWVzIChvcHRpb25hbCwgbWFuZGF0b3J5IGFuZCBjaGlsZHJlbikuCisJICoKKwkgKiBAcGFyYW0gZmlsdGVyIFRoZSB7QGxpbmsgRmlsdGVyfS4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHF1ZXJpZWQge0Bjb2RlIEVudGl0eVJlc3VsdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCBlbnRpdGllcy4KKwkgKi8KKwlwcm90ZWN0ZWQgRW50aXR5UmVzdWx0PFQ+IGxvYWQoRmlsdGVyIGZpbHRlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlmaWx0ZXJlZCA9ICFmaWx0ZXIuaXNFbXRwdHkoKSB8fCBlbnRpdHlDb25maWcuaXNSZWZsZXhpdmUoKTsKKworCQlFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBlbnRpdHlDb25maWcuZ2V0RW50aXR5VHlwZSgpOworCQlSZWxhdGlvbiByZWZsZXhpdmVSZWxhdGlvbiA9IGVudGl0eUNvbmZpZy5pc1JlZmxleGl2ZSgpID8gZW50aXR5VHlwZS5nZXRSZWxhdGlvbihlbnRpdHlUeXBlKSA6IG51bGw7CisKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RBbGwoZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKSk7CisKKwkJaWYgKGVudGl0eUNvbmZpZy5pc1JlZmxleGl2ZSgpKSB7CisJCQlxdWVyeS5zZWxlY3QocmVmbGV4aXZlUmVsYXRpb24uZ2V0QXR0cmlidXRlKCkpOworCQkJLy8gZW50aXRpZXMgd2l0aCBjaGlsZHJlbiBoYXZlIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlaXIKKwkJCS8vIGNoaWxkcmVuIQorCQkJcXVlcnkub3JkZXIoZW50aXR5VHlwZS5nZXRJREF0dHJpYnV0ZSgpKTsKKwkJfQorCisJCS8vIHByZXBhcmUgcmVsYXRpb25zIHNlbGVjdCBzdGF0ZW1lbnRzCisJCUxpc3Q8UmVsYXRpb25Db25maWc+IG9wdGlvbmFsUmVsYXRpb25zID0gc2VsZWN0UmVsYXRpb25zKHF1ZXJ5LCBlbnRpdHlDb25maWcuZ2V0T3B0aW9uYWxDb25maWdzKCksIGZhbHNlKTsKKwkJTGlzdDxSZWxhdGlvbkNvbmZpZz4gbWFuZGF0b3J5UmVsYXRpb25zID0gc2VsZWN0UmVsYXRpb25zKHF1ZXJ5LCBlbnRpdHlDb25maWcuZ2V0TWFuZGF0b3J5Q29uZmlncygpLCB0cnVlKTsKKworCQkvLyBjb25maWd1cmUgZmlsdGVyCisJCUZpbHRlciBhZGp1c3RlZEZpbHRlciA9IEZpbHRlci5vcigpOworCQlpZiAoZmlsdGVyZWQpIHsKKwkJCS8vIHByZXNlcnZlIGN1cnJlbnQgY29uZGl0aW9ucworCQkJYWRqdXN0ZWRGaWx0ZXIubWVyZ2UoZmlsdGVyKTsKKwkJCWlmIChlbnRpdHlDb25maWcuaXNSZWZsZXhpdmUoKSkgeworCQkJCS8vIGV4dGVuZCB0byByZXRyaWV2ZSBhbGwgcmVmbGV4aXZlIGNoaWxkIGNhbmRpZGF0ZXMKKwkJCQlhZGp1c3RlZEZpbHRlci5hZGQoQ29tcGFyaXNvbk9wZXJhdG9yLklTX05PVF9OVUxMLmNyZWF0ZShyZWZsZXhpdmVSZWxhdGlvbi5nZXRBdHRyaWJ1dGUoKSwgMEwpKTsKKwkJCX0KKwkJfQorCisJCS8vIGxvYWQgZW50aXRpZXMgYW5kIHByZXBhcmUgbWFwcGluZ3MgZm9yIHJlcXVpcmVkIHJlbGF0ZWQgZW50aXRpZXMKKwkJTGlzdDxFbnRpdHlSZWNvcmQ8Pz4+IHBhcmVudFJlY29yZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChSZWNvcmQgcmVjb3JkIDogY29sbGVjdFJlY29yZHMocXVlcnkuZmV0Y2goYWRqdXN0ZWRGaWx0ZXIpKSkgeworCQkJT3B0aW9uYWw8U3RyaW5nPiByZWZsZXhpdmVQYXJlbnRJRCA9IE9wdGlvbmFsLmVtcHR5KCk7CisJCQlpZiAoZW50aXR5Q29uZmlnLmlzUmVmbGV4aXZlKCkpIHsKKwkJCQlyZWZsZXhpdmVQYXJlbnRJRCA9IHJlY29yZC5nZXRJRChyZWZsZXhpdmVSZWxhdGlvbik7CisJCQl9CisJCQlFbnRpdHlSZWNvcmQ8VD4gZW50aXR5UmVjb3JkOworCisJCQlpZiAoZW50aXR5Q29uZmlnLmlzUmVmbGV4aXZlKCkgJiYgcmVmbGV4aXZlUGFyZW50SUQuaXNQcmVzZW50KCkpIHsKKwkJCQlPcHRpb25hbDxFbnRpdHlSZWNvcmQ8VD4+IHBhcmVudFJlY29yZCA9IGVudGl0eVJlc3VsdC5nZXQocmVmbGV4aXZlUGFyZW50SUQuZ2V0KCkpOworCQkJCWlmICghcGFyZW50UmVjb3JkLmlzUHJlc2VudCgpKSB7CisJCQkJCS8vIHRoaXMgZW50aXR5J3MgcGFyZW50IHdhcyBub3QgbG9hZGVkIC0+IHNraXAKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJZW50aXR5UmVjb3JkID0gZW50aXR5UmVzdWx0LmFkZChwYXJlbnRSZWNvcmQuZ2V0KCksIHJlY29yZCk7CisJCQkJcGFyZW50UmVjb3Jkcy5hZGQocGFyZW50UmVjb3JkLmdldCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJZW50aXR5UmVjb3JkID0gZW50aXR5UmVzdWx0LmFkZChyZWNvcmQpOworCQkJfQorCisJCQkvLyBjb2xsZWN0IHJlbGF0ZWQgaW5zdGFuY2UgSURzCisJCQlTdHJlYW0uY29uY2F0KG9wdGlvbmFsUmVsYXRpb25zLnN0cmVhbSgpLCBtYW5kYXRvcnlSZWxhdGlvbnMuc3RyZWFtKCkpCisJCQkJCS5mb3JFYWNoKHJjIC0+IHJjLmFkZChlbnRpdHlSZWNvcmQsIHJlY29yZCkpOworCQl9CisKKwkJaWYgKGVudGl0eVJlc3VsdC5pc0VtcHR5KCkpIHsKKwkJCS8vIG5vIGVudGl0aWVzIGZvdW5kIC0+IG5laXRoZXIgcmVsYXRlZCBub3IgY2hpbGQgZW50aXRpZXMgcmVxdWlyZWQKKwkJCXJldHVybiBlbnRpdHlSZXN1bHQ7CisJCX0KKworCQkvLyBsb2FkIGFuZCBtYXAgcmVsYXRlZCBlbnRpdGllcworCQlsb2FkUmVsYXRlZEVudGl0aWVzKG9wdGlvbmFsUmVsYXRpb25zKTsKKwkJbG9hZFJlbGF0ZWRFbnRpdGllcyhtYW5kYXRvcnlSZWxhdGlvbnMpOworCisJCS8vIHNvcnQgY2hpbGRyZW4gb2YgcGFyZW50CisJCWlmIChlbnRpdHlDb25maWcuaXNSZWZsZXhpdmUoKSkgeworCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQlFbnRpdHlDb25maWc8RGVsZXRhYmxlPiBjaGlsZENvbmZpZyA9IChFbnRpdHlDb25maWc8RGVsZXRhYmxlPikgZW50aXR5Q29uZmlnOworCQkJZm9yIChFbnRpdHlSZWNvcmQ8Pz4gZW50aXR5UmVjb3JkIDogcGFyZW50UmVjb3JkcykgeworCQkJCWVudGl0eVJlY29yZC5jb3JlLmdldENoaWxkcmVuU3RvcmUoKS5zb3J0KGNoaWxkQ29uZmlnLmdldEVudGl0eUNsYXNzKCksIGNoaWxkQ29uZmlnLmdldENvbXBhcmF0b3IoKSk7CisJCQl9CisJCX0KKworCQkvLyBsb2FkIGNoaWxkcmVuCisJCWZvciAoRW50aXR5Q29uZmlnPD8gZXh0ZW5kcyBEZWxldGFibGU+IGNoaWxkQ29uZmlnIDogZW50aXR5Q29uZmlnLmdldENoaWxkQ29uZmlncygpKSB7CisJCQljYWNoZS5hZGQobmV3IENoaWxkUmVxdWVzdDw+KHRoaXMsIGNoaWxkQ29uZmlnKS5sb2FkKCkpOworCQl9CisKKwkJcmV0dXJuIGVudGl0eVJlc3VsdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvRW50aXR5UmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YTkxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eVJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cDsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0F0dHJpYnV0ZS5WQVRUUl9FTlVNRVJBVElPTl9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0F0dHJpYnV0ZS5WQVRUUl9TQ0FMQVJfVFlQRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dBdHRyaWJ1dGUuVkFUVFJfU0VRVUVOQ0U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5EZWZhdWx0Q29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW51bVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVjb3JkOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNFbnRpdHlGYWN0b3J5OworCisvKioKKyAqIENvbnRhaW5lciBmb3IgZW50aXRpZXMgYnkgZXhlY3V0aW5nIGFuIHtAbGluayBFbnRpdHlSZXF1ZXN0fS4KKyAqCisgKiBAcGFyYW0gPFQ+IFRoZSBlbnRpdHkgdHlwZS4KKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitmaW5hbCBjbGFzcyBFbnRpdHlSZXN1bHQ8VCBleHRlbmRzIEVudGl0eT4geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRW50aXR5UmVjb3JkPFQ+PiBlbnRpdHlSZWNvcmRzID0gbmV3IEhhc2hNYXA8PigpOworCXByaXZhdGUgZmluYWwgTGlzdDxUPiBlbnRpdGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJZmluYWwgRW50aXR5UmVxdWVzdDxUPiByZXF1ZXN0OworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHJlcXVlc3QgVGhlIGFzc29jaWF0ZWQge0BsaW5rIEVudGl0eVJlcXVlc3R9LgorCSAqLworCUVudGl0eVJlc3VsdChFbnRpdHlSZXF1ZXN0PFQ+IHJlcXVlc3QpIHsKKwkJdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5UmVjb3JkfSBpZGVudGlmaWVkIGJ5IGdpdmVuIGluc3RhbmNlIElELgorCSAqCisJICogQHBhcmFtIGlkIFRoZSBpbnN0YW5jZSBJRC4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYge0Bjb2RlIEVudGl0eVJlY29yZH0gbm90IGZvdW5kLgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxFbnRpdHlSZWNvcmQ8VD4+IGdldChTdHJpbmcgaWQpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZW50aXR5UmVjb3Jkcy5nZXQoaWQpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIHtAbGluayBFbnRpdHlSZWNvcmR9IGZvciBnaXZlbiB7QGxpbmsgUmVjb3JkfSBhbmQgbWFwcHMgaXQKKwkgKiBpbnRlcm5hbGx5IGJ5IGl0cyBpbnN0YW5jZSBJRC4KKwkgKgorCSAqIEBwYXJhbSByZWNvcmQgVGhlIHtAY29kZSBSZWNvcmR9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIEVudGl0eVJlY29yZH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEVudGl0eVJlY29yZDxUPiBhZGQoUmVjb3JkIHJlY29yZCkgeworCQlyZXR1cm4gY3JlYXRlKG5ldyBEZWZhdWx0Q29yZShyZWNvcmQpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIHtAbGluayBFbnRpdHlSZWNvcmR9IGZvciBnaXZlbiB7QGxpbmsgUmVjb3JkfSB1c2luZyBnaXZlbiBwYXJlbnQKKwkgKiB7QGNvZGUgRW50aXR5UmVjb3JkfSBhbmQgbWFwcyBpdCBpbnRlcm5hbGx5IGJ5IGl0cyBpbnN0YW5jZSBJRC4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRSZWNvcmQgVGhlIGNyZWF0ZWQge0Bjb2RlIEVudGl0eVJlY29yZH0gd2lsbCBiZSByZWxhdGVkIGFzIGEKKwkgKiAgICAgICAgICAgICAgICAgICAgIGNoaWxkIHdpdGggdGhpcyBvbmUuCisJICogQHBhcmFtIHJlY29yZCAgICAgICBUaGUge0Bjb2RlIFJlY29yZH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgRW50aXR5UmVjb3JkfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgRW50aXR5UmVjb3JkPFQ+IGFkZChFbnRpdHlSZWNvcmQ8Pz4gcGFyZW50UmVjb3JkLCBSZWNvcmQgcmVjb3JkKSB7CisJCUNvcmUgY29yZSA9IG5ldyBEZWZhdWx0Q29yZShyZWNvcmQpOworCisJCWlmIChDYXRhbG9nQXR0cmlidXRlLmNsYXNzLmVxdWFscyhyZXF1ZXN0LmVudGl0eUNvbmZpZy5nZXRFbnRpdHlDbGFzcygpKSkgeworCQkJLy8gYWRkIHJlYWQgb25seSBwcm9wZXJ0aWVzIGZyb20gYXBwbGljYXRpb24gbW9kZWwKKwkJCWFkanVzdENhdGFsb2dBdHRyaWJ1dGVDb3JlKHBhcmVudFJlY29yZC5lbnRpdHksIGNvcmUpOworCQl9CisKKwkJRW50aXR5UmVjb3JkPFQ+IGNoaWxkUmVjb3JkID0gY3JlYXRlKGNvcmUpOworCQljaGlsZFJlY29yZC5jb3JlLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KHBhcmVudFJlY29yZC5lbnRpdHkpOworCQlwYXJlbnRSZWNvcmQuY29yZS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKChEZWxldGFibGUpIGNoaWxkUmVjb3JkLmVudGl0eSk7CisJCXJldHVybiBjaGlsZFJlY29yZDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5fXMgb2YgdGhpcyBlbnRpdHkgcmVzdWx0LgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PFQ+IGdldEVudGl0aWVzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChlbnRpdGllcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eX1zIG9mIHRoaXMgZW50aXR5IHJlc3VsdCBzb3J0ZWQuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybmVkIHtAY29kZSBDb2xsZWN0aW9ufSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8VD4gZ2V0U29ydGVkRW50aXRpZXMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KAorCQkJCWVudGl0aWVzLnN0cmVhbSgpLnNvcnRlZChyZXF1ZXN0LmVudGl0eUNvbmZpZy5nZXRDb21wYXJhdG9yKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIElEcyBvZiB0aGUgZW50aXRpZXMgaGVsZCBieSB0aGlzIGVudGl0eSByZXN1bHQuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybmVkIHtAY29kZSBDb2xsZWN0aW9ufSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJRHMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGVudGl0eVJlY29yZHMua2V5U2V0KCkpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgZW50aXR5IHJlc3VsdCBob2xkcyBlbnRpdGllcyBvciBpcyBlbXB0eS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBlbnRpdHkgcmVzdWx0IGhhcyBubyBlbnRpdGllcy4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworCQlyZXR1cm4gZW50aXRpZXMuaXNFbXB0eSgpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBZGRzIGZ1cnRoZXIgbWV0YSBkYXRhIHRvIHRoZSBnaXZlbiB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0ge0BsaW5rIENvcmV9LgorCSAqCisJICogQHBhcmFtIGNhdGFsb2dDb21wb25lbnQgICAgIFRoZSBwYXJlbnQge0BsaW5rIENhdGFsb2dDb21wb25lbnR9LgorCSAqIEBwYXJhbSBjYXRhbG9nQXR0cmlidXRlQ29yZSBUaGUge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9IHtAY29kZSBDb3JlfS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRqdXN0Q2F0YWxvZ0F0dHJpYnV0ZUNvcmUoRW50aXR5IGNhdGFsb2dDb21wb25lbnQsIENvcmUgY2F0YWxvZ0F0dHJpYnV0ZUNvcmUpIHsKKwkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gcmVxdWVzdC5vZHNNb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShjYXRhbG9nQ29tcG9uZW50LmdldE5hbWUoKSk7CisJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBlbnRpdHlUeXBlLmdldEF0dHJpYnV0ZShjYXRhbG9nQXR0cmlidXRlQ29yZS5nZXRWYWx1ZXMoKS5nZXQoRW50aXR5LkFUVFJfTkFNRSkuZXh0cmFjdCgpKTsKKworCQlNYXA8U3RyaW5nLCBWYWx1ZT4gdmFsdWVzID0gY2F0YWxvZ0F0dHJpYnV0ZUNvcmUuZ2V0VmFsdWVzKCk7CisJCVZhbHVlIGVudW1lcmF0aW9uTmFtZSA9IFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKFZBVFRSX0VOVU1FUkFUSU9OX05BTUUpOworCQl2YWx1ZXMucHV0KFZBVFRSX0VOVU1FUkFUSU9OX05BTUUsIGVudW1lcmF0aW9uTmFtZSk7CisJCWlmIChhdHRyaWJ1dGUuZ2V0VmFsdWVUeXBlKCkuaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJZW51bWVyYXRpb25OYW1lLnNldChhdHRyaWJ1dGUuZ2V0RW51bU9iaigpLmdldE5hbWUoKSk7CisJCX0KKworCQlFbnVtZXJhdGlvbjw/PiBzY2FsYXJUeXBlT2JqID0gRW51bVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0KCJTY2FsYXJUeXBlIik7CisJCVZhbHVlIHNjYWxhclR5cGUgPSBWYWx1ZVR5cGUuRU5VTUVSQVRJT04uY3JlYXRlKHNjYWxhclR5cGVPYmosIFZBVFRSX1NDQUxBUl9UWVBFKTsKKwkJc2NhbGFyVHlwZS5zZXQoc2NhbGFyVHlwZU9iai52YWx1ZU9mKGF0dHJpYnV0ZS5nZXRWYWx1ZVR5cGUoKS50b1NpbmdsZVR5cGUoKS5uYW1lKCkpKTsKKwkJdmFsdWVzLnB1dChWQVRUUl9TQ0FMQVJfVFlQRSwgc2NhbGFyVHlwZSk7CisKKwkJdmFsdWVzLnB1dChWQVRUUl9TRVFVRU5DRSwgVmFsdWVUeXBlLkJPT0xFQU4uY3JlYXRlKFZBVFRSX1NFUVVFTkNFLCBhdHRyaWJ1dGUuZ2V0VmFsdWVUeXBlKCkuaXNTZXF1ZW5jZSgpKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRW50aXR5UmVjb3JkfSBpbnN0YW5jZSBmb3IgZ2l2ZW4ge0BsaW5rIENvcmV9LiBUaGUKKwkgKiB7QGxpbmsgRW50aXR5UmVjb3JkfSBpcyBpbnRlcm5hbGx5IG1hcHBlZCB0aGUgaXRzIGluc3RhbmNlIElELgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAY29kZSBDb3JlfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAbGluayBFbnRpdHlSZWNvcmR9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgRW50aXR5UmVjb3JkPFQ+IGNyZWF0ZShDb3JlIGNvcmUpIHsKKwkJT0RTRW50aXR5RmFjdG9yeSBvZHNFbnRpdHlGYWN0b3J5ID0gbmV3IE9EU0VudGl0eUZhY3RvcnkocmVxdWVzdC5nZXRPRFNNb2RlbE1hbmFnZXIoKSwgbnVsbCk7CisJCUVudGl0eVJlY29yZDxUPiBlbnRpdHlSZWNvcmQgPSBuZXcgRW50aXR5UmVjb3JkPD4oCisJCQkJb2RzRW50aXR5RmFjdG9yeS5jcmVhdGVFbnRpdHkocmVxdWVzdC5lbnRpdHlDb25maWcuZ2V0RW50aXR5Q2xhc3MoKSwgY29yZSksIGNvcmUpOworCQllbnRpdHlSZWNvcmRzLnB1dChjb3JlLmdldElEKCksIGVudGl0eVJlY29yZCk7CisJCWVudGl0aWVzLmFkZChlbnRpdHlSZWNvcmQuZW50aXR5KTsKKwkJcmV0dXJuIGVudGl0eVJlY29yZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvUmVsYXRpb25Db25maWcuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvUmVsYXRpb25Db25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWU4OGRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9SZWxhdGlvbkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVjb3JkOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIGNvbGxlY3Qge0BsaW5rIEVudGl0eVJlY29yZH0gcmVmZXJlbmNpbmcgZW50aXRpZXMgb2YgdGhlCisgKiBzYW1lIHR5cGUgc3BlY2lmaWVkIGJ5IGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZWxhdGlvbkNvbmZpZyB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJZmluYWwgTWFwPFN0cmluZywgTGlzdDxFbnRpdHlSZWNvcmQ8Pz4+PiBkZXBlbmRhbnRzID0gbmV3IEhhc2hNYXA8PigpOworCWZpbmFsIEVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWc7CisJZmluYWwgUmVsYXRpb24gcmVsYXRpb247CisJZmluYWwgYm9vbGVhbiBtYW5kYXRvcnk7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gc291cmNlICAgICAgIFRoZSBzb3VyY2Uge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBlbnRpdHlDb25maWcgVGhlIHRhcmdldCB7QGxpbmsgRW50aXR5Q29uZmlnfS4KKwkgKiBAcGFyYW0gbWFuZGF0b3J5ICAgIEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgYSByZWxhdGVkIG11c3QgZXhpc3Qgb3Igbm90LgorCSAqLworCXB1YmxpYyBSZWxhdGlvbkNvbmZpZyhFbnRpdHlUeXBlIHNvdXJjZSwgRW50aXR5Q29uZmlnPD8+IGVudGl0eUNvbmZpZywgYm9vbGVhbiBtYW5kYXRvcnkpIHsKKwkJdGhpcy5lbnRpdHlDb25maWcgPSBlbnRpdHlDb25maWc7CisJCXJlbGF0aW9uID0gc291cmNlLmdldFJlbGF0aW9uKGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCkpOworCQl0aGlzLm1hbmRhdG9yeSA9IG1hbmRhdG9yeTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBHaXZlbiB7QGxpbmsgRW50aXR5UmVjb3JkfSBkZXBlbmRzIG9uIHtAbGluayBFbnRpdHl9cyB3aGljaCBhcmUgbG9hZGVkIGJ5CisJICogcHJvY2Vzc2luZyB0aGlzIHJlbGF0aW9uIGNvbmZpZy4gVGhlcmVmb3JlIGdpdmVuIHtAY29kZSBFbnRpdHlSZWNvcmR9IGNhY2hlZAorCSAqIGFuZCBzYXRpc2ZpZWQgYXMgc29vbiBhcyB0aGUgY29ycmVzcG9uZGluZyBlbnRpdGllcyBhcmUgbG9hZGVkLgorCSAqCisJICogQHBhcmFtIGVudGl0eVJlY29yZCBUaGUgZGVwZW5kYW50IHtAY29kZSBFbnRpdHlSZWNvcmR9LgorCSAqIEBwYXJhbSByZWNvcmQgICAgICAgVGhlIHtAbGluayBSZWNvcmR9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbgorCSAqICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEVudGl0eVJlY29yZH0uCisJICovCisJcHVibGljIHZvaWQgYWRkKEVudGl0eVJlY29yZDw/PiBlbnRpdHlSZWNvcmQsIFJlY29yZCByZWNvcmQpIHsKKwkJT3B0aW9uYWw8U3RyaW5nPiByZWxhdGVkRW50aXR5SUQgPSByZWNvcmQuZ2V0SUQocmVsYXRpb24pOworCQlpZiAocmVsYXRlZEVudGl0eUlELmlzUHJlc2VudCgpKSB7CisJCQlkZXBlbmRhbnRzLmNvbXB1dGVJZkFic2VudChyZWxhdGVkRW50aXR5SUQuZ2V0KCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZChlbnRpdHlSZWNvcmQpOworCQl9IGVsc2UgaWYgKG1hbmRhdG9yeSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWFuZGF0b3J5IHJlbGF0aW9uIHVuc2F0aXNmaWVkIGZvciByZWxhdGlvbiAiICsgcmVsYXRpb24uZ2V0TmFtZSgpKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9jb25maWcvRGVmYXVsdEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvY29uZmlnL0RlZmF1bHRFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiZjU3ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvY29uZmlnL0RlZmF1bHRFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0U2Vuc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUGFyYW1ldGVyU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5QaHlzaWNhbERpbWVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUXVhbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNvcnRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0NvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ1NlbnNvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2xhc3NpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkRvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUHJvamVjdERvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUm9sZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5UZW1wbGF0ZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVTZW5zb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVUZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVUZXN0U3RlcFVzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5WYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlZhbHVlTGlzdFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5WZXJzaW9uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNFbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU1V0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0RW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlciBpbXBsZW1lbnRzIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERlZmF1bHRFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmNsYXNzKTsKKworCUVudGl0eUNvbmZpZ1JlcG9zaXRvcnkgZW50aXR5Q29uZmlnUmVwb3NpdG9yeTsKKworCXB1YmxpYyBEZWZhdWx0RW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcigpIHsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ31zLgorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5Q29uZmlnUmVwb3NpdG9yeSBsb2FkRW50aXR5Q29uZmlndXJhdGlvbnMoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcikgeworCQlMT0dHRVIuZGVidWcoIkxvYWRpbmcgZW50aXR5IGNvbmZpZ3VyYXRpb25zLi4uIik7CisJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5ID0gbmV3IEVudGl0eUNvbmZpZ1JlcG9zaXRvcnkoKTsKKworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihSb2xlLmNsYXNzKSwgIlJvbGUiLCBmYWxzZSkpOworCisJCS8vIEVudmlyb25tZW50IHwgUHJvamVjdCB8IFBvb2wgfCBQaHlzaWNhbERpbWVuc2lvbiB8IFVzZXIgfCBNZWFzdXJlbWVudAorCQkvLyB8IENoYW5uZWxHcm91cAorCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihFbnZpcm9ubWVudC5jbGFzcyksICJFbnZpcm9ubWVudCIsIGZhbHNlKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFByb2plY3QuY2xhc3MpLCAiUHJvamVjdCIsIGZhbHNlKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFBvb2wuY2xhc3MpLCAiU3RydWN0dXJlTGV2ZWwiLCB0cnVlKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkKKwkJCQkucmVnaXN0ZXIoY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFBoeXNpY2FsRGltZW5zaW9uLmNsYXNzKSwgIlBoeXNEaW1lbnNpb24iLCBmYWxzZSkpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihVc2VyLmNsYXNzKSwgIlVzZXIiLCBmYWxzZSkpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihNZWFzdXJlbWVudC5jbGFzcyksICJNZWFSZXN1bHQiLCBmYWxzZSkpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihDaGFubmVsR3JvdXAuY2xhc3MpLCAiU3ViTWF0cml4IiwgZmFsc2UpKTsKKworCQkvLyBVbml0CisJCUVudGl0eUNvbmZpZzxVbml0PiB1bml0Q29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFVuaXQuY2xhc3MpLCAiVW5pdCIsIGZhbHNlKTsKKwkJdW5pdENvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oUGh5c2ljYWxEaW1lbnNpb24uY2xhc3MpKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIodW5pdENvbmZpZyk7CisKKwkJLy8gUXVhbnRpdHkKKwkJRW50aXR5Q29uZmlnPFF1YW50aXR5PiBxdWFudGl0eUNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihRdWFudGl0eS5jbGFzcyksICJRdWFudGl0eSIsIGZhbHNlKTsKKwkJcXVhbnRpdHlDb25maWcuYWRkTWFuZGF0b3J5KGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KFVuaXQuY2xhc3MpKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIocXVhbnRpdHlDb25maWcpOworCisJCS8vIENoYW5uZWwKKwkJRW50aXR5Q29uZmlnPENoYW5uZWw+IGNoYW5uZWxDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oQ2hhbm5lbC5jbGFzcyksICJNZWFRdWFudGl0eSIsIGZhbHNlKTsKKwkJY2hhbm5lbENvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVW5pdC5jbGFzcykpKTsKKwkJY2hhbm5lbENvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oUXVhbnRpdHkuY2xhc3MpKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY2hhbm5lbENvbmZpZyk7CisKKwkJLy8gVmFsdWVMaXN0CisJCUVudGl0eUNvbmZpZzxWYWx1ZUxpc3RWYWx1ZT4gdmFsdWVMaXN0VmFsdWVDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oVmFsdWVMaXN0VmFsdWUuY2xhc3MpLAorCQkJCSJWYWx1ZUxpc3RWYWx1ZSIsIHRydWUpOworCQl2YWx1ZUxpc3RWYWx1ZUNvbmZpZy5zZXRDb21wYXJhdG9yKFNvcnRhYmxlLkNPTVBBUkFUT1IpOworCQlFbnRpdHlDb25maWc8VmFsdWVMaXN0PiB2YWx1ZUxpc3RDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oVmFsdWVMaXN0LmNsYXNzKSwgIlZhbHVlTGlzdCIsIHRydWUpOworCQl2YWx1ZUxpc3RDb25maWcuYWRkQ2hpbGQodmFsdWVMaXN0VmFsdWVDb25maWcpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKHZhbHVlTGlzdENvbmZpZyk7CisKKwkJLy8gUGFyYW1ldGVyU2V0CisJCUVudGl0eUNvbmZpZzxQYXJhbWV0ZXI+IHBhcmFtZXRlckNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihQYXJhbWV0ZXIuY2xhc3MpLCAiUmVzdWx0UGFyYW1ldGVyIiwKKwkJCQl0cnVlKTsKKwkJcGFyYW1ldGVyQ29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KFVuaXQuY2xhc3MpKSk7CisJCUVudGl0eUNvbmZpZzxQYXJhbWV0ZXJTZXQ+IHBhcmFtZXRlclNldENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihQYXJhbWV0ZXJTZXQuY2xhc3MpLAorCQkJCSJSZXN1bHRQYXJhbWV0ZXJTZXQiLCB0cnVlKTsKKwkJcGFyYW1ldGVyU2V0Q29uZmlnLmFkZENoaWxkKHBhcmFtZXRlckNvbmZpZyk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIocGFyYW1ldGVyU2V0Q29uZmlnKTsKKworCQkvLyBDYXRhbG9nQ29tcG9uZW50cworCQlyZWdpc3RlckNhdGFsb2dDb21wb25lbnQobW9kZWxNYW5hZ2VyLCBDb250ZXh0VHlwZS5VTklUVU5ERVJURVNUKTsKKwkJcmVnaXN0ZXJDYXRhbG9nQ29tcG9uZW50KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVEVTVFNFUVVFTkNFKTsKKwkJcmVnaXN0ZXJDYXRhbG9nQ29tcG9uZW50KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCk7CisKKwkJLy8gVGVtcGxhdGVSb290cworCQlyZWdpc3RlclRlbXBsYXRlUm9vdChtb2RlbE1hbmFnZXIsIENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpOworCQlyZWdpc3RlclRlbXBsYXRlUm9vdChtb2RlbE1hbmFnZXIsIENvbnRleHRUeXBlLlRFU1RTRVFVRU5DRSk7CisJCXJlZ2lzdGVyVGVtcGxhdGVSb290KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCk7CisKKwkJLy8gVGVtcGxhdGVUZXN0U3RlcAorCQlFbnRpdHlDb25maWc8VGVtcGxhdGVUZXN0U3RlcD4gdGVtcGxhdGVUZXN0U3RlcENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihUZW1wbGF0ZVRlc3RTdGVwLmNsYXNzKSwKKwkJCQkiVHBsVGVzdFN0ZXAiLCB0cnVlKTsKKwkJdGVtcGxhdGVUZXN0U3RlcENvbmZpZworCQkJCS5hZGRPcHRpb25hbChlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldyBLZXk8PihUZW1wbGF0ZVJvb3QuY2xhc3MsIENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpKSk7CisJCXRlbXBsYXRlVGVzdFN0ZXBDb25maWcKKwkJCQkuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVGVtcGxhdGVSb290LmNsYXNzLCBDb250ZXh0VHlwZS5URVNUU0VRVUVOQ0UpKSk7CisJCXRlbXBsYXRlVGVzdFN0ZXBDb25maWcKKwkJCQkuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVGVtcGxhdGVSb290LmNsYXNzLCBDb250ZXh0VHlwZS5URVNURVFVSVBNRU5UKSkpOworCQl0ZW1wbGF0ZVRlc3RTdGVwQ29uZmlnLnNldENvbXBhcmF0b3IoVmVyc2lvbmFibGUuQ09NUEFSQVRPUik7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIodGVtcGxhdGVUZXN0U3RlcENvbmZpZyk7CisKKwkJLy8gU3RhdHVzCisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFN0YXR1cy5jbGFzcyksICJTdGF0dXMiLCBmYWxzZSkpOworCisJCS8vIFByb2plY3REb21haW4KKwkJZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5yZWdpc3RlcihjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oUHJvamVjdERvbWFpbi5jbGFzcyksICJQcm9qZWN0RG9tYWluIiwgZmFsc2UpKTsKKworCQkvLyBEb21haW4KKwkJZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5yZWdpc3RlcihjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oRG9tYWluLmNsYXNzKSwgIkRvbWFpbiIsIGZhbHNlKSk7CisKKwkJLy8gQ2xhc3NpZmljYXRpb24KKwkJRW50aXR5Q29uZmlnPENsYXNzaWZpY2F0aW9uPiBjbGFzc2lmaWNhdGlvbkNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihDbGFzc2lmaWNhdGlvbi5jbGFzcyksCisJCQkJIkNsYXNzaWZpY2F0aW9uIiwgZmFsc2UpOworCQljbGFzc2lmaWNhdGlvbkNvbmZpZy5hZGRPcHRpb25hbChlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldyBLZXk8PihTdGF0dXMuY2xhc3MpKSk7CisJCWNsYXNzaWZpY2F0aW9uQ29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KFByb2plY3REb21haW4uY2xhc3MpKSk7CisJCWNsYXNzaWZpY2F0aW9uQ29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KERvbWFpbi5jbGFzcykpKTsKKwkJZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5yZWdpc3RlcihjbGFzc2lmaWNhdGlvbkNvbmZpZyk7CisKKwkJLy8gVGVzdFN0ZXAKKwkJRW50aXR5Q29uZmlnPFRlc3RTdGVwPiB0ZXN0U3RlcENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihUZXN0U3RlcC5jbGFzcyksICJUZXN0U3RlcCIsIHRydWUpOworCQkvLyB0ZXN0U3RlcENvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcKKwkJLy8gS2V5PD4oU3RhdHVzLmNsYXNzLCBUZXN0U3RlcC5jbGFzcykpKTsKKwkJdGVzdFN0ZXBDb25maWcuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVGVtcGxhdGVUZXN0U3RlcC5jbGFzcykpKTsKKwkJdGVzdFN0ZXBDb25maWcuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oQ2xhc3NpZmljYXRpb24uY2xhc3MpKSk7CisJCXRlc3RTdGVwQ29uZmlnLnNldENvbXBhcmF0b3IoU29ydGFibGUuQ09NUEFSQVRPUik7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIodGVzdFN0ZXBDb25maWcpOworCisJCS8vIFRlbXBsYXRlVGVzdAorCQlFbnRpdHlDb25maWc8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiB0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLAorCQkJCW5ldyBLZXk8PihUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UuY2xhc3MpLCAiVHBsVGVzdFN0ZXBVc2FnZSIsIHRydWUpOworCQl0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VDb25maWcuYWRkTWFuZGF0b3J5KHRlbXBsYXRlVGVzdFN0ZXBDb25maWcpOworCQl0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VDb25maWcuc2V0Q29tcGFyYXRvcihTb3J0YWJsZS5DT01QQVJBVE9SKTsKKwkJRW50aXR5Q29uZmlnPFRlbXBsYXRlVGVzdD4gdGVtcGxhdGVUZXN0Q29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFRlbXBsYXRlVGVzdC5jbGFzcyksICJUcGxUZXN0IiwKKwkJCQl0cnVlKTsKKwkJdGVtcGxhdGVUZXN0Q29uZmlnLmFkZENoaWxkKHRlbXBsYXRlVGVzdFN0ZXBVc2FnZUNvbmZpZyk7CisJCXRlbXBsYXRlVGVzdENvbmZpZy5zZXRDb21wYXJhdG9yKFZlcnNpb25hYmxlLkNPTVBBUkFUT1IpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKHRlbXBsYXRlVGVzdENvbmZpZyk7CisKKwkJLy8gU3RhdHVzIFRlc3QKKwkJLy8gVE9ETyBjaGVjayBNSU1FIHR5cGUgZ2VucmF0aW9uCisJCS8vIGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY3JlYXRlKG5ldyBLZXk8PihTdGF0dXMuY2xhc3MsCisJCS8vIFRlc3QuY2xhc3MpLCAiU3RhdHVzVGVzdCIsIHRydWUpKTsKKworCQkvLyBUZXN0CisJCUVudGl0eUNvbmZpZzxUZXN0PiB0ZXN0Q29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFRlc3QuY2xhc3MpLCAiVGVzdCIsIHRydWUpOworCQl0ZXN0Q29uZmlnLmFkZE1hbmRhdG9yeShlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldyBLZXk8PihVc2VyLmNsYXNzKSkpOworCQkvLyB0ZXN0Q29uZmlnLmFkZE1hbmRhdG9yeShlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldworCQkvLyBLZXk8PihTdGF0dXMuY2xhc3MsIFRlc3QuY2xhc3MpKSk7CisJCXRlc3RDb25maWcuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVGVtcGxhdGVUZXN0LmNsYXNzKSkpOworCQl0ZXN0Q29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KENsYXNzaWZpY2F0aW9uLmNsYXNzKSkpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKHRlc3RDb25maWcpOworCisJCS8vIENvbnRleHRSb290cworCQlyZWdpc3RlckNvbnRleHRSb290KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVU5JVFVOREVSVEVTVCk7CisJCXJlZ2lzdGVyQ29udGV4dFJvb3QobW9kZWxNYW5hZ2VyLCBDb250ZXh0VHlwZS5URVNUU0VRVUVOQ0UpOworCQlyZWdpc3RlckNvbnRleHRSb290KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCk7CisKKwkJTE9HR0VSLmRlYnVnKCJFbnRpdHkgY29uZmlndXJhdGlvbnMgbG9hZGVkIGluIHt9IG1zLiIsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpOworCQlyZXR1cm4gZW50aXR5Q29uZmlnUmVwb3NpdG9yeTsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ31zIHJlcXVpcmVkIGZvciB7QGxpbmsgQ29udGV4dFJvb3R9IHdpdGggZ2l2ZW4KKwkgKiB7QGxpbmsgQ29udGV4dFR5cGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9LgorCSAqLworCXByaXZhdGUgdm9pZCByZWdpc3RlckNvbnRleHRSb290KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCUVudGl0eUNvbmZpZzxDb250ZXh0Um9vdD4gY29udGV4dFJvb3RDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oQ29udGV4dFJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSwKKwkJCQlPRFNVdGlscy5DT05URVhUVFlQRVMuZ2V0KGNvbnRleHRUeXBlKSwgdHJ1ZSk7CisJCWNvbnRleHRSb290Q29uZmlnLmFkZE1hbmRhdG9yeShlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldyBLZXk8PihUZW1wbGF0ZVJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSkpOworCQlmb3IgKFJlbGF0aW9uIGNvbnRleHRDb21wb25lbnRSZWxhdGlvbiA6IGNvbnRleHRSb290Q29uZmlnLmdldEVudGl0eVR5cGUoKS5nZXRDaGlsZFJlbGF0aW9ucygpKSB7CisJCQlFbnRpdHlUeXBlIGNvbnRleHRDb21wb25lbnRFbnRpdHlUeXBlID0gY29udGV4dENvbXBvbmVudFJlbGF0aW9uLmdldFRhcmdldCgpOworCQkJRW50aXR5Q29uZmlnPENvbnRleHRDb21wb25lbnQ+IGNvbnRleHRDb21wb25lbnRDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLAorCQkJCQluZXcgS2V5PD4oQ29udGV4dENvbXBvbmVudC5jbGFzcywgY29udGV4dFR5cGUpLCBjb250ZXh0Q29tcG9uZW50RW50aXR5VHlwZS5nZXROYW1lKCksIHRydWUpOworCQkJY29udGV4dENvbXBvbmVudENvbmZpZworCQkJCQkuYWRkSW5oZXJpdGVkKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZEltcGxpY2l0KG5ldyBLZXk8PihUZW1wbGF0ZUNvbXBvbmVudC5jbGFzcywgY29udGV4dFR5cGUpKSk7CisJCQljb250ZXh0Um9vdENvbmZpZy5hZGRDaGlsZChjb250ZXh0Q29tcG9uZW50Q29uZmlnKTsKKwkJCWlmIChjb250ZXh0VHlwZS5pc1Rlc3RFcXVpcG1lbnQoKSkgeworCQkJCWZvciAoUmVsYXRpb24gY29udGV4dFNlbnNvclJlbGF0aW9uIDogY29udGV4dENvbXBvbmVudEVudGl0eVR5cGUuZ2V0Q2hpbGRSZWxhdGlvbnMoKSkgeworCQkJCQlFbnRpdHlUeXBlIGNvbnRleHRTZW5zb3JFbnRpdHlUeXBlID0gY29udGV4dFNlbnNvclJlbGF0aW9uLmdldFRhcmdldCgpOworCQkJCQlFbnRpdHlDb25maWc8Q29udGV4dFNlbnNvcj4gY29udGV4dFNlbnNvckNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJCQkJbmV3IEtleTw+KENvbnRleHRTZW5zb3IuY2xhc3MpLCBjb250ZXh0U2Vuc29yRW50aXR5VHlwZS5nZXROYW1lKCksIHRydWUpOworCQkJCQljb250ZXh0U2Vuc29yQ29uZmlnCisJCQkJCQkJLmFkZEluaGVyaXRlZChlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRJbXBsaWNpdChuZXcgS2V5PD4oVGVtcGxhdGVTZW5zb3IuY2xhc3MpKSk7CisJCQkJCWNvbnRleHRDb21wb25lbnRDb25maWcuYWRkQ2hpbGQoY29udGV4dFNlbnNvckNvbmZpZyk7CisJCQkJfQorCQkJfQorCQl9CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY29udGV4dFJvb3RDb25maWcpOworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfXMgcmVxdWlyZWQgZm9yIHtAbGluayBUZW1wbGF0ZVJvb3R9IHdpdGggZ2l2ZW4KKwkgKiB7QGxpbmsgQ29udGV4dFR5cGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9LgorCSAqLworCXByaXZhdGUgdm9pZCByZWdpc3RlclRlbXBsYXRlUm9vdChPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlTdHJpbmcgb2RzTmFtZSA9IE9EU1V0aWxzLkNPTlRFWFRUWVBFUy5nZXQoY29udGV4dFR5cGUpOworCQlFbnRpdHlDb25maWc8VGVtcGxhdGVBdHRyaWJ1dGU+IHRlbXBsYXRlQXR0cmlidXRlQ29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwKKwkJCQluZXcgS2V5PD4oVGVtcGxhdGVBdHRyaWJ1dGUuY2xhc3MsIGNvbnRleHRUeXBlKSwgIlRwbCIgKyBvZHNOYW1lICsgIkF0dHIiLCB0cnVlKTsKKwkJdGVtcGxhdGVBdHRyaWJ1dGVDb25maWcKKwkJCQkuYWRkSW5oZXJpdGVkKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZEltcGxpY2l0KG5ldyBLZXk8PihDYXRhbG9nQXR0cmlidXRlLmNsYXNzLCBjb250ZXh0VHlwZSkpKTsKKwkJdGVtcGxhdGVBdHRyaWJ1dGVDb25maWcuc2V0Q29tcGFyYXRvcihUZW1wbGF0ZUF0dHJpYnV0ZS5DT01QQVJBVE9SKTsKKwkJRW50aXR5Q29uZmlnPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJbmV3IEtleTw+KFRlbXBsYXRlQ29tcG9uZW50LmNsYXNzLCBjb250ZXh0VHlwZSksICJUcGwiICsgb2RzTmFtZSArICJDb21wIiwgdHJ1ZSk7CisJCXRlbXBsYXRlQ29tcG9uZW50Q29uZmlnLmFkZENoaWxkKHRlbXBsYXRlQXR0cmlidXRlQ29uZmlnKTsKKwkJdGVtcGxhdGVDb21wb25lbnRDb25maWcKKwkJCQkuYWRkTWFuZGF0b3J5KGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KENhdGFsb2dDb21wb25lbnQuY2xhc3MsIGNvbnRleHRUeXBlKSkpOworCQl0ZW1wbGF0ZUNvbXBvbmVudENvbmZpZy5hZGRDaGlsZCh0ZW1wbGF0ZUNvbXBvbmVudENvbmZpZyk7CisJCXRlbXBsYXRlQ29tcG9uZW50Q29uZmlnLnNldENvbXBhcmF0b3IoU29ydGFibGUuQ09NUEFSQVRPUik7CisJCWlmIChjb250ZXh0VHlwZS5pc1Rlc3RFcXVpcG1lbnQoKSkgeworCQkJRW50aXR5Q29uZmlnPFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZVNlbnNvckF0dHJpYnV0ZUNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJCW5ldyBLZXk8PihUZW1wbGF0ZUF0dHJpYnV0ZS5jbGFzcyksICJUcGxTZW5zb3JBdHRyIiwgdHJ1ZSk7CisJCQl0ZW1wbGF0ZVNlbnNvckF0dHJpYnV0ZUNvbmZpZy5zZXRDb21wYXJhdG9yKFRlbXBsYXRlQXR0cmlidXRlLkNPTVBBUkFUT1IpOworCQkJdGVtcGxhdGVTZW5zb3JBdHRyaWJ1dGVDb25maWcKKwkJCQkJLmFkZEluaGVyaXRlZChlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRJbXBsaWNpdChuZXcgS2V5PD4oQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcykpKTsKKwkJCUVudGl0eUNvbmZpZzxUZW1wbGF0ZVNlbnNvcj4gdGVtcGxhdGVTZW5zb3JDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oVGVtcGxhdGVTZW5zb3IuY2xhc3MpLAorCQkJCQkiVHBsU2Vuc29yIiwgdHJ1ZSk7CisJCQl0ZW1wbGF0ZVNlbnNvckNvbmZpZy5hZGRDaGlsZCh0ZW1wbGF0ZVNlbnNvckF0dHJpYnV0ZUNvbmZpZyk7CisJCQl0ZW1wbGF0ZVNlbnNvckNvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oUXVhbnRpdHkuY2xhc3MpKSk7CisJCQl0ZW1wbGF0ZVNlbnNvckNvbmZpZy5hZGRJbmhlcml0ZWQoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kSW1wbGljaXQobmV3IEtleTw+KENhdGFsb2dTZW5zb3IuY2xhc3MpKSk7CisJCQl0ZW1wbGF0ZVNlbnNvckNvbmZpZy5zZXRDb21wYXJhdG9yKFNvcnRhYmxlLkNPTVBBUkFUT1IpOworCQkJdGVtcGxhdGVDb21wb25lbnRDb25maWcuYWRkQ2hpbGQodGVtcGxhdGVTZW5zb3JDb25maWcpOworCQl9CisJCUVudGl0eUNvbmZpZzxUZW1wbGF0ZVJvb3Q+IHRlbXBsYXRlUm9vdENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihUZW1wbGF0ZVJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSwKKwkJCQkiVHBsIiArIG9kc05hbWUgKyAiUm9vdCIsIHRydWUpOworCQl0ZW1wbGF0ZVJvb3RDb25maWcuYWRkQ2hpbGQodGVtcGxhdGVDb21wb25lbnRDb25maWcpOworCQl0ZW1wbGF0ZVJvb3RDb25maWcuc2V0Q29tcGFyYXRvcihWZXJzaW9uYWJsZS5DT01QQVJBVE9SKTsKKwkJZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5yZWdpc3Rlcih0ZW1wbGF0ZVJvb3RDb25maWcpOworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfXMgcmVxdWlyZWQgZm9yIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSB3aXRoCisJICogZ2l2ZW4ge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBUaGUge0Bjb2RlIENvbnRleHRUeXBlfS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJDYXRhbG9nQ29tcG9uZW50KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCVN0cmluZyBvZHNOYW1lID0gT0RTVXRpbHMuQ09OVEVYVFRZUEVTLmdldChjb250ZXh0VHlwZSk7CisJCUVudGl0eUNvbmZpZzxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlQ29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwKKwkJCQluZXcgS2V5PD4oQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcywgY29udGV4dFR5cGUpLCAiQ2F0IiArIG9kc05hbWUgKyAiQXR0ciIsIHRydWUpOworCQljYXRhbG9nQXR0cmlidXRlQ29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KFZhbHVlTGlzdC5jbGFzcykpKTsKKwkJY2F0YWxvZ0F0dHJpYnV0ZUNvbmZpZy5zZXRDb21wYXJhdG9yKFNvcnRhYmxlLkNPTVBBUkFUT1IpOworCQlFbnRpdHlDb25maWc8Q2F0YWxvZ0NvbXBvbmVudD4gY2F0YWxvZ0NvbXBvbmVudENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJbmV3IEtleTw+KENhdGFsb2dDb21wb25lbnQuY2xhc3MsIGNvbnRleHRUeXBlKSwgIkNhdCIgKyBvZHNOYW1lICsgIkNvbXAiLCB0cnVlKTsKKwkJY2F0YWxvZ0NvbXBvbmVudENvbmZpZy5hZGRDaGlsZChjYXRhbG9nQXR0cmlidXRlQ29uZmlnKTsKKwkJaWYgKGNvbnRleHRUeXBlLmlzVGVzdEVxdWlwbWVudCgpKSB7CisJCQlFbnRpdHlDb25maWc8Q2F0YWxvZ0F0dHJpYnV0ZT4gY2F0YWxvZ1NlbnNvckF0dHJpYnV0ZUNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJCW5ldyBLZXk8PihDYXRhbG9nQXR0cmlidXRlLmNsYXNzKSwgIkNhdFNlbnNvckF0dHIiLCB0cnVlKTsKKwkJCWNhdGFsb2dTZW5zb3JBdHRyaWJ1dGVDb25maWcuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVmFsdWVMaXN0LmNsYXNzKSkpOworCQkJRW50aXR5Q29uZmlnPENhdGFsb2dTZW5zb3I+IGNhdGFsb2dTZW5zb3JDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oQ2F0YWxvZ1NlbnNvci5jbGFzcyksCisJCQkJCSJDYXRTZW5zb3IiLCB0cnVlKTsKKwkJCWNhdGFsb2dTZW5zb3JDb25maWcuYWRkQ2hpbGQoY2F0YWxvZ1NlbnNvckF0dHJpYnV0ZUNvbmZpZyk7CisJCQljYXRhbG9nQ29tcG9uZW50Q29uZmlnLmFkZENoaWxkKGNhdGFsb2dTZW5zb3JDb25maWcpOworCQl9CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY2F0YWxvZ0NvbXBvbmVudENvbmZpZyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRW50aXR5Q29uZmlnfS4KKwkgKgorCSAqIEBwYXJhbSAgICAgICAgICAgIDxUPiBUaGUgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGtleSAgICAgICAgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSB0eXBlTmFtZSAgIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBhcHBlbmROYW1lIEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gYXBwZW5kIHRoZSBlbnRpdHkgdHlwZXMgYmFzZSBuYW1lCisJICogICAgICAgICAgICAgICAgICAgdG8gdGhlIE1JTUUgdHlwZS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gRW50aXR5Q29uZmlnPFQ+IGNyZWF0ZShPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBLZXk8VD4ga2V5LCBTdHJpbmcgdHlwZU5hbWUsCisJCQlib29sZWFuIGFwcGVuZE5hbWUpIHsKKwkJRW50aXR5Q29uZmlnPFQ+IGVudGl0eUNvbmZpZyA9IG5ldyBFbnRpdHlDb25maWc8PihrZXkpOworCQlPRFNFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSAoT0RTRW50aXR5VHlwZSkgbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUodHlwZU5hbWUpOworCQllbnRpdHlDb25maWcuc2V0RW50aXR5VHlwZShlbnRpdHlUeXBlKTsKKwkJZW50aXR5Q29uZmlnLnNldE1pbWVUeXBlKGJ1aWxkRGVmYXVsdE1pbWVUeXBlKGVudGl0eVR5cGUsIGFwcGVuZE5hbWUpKTsKKwkJcmV0dXJuIGVudGl0eUNvbmZpZzsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgZGVmYXVsdCBNSU1FIHR5cGUgZm9yIGdpdmVuIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIGFwcGVuZE5hbWUgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byBhcHBlbmQgdGhlIGVudGl0eSB0eXBlcyBiYXNlIG5hbWUKKwkgKiAgICAgICAgICAgICAgICAgICB0byB0aGUgTUlNRSB0eXBlLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgTUlNRSB0eXBlIHtAY29kZSBTdHJpbmd9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdE1pbWVUeXBlKE9EU0VudGl0eVR5cGUgZW50aXR5VHlwZSwgYm9vbGVhbiBhcHBlbmROYW1lKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlzYi5hcHBlbmQoImFwcGxpY2F0aW9uL3gtYXNhbS4iKTsKKwkJc2IuYXBwZW5kKGVudGl0eVR5cGUuZ2V0QmFzZU5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCkpOworCQlpZiAoYXBwZW5kTmFtZSkgeworCQkJc2IuYXBwZW5kKCcuJykuYXBwZW5kKGVudGl0eVR5cGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKSk7CisJCX0KKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvY29uZmlnL0VudGl0eUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9jb25maWcvRW50aXR5Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjMjZmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvY29uZmlnL0VudGl0eUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlN0YXR1c0F0dGFjaGFibGU7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBjb21wb3NpdGlvbiBvZiBhbiB7QGxpbmsgRW50aXR5fSB3aXRoIGl0cyBtYW5kYXRvcnksIG9wdGlvbmFsCisgKiBhbmQgY2hpbGQgcmVsYXRpb25zLgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlDb25maWc8VCBleHRlbmRzIEVudGl0eT4geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgTGlzdDxFbnRpdHlDb25maWc8PyBleHRlbmRzIERlbGV0YWJsZT4+IGNoaWxkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJcHJpdmF0ZSBmaW5hbCBMaXN0PEVudGl0eUNvbmZpZzw/Pj4gaW5oZXJpdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8PigpOworCXByaXZhdGUgZmluYWwgTGlzdDxFbnRpdHlDb25maWc8Pz4+IG1hbmRhdG9yeUNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8RW50aXR5Q29uZmlnPD8+PiBvcHRpb25hbENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCXByaXZhdGUgQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGNvbXBhcmF0b3IgPSBFbnRpdHkuQ09NUEFSQVRPUjsKKworCXByaXZhdGUgZmluYWwgS2V5PFQ+IGtleTsKKworCXByaXZhdGUgRW50aXR5VHlwZSBlbnRpdHlUeXBlOworCisJcHJpdmF0ZSBib29sZWFuIHJlZmxleGl2ZTsKKwlwcml2YXRlIFN0cmluZyBtaW1lVHlwZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBrZXkgVGhlIHtAbGluayBLZXl9IHRoaXMgZW50aXR5IGNvbmZpZyBpcyBib3VuZCB0by4KKwkgKi8KKwlwdWJsaWMgRW50aXR5Q29uZmlnKEtleTxUPiBrZXkpIHsKKwkJdGhpcy5rZXkgPSBrZXk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEtleX0gdGhpcyBlbnRpdHkgY29uZmlnIGlzIGJvdW5kIHRvLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEtleX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEtleTxUPiBnZXRLZXkoKSB7CisJCXJldHVybiBrZXk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eX0gY2xhc3MuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgRW50aXR5fSBjbGFzcyBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ2xhc3M8VD4gZ2V0RW50aXR5Q2xhc3MoKSB7CisJCXJldHVybiBrZXkuZW50aXR5Q2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFN0YXR1c0F0dGFjaGFibGV9IGNsYXNzLgorCSAqCisJICogQHJldHVybiBPcHRpb25hbCBpcyBlbXB0eSBpZiB7QGNvZGUgU3RhdHVzQXR0YWNoYWJsZX0gaXMgdW5kZWZpbmVkLgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxDbGFzczw/IGV4dGVuZHMgU3RhdHVzQXR0YWNoYWJsZT4+IGdldFN0YXR1c0F0dGFjaGFibGVDbGFzcygpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoa2V5LnN0YXR1c0F0dGFjaGFibGVDbGFzcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEByZXR1cm4gT3B0aW9uYWwgaXMgZW1wdHkge0Bjb2RlIENvbnRleHRUeXBlfSBpcyB1bmRlZmluZWQuCisJICovCisJcHVibGljIE9wdGlvbmFsPENvbnRleHRUeXBlPiBnZXRDb250ZXh0VHlwZSgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoa2V5LmNvbnRleHRUeXBlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29tcGFyYXRvcn0gZm9yIHtAbGluayBFbnRpdHl9cyBhc3NvY2lhdGVkIHdpdGggdGhpcworCSAqIGVudGl0eSBjb25maWcuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ29tcGFyYXRvcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENvbXBhcmF0b3I8PyBzdXBlciBUPiBnZXRDb21wYXJhdG9yKCkgeworCQlyZXR1cm4gY29tcGFyYXRvcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5VHlwZX0gb2YgdGhpcyBlbnRpdHkgY29uZmlnLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEVudGl0eVR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoKSB7CisJCXJldHVybiBlbnRpdHlUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgTUlNRSB0eXBlIGZvciBhIG5ld2x5IGNyZWF0ZWQge0BsaW5rIEVudGl0eX0gYXNzb2NpYXRlZAorCSAqIHdpdGggdGhpcyBlbnRpdHkgY29uZmlnLgorCSAqCisJICogQHJldHVybiBUaGUgZGVmYXVsdCBNSU1FIHR5cGUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKwkJcmV0dXJuIG1pbWVUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIHJlbGF0ZWQgY2hpbGQgY29uZmlncy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8RW50aXR5Q29uZmlnPD8gZXh0ZW5kcyBEZWxldGFibGU+PiBnZXRDaGlsZENvbmZpZ3MoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGNoaWxkQ29uZmlncyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgcmVsYXRlZCBpbmhlcml0ZWQgY29uZmlncy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8RW50aXR5Q29uZmlnPD8+PiBnZXRJbmhlcml0ZWRDb25maWdzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChpbmhlcml0ZWRDb25maWdzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCByZWxhdGVkIG1hbmRhdG9yeSBjb25maWdzLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxFbnRpdHlDb25maWc8Pz4+IGdldE1hbmRhdG9yeUNvbmZpZ3MoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1hbmRhdG9yeUNvbmZpZ3MpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIHJlbGF0ZWQgb3B0aW9uYWwgY29uZmlncy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8RW50aXR5Q29uZmlnPD8+PiBnZXRPcHRpb25hbENvbmZpZ3MoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG9wdGlvbmFsQ29uZmlncyk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIge0BsaW5rIEVudGl0eX1zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudGl0eSBjb25maWcgbWF5IGhhdmUKKwkgKiBjaGlsZHJlbiBvZiB0aGUgc2FtZSB0eXBlLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGVudGl0eSBjb25maWcgaXMgcmVmbGV4aXZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVmbGV4aXZlKCkgeworCQlyZXR1cm4gcmVmbGV4aXZlOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcge0BsaW5rIENvbXBhcmF0b3J9IGZvciB0aGlzIGVudGl0eSBjb25maWcuCisJICoKKwkgKiBAcGFyYW0gY29tcGFyYXRvciBUaGUgbmV3IHtAY29kZSBDb21wYXJhdG9yfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb21wYXJhdG9yKENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CisJCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUge0BsaW5rIEVudGl0eVR5cGV9IGZvciB0aGlzIGVudGl0eSBjb25maWcuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgRW50aXR5VHlwZX0gaXMgYWxyZWFkeQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0RW50aXR5VHlwZShFbnRpdHlUeXBlIGVudGl0eVR5cGUpIHsKKwkJaWYgKHRoaXMuZW50aXR5VHlwZSAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdCBpcyBub3QgYWxsb3dlZCB0byBvdmVycmlkZSB0aGUgZW50aXR5IHR5cGUuIik7CisJCX0KKworCQl0aGlzLmVudGl0eVR5cGUgPSBlbnRpdHlUeXBlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGRlZmF1bHQgTUlNRSB0eXBlIGZvciBuZXdseSBjcmVhdGVkIHtAbGluayBFbnRpdHl9cyBhc3NvY2lhdGVkIHdpdGgKKwkgKiB0aGlzIGVudGl0eSBjb25maWcuCisJICoKKwkgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlZmF1bHQgTUlNRSB0eXBlLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiBkZWZhdWx0IE1JTUUgdHlwZSBpcyBhbHJlYWR5IGRlZmluZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisJCWlmICh0aGlzLm1pbWVUeXBlICE9IG51bGwgJiYgIXRoaXMubWltZVR5cGUuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdCBpcyBub3QgYWxsb3dlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBNSU1FIHR5cGUuIik7CisJCX0KKworCQl0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7CisJfQorCisJLyoqCisJICogQWRkcyBhIHJlbGF0ZWQgaW5oZXJpdGVkIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNvbmZpZyBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIHZvaWQgYWRkSW5oZXJpdGVkKEVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcpIHsKKwkJaW5oZXJpdGVkQ29uZmlncy5hZGQoZW50aXR5Q29uZmlnKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgcmVsYXRlZCBtYW5kYXRvcnkge0BsaW5rIEVudGl0eUNvbmZpZ30uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlnIFRoZSB7QGNvZGUgRW50aXR5Q29uZmlnfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRNYW5kYXRvcnkoRW50aXR5Q29uZmlnPD8+IGVudGl0eUNvbmZpZykgeworCQltYW5kYXRvcnlDb25maWdzLmFkZChlbnRpdHlDb25maWcpOworCX0KKworCS8qKgorCSAqIEFkZHMgYSByZWxhdGVkIG9wdGlvbmFsIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNvbmZpZyBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIHZvaWQgYWRkT3B0aW9uYWwoRW50aXR5Q29uZmlnPD8+IGVudGl0eUNvbmZpZykgeworCQlvcHRpb25hbENvbmZpZ3MuYWRkKGVudGl0eUNvbmZpZyk7CisJfQorCisJLyoqCisJICogQWRkcyBhIHJlbGF0ZWQgY2hpbGQge0BsaW5rIEVudGl0eUNvbmZpZ30uCisJICoKKwkgKiBAcGFyYW0gY2hpbGRDb25maWcgVGhlIHtAY29kZSBFbnRpdHlDb25maWd9LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoaWxkKEVudGl0eUNvbmZpZzw/IGV4dGVuZHMgRGVsZXRhYmxlPiBjaGlsZENvbmZpZykgeworCQlpZiAodGhpcyA9PSBjaGlsZENvbmZpZykgeworCQkJcmVmbGV4aXZlID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWNoaWxkQ29uZmlncy5hZGQoY2hpbGRDb25maWcpOworCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIElubmVyIGNsYXNzZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBVc2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIHtAbGluayBFbnRpdHlDb25maWd9cy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgS2V5PFQgZXh0ZW5kcyBFbnRpdHk+IHsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJZmluYWwgQ2xhc3M8PyBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+IHN0YXR1c0F0dGFjaGFibGVDbGFzczsKKwkJZmluYWwgQ2xhc3M8VD4gZW50aXR5Q2xhc3M7CisJCWZpbmFsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlOworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ29uc3RydWN0b3JzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUaGUge0BsaW5rIEVudGl0eX0gY2xhc3MuCisJCSAqLworCQlwdWJsaWMgS2V5KENsYXNzPFQ+IGVudGl0eUNsYXNzKSB7CisJCQl0aGlzLmVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3M7CisJCQlzdGF0dXNBdHRhY2hhYmxlQ2xhc3MgPSBudWxsOworCQkJY29udGV4dFR5cGUgPSBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yLgorCQkgKgorCQkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgICAgICAgICAgIFRoZSB7QGxpbmsgRW50aXR5fSBjbGFzcy4KKwkJICogQHBhcmFtIHN0YXR1c0F0dGFjaGFibGVDbGFzcyBUaGUge0BsaW5rIFN0YXR1c0F0dGFjaGFibGV9IGNsYXNzLgorCQkgKi8KKwkJcHVibGljIEtleShDbGFzczxUPiBlbnRpdHlDbGFzcywgQ2xhc3M8PyBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+IHN0YXR1c0F0dGFjaGFibGVDbGFzcykgeworCQkJdGhpcy5zdGF0dXNBdHRhY2hhYmxlQ2xhc3MgPSBzdGF0dXNBdHRhY2hhYmxlQ2xhc3M7CisJCQl0aGlzLmVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3M7CisJCQljb250ZXh0VHlwZSA9IG51bGw7CisJCX0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUaGUge0BsaW5rIEVudGl0eX0gY2xhc3MuCisJCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBUaGUge0BsaW5rIENvbnRleHRUeXBlfS4KKwkJICovCisJCXB1YmxpYyBLZXkoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCQl0aGlzLmVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3M7CisJCQl0aGlzLmNvbnRleHRUeXBlID0gY29udGV4dFR5cGU7CisJCQlzdGF0dXNBdHRhY2hhYmxlQ2xhc3MgPSBudWxsOworCQl9CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBQdWJsaWMgbWV0aG9kcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQkJcmV0dXJuIE9iamVjdHMuaGFzaChlbnRpdHlDbGFzcywgc3RhdHVzQXR0YWNoYWJsZUNsYXNzLCBjb250ZXh0VHlwZSk7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCQkvLyByZWZlcmVuY2UgY2hlY2sgKHRoaXMgPT0gb2JqZWN0KSBvbWl0dGVkCisJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgS2V5KSB7CisJCQkJS2V5PD8+IG90aGVyID0gKEtleTw/Pikgb2JqZWN0OworCQkJCXJldHVybiBPYmplY3RzLmVxdWFscyhlbnRpdHlDbGFzcywgb3RoZXIuZW50aXR5Q2xhc3MpCisJCQkJCQkmJiBPYmplY3RzLmVxdWFscyhzdGF0dXNBdHRhY2hhYmxlQ2xhc3MsIG90aGVyLnN0YXR1c0F0dGFjaGFibGVDbGFzcykKKwkJCQkJCSYmIE9iamVjdHMuZXF1YWxzKGNvbnRleHRUeXBlLCBvdGhlci5jb250ZXh0VHlwZSk7CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihlbnRpdHlDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworCisJCQlpZiAoc3RhdHVzQXR0YWNoYWJsZUNsYXNzICE9IG51bGwpIHsKKwkJCQlzYi5hcHBlbmQoJ18nKS5hcHBlbmQoc3RhdHVzQXR0YWNoYWJsZUNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisJCQl9CisKKwkJCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7CisJCQkJc2IuYXBwZW5kKCdfJykuYXBwZW5kKGNvbnRleHRUeXBlKTsKKwkJCX0KKworCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9jb25maWcvRW50aXR5Q29uZmlnUmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9jb25maWcvRW50aXR5Q29uZmlnUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGJlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL2NvbmZpZy9FbnRpdHlDb25maWdSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworCisvKioKKyAqIFJlcG9zaXRvcnkgZm9yIHtAbGluayBFbnRpdHlDb25maWd9cy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vIHJvb3QgdHlwZXMKKwlwcml2YXRlIGZpbmFsIE1hcDxLZXk8Pz4sIEVudGl0eUNvbmZpZzw/Pj4gZW50aXR5Q29uZmlncyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCS8vIGNoaWxkIHR5cGVzIChpbXBsaWNpdCBsb2FkIG9ubHkhKQorCXByaXZhdGUgZmluYWwgTWFwPEtleTw/PiwgRW50aXR5Q29uZmlnPD8+PiBjaGlsZENvbmZpZ3MgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFbnRpdHlDb25maWc8Pz4+IGNvbnRleHRDb25maWdzID0gbmV3IEhhc2hNYXA8PigpOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ30gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBLZXl9LiBUaGlzCisJICogbWV0aG9kIHRyaWVzIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQge0Bjb2RlIEVudGl0eUNvbmZpZ30gaW4gdGhlIHJvb3QKKwkgKiBjb25maWd1cmF0aW9ucy4gSWYgaXQgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGVuIGl0IHRyaWVzIHRvIGZpbmQgaXQgaW4gdGhlCisJICogY2hpbGQge0Bjb2RlIEVudGl0eUNvbmZpZ31zLgorCSAqCisJICogQHBhcmFtIDxUPiBUaGUgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGtleSBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBmaW5kIGFzc29jaWF0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgRW50aXR5Q29uZmlnfS4KKwkgKi8KKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IEVudGl0eUNvbmZpZzxUPiBmaW5kKEtleTxUPiBrZXkpIHsKKwkJT3B0aW9uYWw8RW50aXR5Q29uZmlnPFQ+PiBlbnRpdHlDb25maWcgPSBnZXQoZW50aXR5Q29uZmlncywga2V5KTsKKwkJaWYgKGVudGl0eUNvbmZpZy5pc1ByZXNlbnQoKSkgeworCQkJcmV0dXJuIGVudGl0eUNvbmZpZy5nZXQoKTsKKwkJfQorCisJCXJldHVybiBnZXQoY2hpbGRDb25maWdzLCBrZXkpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVudGl0eSBjb25maWd1cmF0aW9uIG5vdCBmb3VuZC4iKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ30gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBLZXl9LiBUaGlzCisJICogbWV0aG9kIHRyaWVzIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQge0Bjb2RlIEVudGl0eUNvbmZpZ30gaW4gdGhlIHJvb3QKKwkgKiBjb25maWd1cmF0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gZmluZCBhc3NvY2lhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBFbnRpdHlDb25maWc8VD4gZmluZFJvb3QoS2V5PFQ+IGtleSkgeworCQlyZXR1cm4gZ2V0KGVudGl0eUNvbmZpZ3MsIGtleSkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW50aXR5IGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kLiIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEtleX0uIFRoaXMKKwkgKiBtZXRob2QgdHJpZXMgdG8gZmluZCB0aGUgYXNzb2NpYXRlZCB7QGNvZGUgRW50aXR5Q29uZmlnfSBpbiB0aGUgY2hpbGQKKwkgKiBjb25maWd1cmF0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gZmluZCBhc3NvY2lhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBFbnRpdHlDb25maWc8VD4gZmluZEltcGxpY2l0KEtleTxUPiBrZXkpIHsKKwkJcmV0dXJuIGdldChjaGlsZENvbmZpZ3MsIGtleSkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW50aXR5IGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kLiIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgSXRzIG5hbWUgaXMgdXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gZmluZCBhc3NvY2lhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIEVudGl0eUNvbmZpZzw/PiBmaW5kKEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQlPcHRpb25hbDxFbnRpdHlDb25maWc8Pz4+IGVudGl0eUNvbmZpZyA9IGVudGl0eUNvbmZpZ3MudmFsdWVzKCkuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKGVjIC0+IGVjLmdldEVudGl0eVR5cGUoKS5lcXVhbHMoZW50aXR5VHlwZSkpLmZpbmRGaXJzdCgpOworCQlpZiAoZW50aXR5Q29uZmlnLmlzUHJlc2VudCgpKSB7CisJCQkvLyBlbnRpdHkgY29uZmlnIGlzIGEgcm9vdCB0eXBlCisJCQlyZXR1cm4gZW50aXR5Q29uZmlnLmdldCgpOworCQl9CisKKwkJZW50aXR5Q29uZmlnID0gY2hpbGRDb25maWdzLnZhbHVlcygpLnN0cmVhbSgpLmZpbHRlcihlYyAtPiBlYy5nZXRFbnRpdHlUeXBlKCkuZXF1YWxzKGVudGl0eVR5cGUpKS5maW5kRmlyc3QoKTsKKwkJaWYgKGVudGl0eUNvbmZpZy5pc1ByZXNlbnQoKSkgeworCQkJLy8gZW50aXR5IGNvbmZpZyBpcyBhbiBpbXBsaWNpdGx5IGxvYWRlZCBjaGlsZCB0eXBlCisJCQlyZXR1cm4gZW50aXR5Q29uZmlnLmdldCgpOworCQl9CisKKwkJRW50aXR5Q29uZmlnPD8+IGNvbmZpZyA9IGNvbnRleHRDb25maWdzLmdldChlbnRpdHlUeXBlLmdldE5hbWUoKSk7CisJCWlmIChjb25maWcgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW50aXR5IGNvbmZpZ3VyYXRpb24gZm9yIHR5cGUgJyIgKyBlbnRpdHlUeXBlICsgIicgbm90IGZvdW5kLiIpOworCQl9CisKKwkJLy8gY29uZmlnIGlzIGVpdGhlciBhIGNvbnRleHQgY29tcG9uZW50IG9yIGNvbnRleHQgc2Vuc29yIHR5cGUKKwkJcmV0dXJuIGNvbmZpZzsKKwl9CisKKwkvKioKKwkgKiBTdG9yZXMgZ2l2ZW4ge0BsaW5rIEVudGl0eUNvbmZpZ30gaW4gdGhpcyByZXBvc2l0b3J5LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNvbmZpZyBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGFuIGF0dGVtcHQgdG8gb3ZlcndyaXRlIGFuCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmVjb3JkZWQuCisJICovCisJcHVibGljIHZvaWQgcmVnaXN0ZXIoRW50aXR5Q29uZmlnPD8+IGVudGl0eUNvbmZpZykgeworCQlyZWdpc3RlckNoaWxkQ29uZmlncyhlbnRpdHlDb25maWcpOworCisJCUVudGl0eUNvbmZpZzw/PiBjdXJyZW50QnlDbGFzcyA9IGVudGl0eUNvbmZpZ3MucHV0KGVudGl0eUNvbmZpZy5nZXRLZXkoKSwgZW50aXR5Q29uZmlnKTsKKwkJaWYgKGN1cnJlbnRCeUNsYXNzICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkl0IGlzIG5vdCBhbGxvd2VkIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBjb25maWd1cmF0aW9ucy4iKTsKKwkJfQorCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZWN1cnNpdmVseSByZWdpc3RlcnMgYWxsIGNoaWxkIGNvbmZpZ3VyYXRpb25zIG9mIGdpdmVuIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNvbmZpZyBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGFuIGF0dGVtcHQgdG8gb3ZlcndyaXRlIGFuCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmVjb3JkZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQ2hpbGRDb25maWdzKEVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcpIHsKKwkJQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MgPSBlbnRpdHlDb25maWcuZ2V0RW50aXR5Q2xhc3MoKTsKKwkJaWYgKENvbnRleHRSb290LmNsYXNzLmVxdWFscyhlbnRpdHlDbGFzcykgfHwgQ29udGV4dENvbXBvbmVudC5jbGFzcy5lcXVhbHMoZW50aXR5Q2xhc3MpKSB7CisJCQlmb3IgKEVudGl0eUNvbmZpZzw/PiBjaGlsZENvbmZpZyA6IGVudGl0eUNvbmZpZy5nZXRDaGlsZENvbmZpZ3MoKSkgeworCQkJCWlmIChjb250ZXh0Q29uZmlncy5wdXQoY2hpbGRDb25maWcuZ2V0RW50aXR5VHlwZSgpLmdldE5hbWUoKSwgY2hpbGRDb25maWcpICE9IG51bGwpIHsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSXQgaXMgbm90IGFsbG93ZWQgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb25zLiIpOworCQkJCX0KKworCQkJCXJlZ2lzdGVyQ2hpbGRDb25maWdzKGNoaWxkQ29uZmlnKTsKKwkJCX0KKworCQkJcmV0dXJuOworCQl9CisJCWZvciAoRW50aXR5Q29uZmlnPD8+IGNoaWxkQ29uZmlnIDogZW50aXR5Q29uZmlnLmdldENoaWxkQ29uZmlncygpKSB7CisJCQlpZiAoY2hpbGRDb25maWdzLnB1dChjaGlsZENvbmZpZy5nZXRLZXkoKSwgY2hpbGRDb25maWcpICE9IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJdCBpcyBub3QgYWxsb3dlZCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlndXJhdGlvbnMuIik7CisJCQl9CisKKwkJCXJlZ2lzdGVyQ2hpbGRDb25maWdzKGNoaWxkQ29uZmlnKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ30gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBLZXl9IGZyb20KKwkgKiBnaXZlbiB7QGNvZGUgTWFwfS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICAgIFRoZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlncyBVc2VkIHRvIHJldHJpZXZlIHJlcXVlc3RlZCB7QGNvZGUgRW50aXR5Q29uZmlnfS4KKwkgKiBAcGFyYW0ga2V5ICAgICAgICAgICBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHtAY29kZSBFbnRpdHlDb25maWd9IG5vdCBmb3VuZC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIEVudGl0eT4gT3B0aW9uYWw8RW50aXR5Q29uZmlnPFQ+PiBnZXQoTWFwPEtleTw/PiwgRW50aXR5Q29uZmlnPD8+PiBlbnRpdHlDb25maWdzLAorCQkJS2V5PFQ+IGtleSkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZSgoRW50aXR5Q29uZmlnPFQ+KSBlbnRpdHlDb25maWdzLmdldChrZXkpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL2NvbmZpZy9FbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL2NvbmZpZy9FbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmNDUzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvY29uZmlnL0VudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworCitwdWJsaWMgaW50ZXJmYWNlIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIgeworCisJLyoqCisJICogTG9hZHMgdGhlIHtAbGluayBFbnRpdHlDb25maWdSZXBvc2l0b3J5fS4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJRW50aXR5Q29uZmlnUmVwb3NpdG9yeSBsb2FkRW50aXR5Q29uZmlndXJhdGlvbnMoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcik7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbkVudGl0eUxvYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FbnRpdHlMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg2ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FbnRpdHlMb2FkZXIuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Q29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0RGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQ29tcGFyaXNvbk9wZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkpvaW5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnLktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25FbnRpdHlMb2FkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5vdGlmaWNhdGlvbkVudGl0eUxvYWRlci5jbGFzcyk7CisKKwlwcml2YXRlIGZpbmFsIE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXI7CisJcHJpdmF0ZSBmaW5hbCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlOworCXByaXZhdGUgZmluYWwgRW50aXR5TG9hZGVyIGxvYWRlcjsKKworCXByaXZhdGUgYm9vbGVhbiBsb2FkQ29udGV4dERlc2NyaWJhYmxlOworCisJcHVibGljIE5vdGlmaWNhdGlvbkVudGl0eUxvYWRlcihPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLAorCQkJYm9vbGVhbiBsb2FkQ29udGV4dERlc2NyaWJhYmxlKSB7CisJCXRoaXMubW9kZWxNYW5hZ2VyID0gbW9kZWxNYW5hZ2VyOworCQl0aGlzLnF1ZXJ5U2VydmljZSA9IHF1ZXJ5U2VydmljZTsKKwkJdGhpcy5sb2FkZXIgPSBuZXcgRW50aXR5TG9hZGVyKG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlKTsKKwkJdGhpcy5sb2FkQ29udGV4dERlc2NyaWJhYmxlID0gbG9hZENvbnRleHREZXNjcmliYWJsZTsKKwl9CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IFQgbG9hZChLZXk8VD4ga2V5LCBTdHJpbmcgdXNlcklkKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBsb2FkZXIubG9hZChrZXksIHVzZXJJZCk7CisJfQorCisJcHVibGljIExpc3Q8PyBleHRlbmRzIEVudGl0eT4gbG9hZEVudGl0aWVzKFN0cmluZyBhaWQsIExpc3Q8U3RyaW5nPiBpZHMpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvYWRFbnRpdGllcyhtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShhaWQpLCBpZHMpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIGVudGl0eSB0eXBlIG9mIHRoZSBlbnRpdGllcyB0byBsb2FkLgorCSAqIEBwYXJhbSBpZHMgICAgICAgIElEcyBvZiB0aGUgZW50aXRpZXMgdG8gbG9hZC4KKwkgKiBAcmV0dXJuIGxvYWRlZCBlbnRpdGllcy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3cgaWYgdGhlIGVudGl0aWVzIGNhbm5vdCBiZSBsb2FkZWQuCisJICovCisJcHVibGljIExpc3Q8PyBleHRlbmRzIEVudGl0eT4gbG9hZEVudGl0aWVzKEVudGl0eVR5cGUgZW50aXR5VHlwZSwgTGlzdDxTdHJpbmc+IGlkcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCisJCWlmIChpZHMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCX0KKworCQlFbnRpdHlDb25maWc8Pz4gY29uZmlnID0gZ2V0RW50aXR5Q29uZmlnKGVudGl0eVR5cGUpOworCisJCWlmIChjb25maWcgPT0gbnVsbCB8fCBpc0xvYWRDb250ZXh0RGVzY3JpYmFibGUoY29uZmlnKSkgeworCQkJLy8gZW50aXR5VHlwZSBub3QgbW9kZWxsZWQgaW4gTURNLCB0cnkgdG8gbG9hZCBpdHMKKwkJCS8vIENvbnRleHREZXNjcmliYWJsZSBpZiBpdCBpcyBhIENvbnRleHRSb290L0NvbnRleHRDb21wb25lbnQKKwkJCWZpbmFsIEVudGl0eVR5cGUgdGVzdFN0ZXAgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShUZXN0U3RlcC5jbGFzcyk7CisJCQlmaW5hbCBFbnRpdHlUeXBlIG1lYXN1cmVtZW50ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoTWVhc3VyZW1lbnQuY2xhc3MpOworCisJCQlpZiAoaGFzUmVsYXRpb25UbyhlbnRpdHlUeXBlLCB0ZXN0U3RlcCwgbWVhc3VyZW1lbnQpKSB7CisJCQkJcmV0dXJuIGxvYWRFbnRpdHlGb3JDb250ZXh0Um9vdChlbnRpdHlUeXBlLCBpZHMpOworCQkJfSBlbHNlIGlmIChoYXNSZWxhdGlvblRvKGVudGl0eVR5cGUsIG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKCJVbml0VW5kZXJUZXN0IiksCisJCQkJCW1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKCJUZXN0U2VxdWVuY2UiKSwgbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoIlRlc3RFcXVpcG1lbnQiKSkpIHsKKwkJCQlyZXR1cm4gbG9hZEVudGl0eUZvckNvbnRleHRDb21wb25lbnQoZW50aXR5VHlwZSwgaWRzKTsKKwkJCX0gZWxzZSB7CisJCQkJTE9HR0VSLmRlYnVnKCJDYW5ub3QgbG9hZCBlbnRpdGlzIGZvciBlbnRpdHlUeXBlICIgKyBlbnRpdHlUeXBlICsgIiBhbmQgaWRzICIgKyBpZHMpOworCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBsb2FkZXIubG9hZEFsbChjb25maWcuZ2V0S2V5KCksIGlkcyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgQ29udGV4dERlc2NyaWJhYmxlcyB0byB0aGUgZ2l2ZW4gY29udGV4dCByb290IGluc3RhbmNlcworCSAqIAorCSAqIEBwYXJhbSBjb250ZXh0Um9vdCBlbnRpdHlUeXBlIG9mIHRoZSBjb250ZXh0IHJvb3QKKwkgKiBAcGFyYW0gaWRzICAgICAgICAgSURzIG9mIHRoZSBjb250ZXh0IHJvb3RzLgorCSAqIEByZXR1cm4gdGhlIGxvYWRlZCBDb250ZXh0RGVzY3JpYmFibGVzCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93IGlmIHRoZSBDb250ZXh0RGVzY3JpYmFibGVzIGNhbm5vdCBiZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuCisJICovCisJcHJpdmF0ZSBMaXN0PENvbnRleHREZXNjcmliYWJsZT4gbG9hZEVudGl0eUZvckNvbnRleHRSb290KEVudGl0eVR5cGUgY29udGV4dFJvb3QsIExpc3Q8U3RyaW5nPiBpZHMpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJZmluYWwgRW50aXR5VHlwZSB0ZXN0U3RlcCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKwkJZmluYWwgRW50aXR5VHlwZSBtZWFzdXJlbWVudCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKE1lYXN1cmVtZW50LmNsYXNzKTsKKworCQlMaXN0PFN0cmluZz4gdGVzdFN0ZXBJRHMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRCh0ZXN0U3RlcCkKKwkJCQkuam9pbih0ZXN0U3RlcC5nZXRSZWxhdGlvbihjb250ZXh0Um9vdCksIEpvaW5UeXBlLk9VVEVSKQorCQkJCS5mZXRjaChGaWx0ZXIuYW5kKCkuYWRkKAorCQkJCQkJQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVC5jcmVhdGUoY29udGV4dFJvb3QuZ2V0SURBdHRyaWJ1dGUoKSwgaWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKSkKKwkJCQkuc3RyZWFtKCkubWFwKHIgLT4gci5nZXRSZWNvcmQodGVzdFN0ZXApKS5tYXAoUmVjb3JkOjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PFN0cmluZz4gbWVhc3VyZW1lbnRJRHMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRChtZWFzdXJlbWVudCkKKwkJCQkuam9pbihtZWFzdXJlbWVudC5nZXRSZWxhdGlvbihjb250ZXh0Um9vdCksIEpvaW5UeXBlLk9VVEVSKQorCQkJCS5mZXRjaChGaWx0ZXIuYW5kKCkuYWRkKAorCQkJCQkJQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVC5jcmVhdGUoY29udGV4dFJvb3QuZ2V0SURBdHRyaWJ1dGUoKSwgaWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKSkKKwkJCQkuc3RyZWFtKCkubWFwKHIgLT4gci5nZXRSZWNvcmQobWVhc3VyZW1lbnQpKS5tYXAoUmVjb3JkOjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PENvbnRleHREZXNjcmliYWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oVGVzdFN0ZXAuY2xhc3MpLCB0ZXN0U3RlcElEcykpOworCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oTWVhc3VyZW1lbnQuY2xhc3MpLCBtZWFzdXJlbWVudElEcykpOworCisJCXJldHVybiBsaXN0OworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSBDb250ZXh0RGVzY3JpYmFibGVzIHRvIHRoZSBnaXZlbiBjb250ZXh0IGNvbXBvbmVudCBpbnN0YW5jZXMKKwkgKiAKKwkgKiBAcGFyYW0gY29udGV4dENvbXBvbmVudCBlbnRpdHlUeXBlIG9mIHRoZSBjb250ZXh0IGNvbXBvbmVudAorCSAqIEBwYXJhbSBpZHMgICAgICAgICAgICAgIElEcyBvZiB0aGUgY29udGV4dENvbXBvbmVudHMgdG8gbG9hZC4KKwkgKiBAcmV0dXJuIHRoZSBsb2FkZWQgQ29udGV4dERlc2NyaWJhYmxlcworCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvdyBpZiB0aGUgQ29udGV4dERlc2NyaWJhYmxlcyBjYW5ub3QgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLgorCSAqLworCXByaXZhdGUgTGlzdDxDb250ZXh0RGVzY3JpYmFibGU+IGxvYWRFbnRpdHlGb3JDb250ZXh0Q29tcG9uZW50KEVudGl0eVR5cGUgY29udGV4dENvbXBvbmVudCwgTGlzdDxTdHJpbmc+IGlkcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQkvLyBDb250ZXh0Q29tcG9uZW50IGNhbiBvbmx5IGhhdmUgb25lIHBhcmVudAorCQlmaW5hbCBFbnRpdHlUeXBlIGNvbnRleHRSb290ID0gY29udGV4dENvbXBvbmVudC5nZXRQYXJlbnRSZWxhdGlvbnMoKS5nZXQoMCkuZ2V0VGFyZ2V0KCk7CisKKwkJZmluYWwgRW50aXR5VHlwZSB0ZXN0U3RlcCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKwkJZmluYWwgRW50aXR5VHlwZSBtZWFzdXJlbWVudCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKE1lYXN1cmVtZW50LmNsYXNzKTsKKworCQlMaXN0PFN0cmluZz4gdGVzdFN0ZXBJRHMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRCh0ZXN0U3RlcCkKKwkJCQkuam9pbih0ZXN0U3RlcC5nZXRSZWxhdGlvbihjb250ZXh0Um9vdCksIEpvaW5UeXBlLk9VVEVSKQorCQkJCS5qb2luKGNvbnRleHRSb290LmdldFJlbGF0aW9uKGNvbnRleHRDb21wb25lbnQpLCBKb2luVHlwZS5PVVRFUikKKwkJCQkuZmV0Y2goRmlsdGVyLmFuZCgpCisJCQkJCQkuYWRkKENvbXBhcmlzb25PcGVyYXRvci5JTl9TRVQuY3JlYXRlKGNvbnRleHRDb21wb25lbnQuZ2V0SURBdHRyaWJ1dGUoKSwKKwkJCQkJCQkJaWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKSkKKwkJCQkuc3RyZWFtKCkubWFwKHIgLT4gci5nZXRSZWNvcmQodGVzdFN0ZXApKS5tYXAoUmVjb3JkOjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PFN0cmluZz4gbWVhc3VyZW1lbnRJRHMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRChtZWFzdXJlbWVudCkKKwkJCQkuam9pbihtZWFzdXJlbWVudC5nZXRSZWxhdGlvbihjb250ZXh0Um9vdCksIEpvaW5UeXBlLk9VVEVSKQorCQkJCS5qb2luKGNvbnRleHRSb290LmdldFJlbGF0aW9uKGNvbnRleHRDb21wb25lbnQpLCBKb2luVHlwZS5PVVRFUikKKwkJCQkuZmV0Y2goRmlsdGVyLmFuZCgpCisJCQkJCQkuYWRkKENvbXBhcmlzb25PcGVyYXRvci5JTl9TRVQuY3JlYXRlKGNvbnRleHRDb21wb25lbnQuZ2V0SURBdHRyaWJ1dGUoKSwKKwkJCQkJCQkJaWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKSkKKwkJCQkuc3RyZWFtKCkubWFwKHIgLT4gci5nZXRSZWNvcmQobWVhc3VyZW1lbnQpKS5tYXAoUmVjb3JkOjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PENvbnRleHREZXNjcmliYWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oVGVzdFN0ZXAuY2xhc3MpLCB0ZXN0U3RlcElEcykpOworCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oTWVhc3VyZW1lbnQuY2xhc3MpLCBtZWFzdXJlbWVudElEcykpOworCQlyZXR1cm4gbGlzdDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlnCisJICogQHJldHVybiB0cnVlLCBpZiB0aGUgZW50aXR5Q29uZmlnIGJlbG9uZ3MgdG8gYSBjb250ZXh0IHJvb3Qgb3IgY29udGV4dAorCSAqICAgICAgICAgY29tcG9uZW50IGFuZCB0aGUgb3B0aW9uIGxvYWRDb250ZXh0RGVzY3JpYmFibGUKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNMb2FkQ29udGV4dERlc2NyaWJhYmxlKEVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcpIHsKKwkJcmV0dXJuIGxvYWRDb250ZXh0RGVzY3JpYmFibGUgJiYgKGVudGl0eUNvbmZpZy5nZXRFbnRpdHlDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oQ29udGV4dFJvb3QuY2xhc3MpCisJCQkJfHwgZW50aXR5Q29uZmlnLmdldEVudGl0eUNsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShDb250ZXh0Q29tcG9uZW50LmNsYXNzKSk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIGlmIGEgcmVsYXRpb24gYmV0d2VlbiBzb3VyY2VFbnRpdHlUeXBlIGFuZCBhdCBsZWFzdCBvbmUgZW50aXR5IHR5cGUgaW4KKwkgKiB0YXJnZXRFbnRpdHlUeXBlIGV4aXN0cy4KKwkgKiAKKwkgKiBAcGFyYW0gc291cmNlRW50aXR5VHlwZSAgc291cmNlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSB0YXJnZXRFbnRpdHlUeXBlcyBsaXN0IG9mIHRhcmdldCBlbml0aXR5IHR5cGVzLgorCSAqIEByZXR1cm4gdHJ1ZSwgaWYgcmVsYXRpb24gYmV0d2VlbiBzb3VyY2UgZW50aXR5IHR5cGUgYW5kIGF0IGxlYXN0IG9uZSB0YXJnZXQKKwkgKiAgICAgICAgIGVudGl0eSB0eXBlIGV4aXN0cy4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaGFzUmVsYXRpb25UbyhFbnRpdHlUeXBlIHNvdXJjZUVudGl0eVR5cGUsIEVudGl0eVR5cGUuLi4gdGFyZ2V0RW50aXR5VHlwZXMpIHsKKwkJZm9yIChFbnRpdHlUeXBlIGUgOiB0YXJnZXRFbnRpdHlUeXBlcykgeworCQkJdHJ5IHsKKwkJCQlzb3VyY2VFbnRpdHlUeXBlLmdldFJlbGF0aW9uKGUpOworCQkJCXJldHVybiB0cnVlOworCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIGVudGl0eSB0eXBlIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfSBpcyByZXF1ZXN0ZWQgZm9yCisJICogQHJldHVybiB7QGxpbmsgRW50aXR5Q29uZmlnfSBvciBudWxsIGlmIG5vdCBjb25maWcgd2FzIGZvdW5kIGZvciB0aGUKKwkgKiAgICAgICAgIHNwZWNpZmllZCBlbnRpdHkgdHlwZQorCSAqLworCXByaXZhdGUgRW50aXR5Q29uZmlnPD8+IGdldEVudGl0eUNvbmZpZyhFbnRpdHlUeXBlIGVudGl0eVR5cGUpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5Q29uZmlnKGVudGl0eVR5cGUpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL09EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL09EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyNDcwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vT0RTTm90aWZpY2F0aW9uU2VydmljZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Nb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLm5vdGlmaWNhdGlvbi5hdmFsb24uQXZhbG9uTm90aWZpY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLnBlYWsuUGVha05vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGEgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICoKKyAqLworcHVibGljIGNsYXNzIE9EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5IHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT0RTTm90aWZpY2F0aW9uU2VydmljZUZhY3RvcnkuY2xhc3MpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU0VSVkVSX1RZUEUgPSAiZnJlZXRleHQubm90aWZpY2F0aW9uVHlwZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVVJMID0gImZyZWV0ZXh0Lm5vdGlmaWNhdGlvblVybCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUE9MTElOR19JTlRFUlZBTCA9ICJmcmVldGV4dC5wb2xsaW5nSW50ZXJ2YWwiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1RZUEVfUEVBSyA9ICJwZWFrIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfVFlQRV9BVkFMT04gPSAiYXZhbG9uIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX05BTUVTRVJWSUNFX1VSTCA9ICJuYW1lc2VydmljZVVSTCI7CisKKwlwdWJsaWMgTm90aWZpY2F0aW9uU2VydmljZSBjcmVhdGUoQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykKKwkJCXRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHR5cGUgPSBnZXRQYXJhbWV0ZXIocGFyYW1ldGVycywgUEFSQU1fU0VSVkVSX1RZUEUpOworCisJCU1vZGVsTWFuYWdlciBtbSA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbihNb2RlbE1hbmFnZXIuY2xhc3MpKTsKKworCQlRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlID0gY29udGV4dC5nZXRRdWVyeVNlcnZpY2UoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKFF1ZXJ5U2VydmljZS5jbGFzcykpOworCisJCWlmICghT0RTTW9kZWxNYW5hZ2VyLmNsYXNzLmlzSW5zdGFuY2UobW0pKSB7CisJCQl0aHJvdyBuZXcgQ29ubmVjdGlvbkV4Y2VwdGlvbigiTW9kZWxNYW5hZ2VyIGlzIG5vdCBhIE9EU01vZGVsTWFuYWdlciEiKTsKKwkJfQorCisJCWlmIChTRVJWRVJfVFlQRV9QRUFLLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKKwkJCVN0cmluZyB1cmwgPSBnZXRQYXJhbWV0ZXIocGFyYW1ldGVycywgUEFSQU1fVVJMKTsKKworCQkJTE9HR0VSLmluZm8oIkNvbm5lY3RpbmcgdG8gUGVhayBOb3RpZmljYXRpb24gU2VydmVyIC4uLiIpOworCQkJTE9HR0VSLmluZm8oIlVSTDoge30iLCB1cmwpOworCisJCQl0cnkgeworCQkJCXJldHVybiBuZXcgUGVha05vdGlmaWNhdGlvbk1hbmFnZXIoKE9EU01vZGVsTWFuYWdlcikgbW0sIHF1ZXJ5U2VydmljZSwgdXJsLCB0cnVlKTsKKwkJCX0gY2F0Y2ggKE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IENvbm5lY3Rpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBjb25uZWN0IHRvIG5vdGlmaWNhdGlvbiBzZXJ2aWNlISIsIGUpOworCQkJfQorCQl9IGVsc2UgaWYgKFNFUlZFUl9UWVBFX0FWQUxPTi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisKKwkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJzLCBPRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9TRVJWSUNFTkFNRSk7CisJCQlzZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLnJlcGxhY2UoIi5BU0FNLU9EUyIsICIiKTsKKwkJCVN0cmluZyBuYW1lU2VydmljZVVSTCA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJzLCBPRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9OQU1FU0VSVklDRSk7CisKKwkJCUxPR0dFUi5pbmZvKCJDb25uZWN0aW5nIHRvIEF2YWxvbiBOb3RpZmljYXRpb24gU2VydmVyIC4uLiIpOworCQkJTE9HR0VSLmluZm8oIk5hbWUgc2VydmljZSBVUkw6IHt9IiwgbmFtZVNlcnZpY2VVUkwpOworCQkJTE9HR0VSLmluZm8oIlNlcnZpY2UgbmFtZToge30iLCBzZXJ2aWNlTmFtZSk7CisKKwkJCWxvbmcgcG9sbGluZ0ludGVydmFsID0gNTAwTDsKKwkJCXRyeSB7CisJCQkJcG9sbGluZ0ludGVydmFsID0gTG9uZy5wYXJzZUxvbmcoZ2V0UGFyYW1ldGVyKHBhcmFtZXRlcnMsIFBBUkFNX1BPTExJTkdfSU5URVJWQUwpKTsKKwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiB8IENvbm5lY3Rpb25FeGNlcHRpb24gZSkgeworCQkJCUxPR0dFUi53YXJuKCJDb3VsZCBub3QgcGFyc2UgcGFyc2UgcGFyYW1ldGVyIHBvbGxpbmdJbnRlcnZhbC4gVXNpbmcgZGVmYXVsdCB2YWx1ZTogIiArIHBvbGxpbmdJbnRlcnZhbCwKKwkJCQkJCWUpOworCQkJfQorCisJCQlyZXR1cm4gbmV3IEF2YWxvbk5vdGlmaWNhdGlvbk1hbmFnZXIoKE9EU01vZGVsTWFuYWdlcikgbW0sIHF1ZXJ5U2VydmljZSwgc2VydmljZU5hbWUsIG5hbWVTZXJ2aWNlVVJMLCB0cnVlLAorCQkJCQlwb2xsaW5nSW50ZXJ2YWwpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IENvbm5lY3Rpb25FeGNlcHRpb24oIkludmFsaWQgc2VydmVyIHR5cGUuIEV4cGVjdGVkIG9uIG9mOiAncGVhayciKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYW1ldGVyKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgU3RyaW5nIG5hbWUpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHZhbHVlID0gcGFyYW1ldGVycy5nZXQobmFtZSk7CisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IENvbm5lY3Rpb25FeGNlcHRpb24oIkNvbm5lY3Rpb24gcGFyYW1ldGVyIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBpcyBlaXRoZXIgbWlzc2luZyBvciBlbXB0eS4iKTsKKwkJfQorCisJCXJldHVybiB2YWx1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL2F2YWxvbi9BdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL2F2YWxvbi9BdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkMGVlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vYXZhbG9uL0F2YWxvbk5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb24uYXZhbG9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dERlc2NyaWJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkZpbHRlci5Nb2RpZmljYXRpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnLktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLk1PREVfREVMRVRFOworaW1wb3J0IGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLk1PREVfSU5TRVJUOworaW1wb3J0IGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLk1PREVfTU9ESUZZUklHSFRTOworaW1wb3J0IGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLk1PREVfUkVQTEFDRTsKKworLyoqCisgKiBOb3RpZmljYXRpb24gbWFuYWdlciBmb3IgaGFuZGxpbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBBdmFsb24gTm90aWZpY2F0aW9uCisgKiBTZXJ2aWNlCisgKiAKKyAqIE1vZGlmaWNhdGlvblR5cGUuTU9ERUxfTU9ESUZJRUQgaXMgbm90IHN1cHBvcnRlZCEKKyAqIAorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIE1hdHRoaWFzIEtvbGxlciwgUGVhayBTb2x1dGlvbiBHbWJICisgKgorICovCitwdWJsaWMgY2xhc3MgQXZhbG9uTm90aWZpY2F0aW9uTWFuYWdlciBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvblNlcnZpY2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEF2YWxvbk5vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFdmVudFByb2Nlc3Nvcj4gZXZlbnRQcm9jZXNzb3JzID0gbmV3IEhhc2hNYXA8PigpOworCisJcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2NoZWR1bGVkVGhyZWFkUG9vbCgxKTsKKworCXByaXZhdGUgZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lU2VydmljZVVSTDsKKwlwcml2YXRlIGxvbmcgcG9sbGluZ0ludGVydmFsID0gNTAwTDsKKwlwcml2YXRlIGZpbmFsIE5vdGlmaWNhdGlvbkVudGl0eUxvYWRlciBsb2FkZXI7CisKKwlwcml2YXRlIGZpbmFsIE9SQiBvcmIgPSBPUkIuaW5pdChuZXcgU3RyaW5nW10ge30sIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyLgorCSAqIAorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgICAgICAgICAgIE9EU01vZGVsTWFuYWdlciB1c2VkIHRvIGxhb2QgZW50aXRpZXMuCisJICogQHBhcmFtIHNlcnZpY2VOYW1lICAgICAgICAgICAgbmFtZSBvZiB0aGUgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisJICogQHBhcmFtIG5hbWVTZXJ2aWNlVVJMICAgICAgICAgVVJMIG9mIHRoZSBuYW1lIHNlcnZpY2UuCisJICogQHBhcmFtIGxvYWRDb250ZXh0RGVzY3JpYmFibGUgaWYgdHJ1ZSwgbm90aWZpY2F0aW9ucyBmb3Ige0BsaW5rIENvbnRleHRSb290fQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gd2lsbCBsb2FkIHRoZWlyCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IHtAbGluayBDb250ZXh0RGVzY3JpYmFibGV9LgorCSAqIEBwYXJhbSBwb2xsaW5nSW50ZXJ2YWwgICAgICAgIHBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGVzZWNvbmRzCisJICovCisJcHVibGljIEF2YWxvbk5vdGlmaWNhdGlvbk1hbmFnZXIoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSwgU3RyaW5nIHNlcnZpY2VOYW1lLAorCQkJU3RyaW5nIG5hbWVTZXJ2aWNlVVJMLCBib29sZWFuIGxvYWRDb250ZXh0RGVzY3JpYmFibGUsIGxvbmcgcG9sbGluZ0ludGVydmFsKSB7CisJCXRoaXMubW9kZWxNYW5hZ2VyID0gbW9kZWxNYW5hZ2VyOworCQl0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisJCXRoaXMubmFtZVNlcnZpY2VVUkwgPSBuYW1lU2VydmljZVVSTDsKKwkJdGhpcy5wb2xsaW5nSW50ZXJ2YWwgPSBwb2xsaW5nSW50ZXJ2YWw7CisJCWxvYWRlciA9IG5ldyBOb3RpZmljYXRpb25FbnRpdHlMb2FkZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIGxvYWRDb250ZXh0RGVzY3JpYmFibGUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyByZWdpc3RyYXRpb24sIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsIGZpbmFsIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQorCQkJdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlFdmVudFByb2Nlc3NvciBjb25zdW1lciA9IG5ldyBFdmVudFByb2Nlc3NvcihvcmIsIGxpc3RlbmVyLCB0aGlzLCBuYW1lU2VydmljZVVSTCwgc2VydmljZU5hbWUpOworCisJCQlMaXN0PFN0cmluZz4gYWlkcyA9IGZpbHRlci5nZXRFbnRpdHlUeXBlcygpLnN0cmVhbSgpLm1hcChlIC0+IGUuZ2V0SWQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQkJU2V0PE1vZGlmaWNhdGlvblR5cGU+IG1vZGVzID0gZmlsdGVyLmdldFR5cGVzKCkuc3RyZWFtKCkKKwkJCQkJLmZpbHRlcihtIC0+ICFNb2RpZmljYXRpb25UeXBlLk1PREVMX01PRElGSUVELmVxdWFscyhtKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCisJCQljb25zdW1lci5jb25uZWN0KCk7CisJCQljb25zdW1lci5zZXRGaWx0ZXIoYWlkcywgbW9kZXMpOworCisJCQlTY2hlZHVsZWRGdXR1cmU8Pz4gZnV0dXJlID0gZXhlY3V0b3Iuc2NoZWR1bGVBdEZpeGVkUmF0ZShjb25zdW1lciwgMCwgcG9sbGluZ0ludGVydmFsLAorCQkJCQlUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCQkJY29uc3VtZXIuc2V0RnV0dXJlKGZ1dHVyZSk7CisKKwkJCWV2ZW50UHJvY2Vzc29ycy5wdXQocmVnaXN0cmF0aW9uLCBjb25zdW1lcik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJFeGNlcHRpb24gY3JlYXRpbmcgbm90aWZpY2F0aW9uIGxpc3RlbmVyIHJlZ2lzdHJhdGlvbiEiLCBlKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXIoU3RyaW5nIHJlZ2lzdHJhdGlvbikgeworCQlFdmVudFByb2Nlc3NvciBwcm9jZXNzb3IgPSBldmVudFByb2Nlc3NvcnMuZ2V0KHJlZ2lzdHJhdGlvbik7CisJCWlmIChwcm9jZXNzb3IgIT0gbnVsbCkgeworCQkJcHJvY2Vzc29yLmRpc2Nvbm5lY3QoKTsKKwkJCWV2ZW50UHJvY2Vzc29ycy5yZW1vdmUocmVnaXN0cmF0aW9uKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsb3NlKGJvb2xlYW4gaXNEZXJlZ2lzdGVyQWxsKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKKwkJTE9HR0VSLmluZm8oIkNsb3NpbmcgTm90aWZpY2F0aW9uTWFuYWdlci4uLiIpOworCisJCWZvciAoU3RyaW5nIHJlZ2lzdHJhdGlvbiA6IGV2ZW50UHJvY2Vzc29ycy5rZXlTZXQoKSkgeworCQkJTE9HR0VSLmRlYnVnKCJEaXNjb25uZWN0aW5nIHJlZ2lzdHJhdGlvbiAnIiArIHJlZ2lzdHJhdGlvbiArICInLiIpOworCQkJZGVyZWdpc3RlcihyZWdpc3RyYXRpb24pOworCQl9CisKKwkJdHJ5IHsKKwkJCWV4ZWN1dG9yLnNodXRkb3duKCk7CisJCQlib29sZWFuIHRlcm1pbmF0ZWQgPSBleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKwkJCWlmICghdGVybWluYXRlZCkgeworCQkJCXRocm93IG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBjbG9zZSBhbGwgcmVnaXN0cmF0aW9ucyEiKTsKKwkJCX0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNsb3NlIGFsbCByZWdpc3RyYXRpb25zISIsIGUpOworCQl9CisJfQorCisJdm9pZCBwcm9jZXNzRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7CisJCUxPR0dFUi5lcnJvcigiRXhjZXB0aW9uIGR1cmluZyBub3RpZmljYXRpb24gcHJvY2Vzc2luZyEiLCBlKTsKKwl9CisKKwl2b2lkIHByb2Nlc3NOb3RpZmljYXRpb24oc2hvcnQgbW9kZSwgVF9MT05HTE9ORyBhZUlkLCBUX0xPTkdMT05HIGllSWQsIFRfTE9OR0xPTkcgdXNlcklkLCBTdHJpbmcgdGltZXN0YW1wLAorCQkJTm90aWZpY2F0aW9uTGlzdGVuZXIgbm90aWZpY2F0aW9uTGlzdGVuZXIpIHsKKworCQl0cnkgeworCQkJVXNlciB1c2VyID0gbG9hZGVyLmxvYWQobmV3IEtleTw+KFVzZXIuY2xhc3MpLCBMb25nLnRvU3RyaW5nKE9EU0NvbnZlcnRlci5mcm9tT0RTTG9uZyh1c2VySWQpKSk7CisJCQlMT0dHRVIuZGVidWcoIlVzZXIgbG9hZGVkIik7CisKKwkJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlQnlJZChMb25nLnRvU3RyaW5nKE9EU0NvbnZlcnRlci5mcm9tT0RTTG9uZyhhZUlkKSkpOworCQkJTGlzdDxTdHJpbmc+IGlkcyA9IEFycmF5cy5hc0xpc3QoTG9uZy50b1N0cmluZyhPRFNDb252ZXJ0ZXIuZnJvbU9EU0xvbmcoaWVJZCkpKTsKKworCQkJaWYgKExPR0dFUi5pc1RyYWNlRW5hYmxlZCgpKSB7CisJCQkJTE9HR0VSLnRyYWNlKCJOb3RpZmljYXRpb24gZXZlbnQgd2l0aDogZW50aXR5VHlwZT0iICsgZW50aXR5VHlwZSArICIsIHVzZXI9IiArIHVzZXIpOworCQkJfQorCisJCQlzd2l0Y2ggKG1vZGUpIHsKKwkJCWNhc2UgTU9ERV9JTlNFUlQudmFsdWU6CisJCQkJbm90aWZpY2F0aW9uTGlzdGVuZXIuaW5zdGFuY2VDcmVhdGVkKGxvYWRlci5sb2FkRW50aXRpZXMoZW50aXR5VHlwZSwgaWRzKSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVfUkVQTEFDRS52YWx1ZToKKwkJCQlub3RpZmljYXRpb25MaXN0ZW5lci5pbnN0YW5jZU1vZGlmaWVkKGxvYWRlci5sb2FkRW50aXRpZXMoZW50aXR5VHlwZSwgaWRzKSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVfREVMRVRFLnZhbHVlOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLmluc3RhbmNlRGVsZXRlZChlbnRpdHlUeXBlLCBpZHMsIHVzZXIpOworCQkJCWJyZWFrOworCQkJY2FzZSBNT0RFX01PRElGWVJJR0hUUy52YWx1ZToKKwkJCQlub3RpZmljYXRpb25MaXN0ZW5lci5zZWN1cml0eU1vZGlmaWVkKGVudGl0eVR5cGUsIGlkcywgdXNlcik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByb2Nlc3NFeGNlcHRpb24obmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBub3RpZmljYXRpb24gdHlwZSEiKSk7CisJCQl9CisJCX0gY2F0Y2ggKERhdGFBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkJcHJvY2Vzc0V4Y2VwdGlvbihuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBkYXRhIGZvciBub3RpZmljYXRpb24hIiwgZSkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9hdmFsb24vRXZlbnRQcm9jZXNzb3IuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vYXZhbG9uL0V2ZW50UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjMmQ3MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vYXZhbG9uL0V2ZW50UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLmF2YWxvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRmlsdGVyLk1vZGlmaWNhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcub21nLkNPUkJBLk9SQjsKK2ltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0OworaW1wb3J0IG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRIZWxwZXI7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZmljYXRpb24uU3RydWN0dXJlZEV2ZW50OworaW1wb3J0IG9yZy5vbWcuQ29zTm90aWZpY2F0aW9uLl9FdmVudFR5cGU7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlDaGFubmVsQWRtaW4uQ2xpZW50VHlwZTsKK2ltcG9ydCBvcmcub21nLkNvc05vdGlmeUNoYW5uZWxBZG1pbi5FdmVudENoYW5uZWw7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlDaGFubmVsQWRtaW4uRXZlbnRDaGFubmVsSGVscGVyOworaW1wb3J0IG9yZy5vbWcuQ29zTm90aWZ5Q2hhbm5lbEFkbWluLlN0cnVjdHVyZWRQcm94eVB1bGxTdXBwbGllcjsKK2ltcG9ydCBvcmcub21nLkNvc05vdGlmeUNoYW5uZWxBZG1pbi5TdHJ1Y3R1cmVkUHJveHlQdWxsU3VwcGxpZXJIZWxwZXI7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlDb21tLkludmFsaWRFdmVudFR5cGU7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlDb21tLlN0cnVjdHVyZWRQdWxsQ29uc3VtZXJQT0E7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlGaWx0ZXIuQ29uc3RyYWludEV4cDsKK2ltcG9ydCBvcmcub21nLkNvc05vdGlmeUZpbHRlci5GaWx0ZXI7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlGaWx0ZXIuRmlsdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudDsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyOworCisvKioKKyAqIEV2ZW50IHByb2Nlc3NvciByZXNwb25zaWJsZSBmb3IgcmVjZWl2aW5nIGF2YWxvbiBldmVudHMgZnJvbSB0aGUgbm90aWZpY2F0aW9uCisgKiBzZXJ2aWNlIGFuZCByZWRpcmVjdCB0aGVtIHRvIHRoZSBtYW5hZ2VyLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgTWF0dGhpYXMgS29sbGVyLCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudFByb2Nlc3NvciBleHRlbmRzIFN0cnVjdHVyZWRQdWxsQ29uc3VtZXJQT0EgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRXZlbnRQcm9jZXNzb3IuY2xhc3MpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV2ZW50RG9tYWluTmFtZSA9ICJBVkFMT04iOworCisJcHJpdmF0ZSBmaW5hbCBPUkIgb3JiOworCXByaXZhdGUgZmluYWwgTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXI7CisJcHJpdmF0ZSBmaW5hbCBBdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyIG1hbmFnZXI7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZXNlcnZpY2VVcmw7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWU7CisKKwlwcml2YXRlIEV2ZW50Q2hhbm5lbCBldmVudENoYW5uZWw7CisJcHJpdmF0ZSBTdHJ1Y3R1cmVkUHJveHlQdWxsU3VwcGxpZXIgcHJveHlQdWxsU3VwcGxpZXI7CisKKwlwcml2YXRlIGJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7CisKKwlwcml2YXRlIFNjaGVkdWxlZEZ1dHVyZTw/PiBmdXR1cmU7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGV2ZW50IHByb2Nlc3Nvci4KKwkgKiAKKwkgKiBAcGFyYW0gb3JiICAgICAgICAgQ09SQkEgb3JiIHRvIHVzZQorCSAqIEBwYXJhbSBsaXN0ZW5lciAgICBub3RpZmljYXRpb24gbGlzdGVuZXIgY29uc3VtaW5nIHRoZSByZWNlaXZlZCBldmVudHMKKwkgKiBAcGFyYW0gbWFuYWdlciAgICAgbm90aWZpY2F0aW9uIG1hbmFnZXIgcmVzcG9uc2libGUgZm9yIHByb2Nlc3NpbmcgdGhlIGV2ZW50cworCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIENPUkJBIG5vdGlmaWNhdGlvbiBzZXJ2aWNlCisJICovCisJcHVibGljIEV2ZW50UHJvY2Vzc29yKE9SQiBvcmIsIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLCBBdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyIG1hbmFnZXIsCisJCQlTdHJpbmcgbmFtZXNlcnZpY2VVcmwsIFN0cmluZyBzZXJ2aWNlTmFtZSkgeworCQl0aGlzLm9yYiA9IG9yYjsKKwkJdGhpcy5uYW1lc2VydmljZVVybCA9IG5hbWVzZXJ2aWNlVXJsOworCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisJCXRoaXMuc2VydmljZU5hbWUgPSBTdHJpbmcuZm9ybWF0KCJjb20vaGlnaHFzb2Z0L2F2YWxvbi9ub3RpZmljYXRpb24vJXMuTm90aWZpY2F0aW9uIiwgc2VydmljZU5hbWUpOworCX0KKworCS8qKgorCSAqIENvbm5lY3QgdGhlIGV2ZW50IHByb2Nlc3NvciB0byB0aGUgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisJICogCisJICogQHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24gaW4gY2FzZSB0aGUgbm90aWZpY2F0aW9uIHNlcnZpY2UgY2Fubm90IGJlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkLgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb25uZWN0KCkgdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChpc0Nvbm5lY3RlZCgpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJTmFtaW5nQ29udGV4dEV4dCBuYyA9IE5hbWluZ0NvbnRleHRFeHRIZWxwZXIubmFycm93KG9yYi5zdHJpbmdfdG9fb2JqZWN0KG5hbWVzZXJ2aWNlVXJsKSk7CisKKwkJCWV2ZW50Q2hhbm5lbCA9IEV2ZW50Q2hhbm5lbEhlbHBlci5uYXJyb3cobmMucmVzb2x2ZShuYy50b19uYW1lKHNlcnZpY2VOYW1lKSkpOworCisJCQlwcm94eVB1bGxTdXBwbGllciA9IFN0cnVjdHVyZWRQcm94eVB1bGxTdXBwbGllckhlbHBlci5uYXJyb3coZXZlbnRDaGFubmVsLmRlZmF1bHRfY29uc3VtZXJfYWRtaW4oKQorCQkJCQkub2J0YWluX25vdGlmaWNhdGlvbl9wdWxsX3N1cHBsaWVyKENsaWVudFR5cGUuU1RSVUNUVVJFRF9FVkVOVCwgbmV3IG9yZy5vbWcuQ09SQkEuSW50SG9sZGVyKCkpKTsKKworCQkJcHJveHlQdWxsU3VwcGxpZXIuY29ubmVjdF9zdHJ1Y3R1cmVkX3B1bGxfY29uc3VtZXIodGhpcy5fdGhpcyhvcmIpKTsKKwkJCWNvbm5lY3RlZCA9IHRydWU7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJDYW5ub3QgY29ubmVjdCB0byBub3RpZmljYXRpb24gc2VydmljZSEiLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIERpc2Nvbm5lY3QgdGhlIGV2ZW50IHByb2Nlc3NvciBmcm9tIHRoZSBub3RpZmljYXRpb24gc2VydmljZS4KKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzY29ubmVjdCgpIHsKKwkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKKwkJCWlmIChmdXR1cmUgIT0gbnVsbCkgeworCQkJCWZ1dHVyZS5jYW5jZWwoZmFsc2UpOworCQkJfQorCisJCQlwcm94eVB1bGxTdXBwbGllciA9IG51bGw7CisKKwkJCWV2ZW50Q2hhbm5lbC5fcmVsZWFzZSgpOworCQkJZXZlbnRDaGFubmVsID0gbnVsbDsKKworCQkJY29ubmVjdGVkID0gZmFsc2U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHByb2Nlc3NvciBpcyBjb25uZWN0ZWQgdG8gdGhlIG5vdGlmaWNhdGlvbiBzZXJ2aWNlCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ29ubmVjdGVkKCkgeworCQlyZXR1cm4gY29ubmVjdGVkOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGV2ZW50IGZpbHRlci4KKwkgKiAKKwkgKiBAcGFyYW0gYWlkcyAgICAgICAgICAgICAgTGlzdCB3aXRoIGFwcGxpY2F0aW9uIGVsZW1lbnQgSURzIHRvIGZpbHRlciBmb3IuCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5IGxpc3QgbWVhbnMgbm8gYWxsLgorCSAqIEBwYXJhbSBtb2RpZmljYXRpb25UeXBlcyBDb2xsZWN0aW9uIG9mIG1vZGlmaWNhdGlvbiB0eXBlcyB0byBmaWx0ZXIgZm9yLgorCSAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBmaWx0ZXIgY2Fubm90IGJlIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbHRlcihMaXN0PFN0cmluZz4gYWlkcywgU2V0PE1vZGlmaWNhdGlvblR5cGU+IG1vZGlmaWNhdGlvblR5cGVzKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKKwkJaWYgKCFpc0Nvbm5lY3RlZCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGZpbHRlciB3aGVuIGRpc2Nvbm5lY3RlZC4gUGxlYXNlIGNvbm5lY3QgZmlyc3QuIik7CisJCX0KKworCQl0cnkgeworCQkJRmlsdGVyRmFjdG9yeSBmaWx0ZXJGYWN0b3J5ID0gZXZlbnRDaGFubmVsLmRlZmF1bHRfZmlsdGVyX2ZhY3RvcnkoKTsKKwkJCWlmIChmaWx0ZXJGYWN0b3J5ID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJObyBkZWZhdWx0IGZpbHRlciBmYWN0b3J5IGZvdW5kISIpOworCQkJfQorCisJCQlGaWx0ZXIgZmlsdGVyID0gZmlsdGVyRmFjdG9yeS5jcmVhdGVfZmlsdGVyKCJFWFRFTkRFRF9UQ0wiKTsKKwkJCWZpbHRlci5hZGRfY29uc3RyYWludHMobmV3IENvbnN0cmFpbnRFeHBbXSB7CisJCQkJCW5ldyBDb25zdHJhaW50RXhwKGdldEV2ZW50VHlwZXMobW9kaWZpY2F0aW9uVHlwZXMpLCBnZXRDb25zdHJhaW50RmlsdGVyKGFpZHMpKSB9KTsKKwkJCXByb3h5UHVsbFN1cHBsaWVyLmFkZF9maWx0ZXIoZmlsdGVyKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIGZpbHRlci4iLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNldHMgdGhlIFNjaGVkdWxlZEZ1dHVyZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdG9wIHRoZSBldmVudCBwcm9jZXNzb3IgdGFzay4KKwkgKiAKKwkgKiBAcGFyYW0gZnV0dXJlIFNjaGVkdWxlZEZ1dHVyZQorCSAqLworCXB1YmxpYyB2b2lkIHNldEZ1dHVyZShTY2hlZHVsZWRGdXR1cmU8Pz4gZnV0dXJlKSB7CisJCXRoaXMuZnV0dXJlID0gZnV0dXJlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBydW4oKSB7CisJCWlmIChpc0Nvbm5lY3RlZCgpKSB7CisJCQlvcmcub21nLkNPUkJBLkJvb2xlYW5Ib2xkZXIgYmggPSBuZXcgb3JnLm9tZy5DT1JCQS5Cb29sZWFuSG9sZGVyKCk7CisKKwkJCXRyeSB7CisJCQkJTE9HR0VSLnRyYWNlKCJMb29raW5nIGZvciBzdHJ1Y3R1cmVkIGV2ZW50cy4uLi4iKTsKKwkJCQkvLyB0cnkgdG8gcHVsbCBhbiBldmVudAorCQkJCVN0cnVjdHVyZWRFdmVudCBldmVudCA9IHByb3h5UHVsbFN1cHBsaWVyLnRyeV9wdWxsX3N0cnVjdHVyZWRfZXZlbnQoYmgpOworCQkJCWlmIChiaC52YWx1ZSkgeworCQkJCQlBdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50IGV2ID0gQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhlbHBlcgorCQkJCQkJCS5leHRyYWN0KGV2ZW50LnJlbWFpbmRlcl9vZl9ib2R5KTsKKwkJCQkJbWFuYWdlci5wcm9jZXNzTm90aWZpY2F0aW9uKGV2Lm1vZGUsIGV2LmFlSWQsIGV2LmllSWQsIGV2LnVzZXJJZCwgZXYudGltZXN0YW1wLCBsaXN0ZW5lcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJTE9HR0VSLnRyYWNlKCJObyBzdHJ1Y3R1cmVkIGV2ZW50cyBmb3VuZC4iKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCW1hbmFnZXIucHJvY2Vzc0V4Y2VwdGlvbihlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUxPR0dFUi53YXJuKCJEaXNjb25uZWN0ZWQuIik7CisJCQltYW5hZ2VyLnByb2Nlc3NFeGNlcHRpb24obmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiTm90IGNvbm5lY3RlZCIpKTsKKwkJCWlmIChmdXR1cmUgIT0gbnVsbCkgeworCQkJCWZ1dHVyZS5jYW5jZWwoZmFsc2UpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzY29ubmVjdF9zdHJ1Y3R1cmVkX3B1bGxfY29uc3VtZXIoKSB7CisJCUxPR0dFUi5pbmZvKCJEaXNjb25uZWN0ZWQhIik7CisJCWNvbm5lY3RlZCA9IGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG9mZmVyX2NoYW5nZShfRXZlbnRUeXBlW10gYWRkZWQsIF9FdmVudFR5cGVbXSByZW1vdmVkKSB0aHJvd3MgSW52YWxpZEV2ZW50VHlwZSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBjb25zdHJhaW50IGZpbHRlci4KKwkgKiAKKwkgKiBAcGFyYW0gYWlkcyBBcHBsaWNhdGlvbiBFbGVtZW50IElEcyB1c2VkIGZvciBmaWx0ZXJpbmcuIEVtcHR5IGxpc3QgbWVhbnMgbm8KKwkgKiAgICAgICAgICAgICBmaWx0ZXIuCisJICogQHJldHVybiBDb25zdHJhaW50IGZpbHRlciBjb250YWluaW5nIHRoZSBnaXZlbiBhaWRzCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29uc3RyYWludEZpbHRlcihMaXN0PFN0cmluZz4gYWlkcykgeworCQlpZiAoYWlkcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiAiVFJVRSI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gYWlkcy5zdHJlYW0oKS5tYXAoYWlkIC0+IFN0cmluZy5mb3JtYXQoIiQuZmlsdGVyYWJsZV9kYXRhKCVzKSA9PSAlcyIsICJBcHBsaWNhdGlvbkVsZW1lbnQiLCBhaWQpKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiBvciAiKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBNb2RpZmljYXRpb25UeXBlcyBpbiBFdmVudFR5cGVzLgorCSAqIAorCSAqIEBwYXJhbSBtb2RpZmljYXRpb25UeXBlcworCSAqIEByZXR1cm4gQXJyYXkgd2l0aCBFdmVudFR5cGVzCisJICovCisJcHJpdmF0ZSBfRXZlbnRUeXBlW10gZ2V0RXZlbnRUeXBlcyhTZXQ8TW9kaWZpY2F0aW9uVHlwZT4gbW9kaWZpY2F0aW9uVHlwZXMpIHsKKwkJaWYgKG1vZGlmaWNhdGlvblR5cGVzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIG5ldyBfRXZlbnRUeXBlWzBdOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG1vZGlmaWNhdGlvblR5cGVzLnN0cmVhbSgpLm1hcChzIC0+IG5ldyBfRXZlbnRUeXBlKGV2ZW50RG9tYWluTmFtZSwgdG9BdmFsb25TdHJpbmcocykpKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b0FycmF5KG5ldyBfRXZlbnRUeXBlWzBdKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGEge0BsaW5rIE1vZGlmaWNhdGlvblR5cGV9IGVudW0gdmFsdWUgdG8gYSBldmVudCB0eXBlIG5hbWUgZm9yIHRoZQorCSAqIENPUkJBIG5vdGlmaWNhdGlvbiBzZXJ2aWNlLgorCSAqIAorCSAqIEBwYXJhbSB0IGEgbW9kaWZpY2F0aW9uIHR5cGUKKwkgKiBAcmV0dXJuIGV2ZW50IHR5cGUgbmFtZQorCSAqLworCXByaXZhdGUgU3RyaW5nIHRvQXZhbG9uU3RyaW5nKE1vZGlmaWNhdGlvblR5cGUgdCkgeworCQlzd2l0Y2ggKHQpIHsKKwkJY2FzZSBJTlNUQU5DRV9DUkVBVEVEOgorCQkJcmV0dXJuICJJTlNFUlQiOworCQljYXNlIElOU1RBTkNFX01PRElGSUVEOgorCQkJcmV0dXJuICJSRVBMQUNFIjsKKwkJY2FzZSBJTlNUQU5DRV9ERUxFVEVEOgorCQkJcmV0dXJuICJERUxFVEUiOworCQljYXNlIFNFQ1VSSVRZX01PRElGSUVEOgorCQkJcmV0dXJuICJNT0RJRllSSUdIVFMiOworCQljYXNlIE1PREVMX01PRElGSUVEOgorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0Lm5hbWUoKSArICIgbm90IHN1cHBvcnRlZCEiKTsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZW51bSB2YWx1ZSEiKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vcGVhay9FdmVudFByb2Nlc3Nvci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL0V2ZW50UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmYjVhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vcGVhay9FdmVudFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLm5vdGlmaWNhdGlvbi5wZWFrOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50SW5wdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkluYm91bmRFdmVudDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLnBlYWtzb2x1dGlvbi5vZHMubm90aWZpY2F0aW9uLnByb3RvYnVmLk5vdGlmaWNhdGlvblByb3Rvcy5Ob3RpZmljYXRpb247CisKKy8qKgorICogRXZlbnQgcHJvY2Vzc29yIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgbm90aWZpY2F0aW9uIGV2ZW50cyBmcm9tIHRoZQorICogbm90aWZpY2F0aW9uIHNlcnZlciBhbmQgcmVkaXJlY3QgdGhlbSB0byB0aGUgbWFuYWdlci4KKyAqIAorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIE1hdHRoaWFzIEtvbGxlciwgUGVhayBTb2x1dGlvbiBHbWJICisgKgorICovCitwdWJsaWMgY2xhc3MgRXZlbnRQcm9jZXNzb3IgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRXZlbnRQcm9jZXNzb3IuY2xhc3MpOworCisJcHJpdmF0ZSBFdmVudElucHV0IGV2ZW50SW5wdXQ7CisJcHJpdmF0ZSBOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcjsKKwlwcml2YXRlIFBlYWtOb3RpZmljYXRpb25NYW5hZ2VyIG9kc05vdGlmaWNhdGlvbk1hbmFnZXI7CisJcHJpdmF0ZSBNZWRpYVR5cGUgZXZlbnRNZWRpYVR5cGU7CisJcHJpdmF0ZSBib29sZWFuIGNsb3NlSW52b2tlZCA9IGZhbHNlOworCXByaXZhdGUgYm9vbGVhbiBkaXNjb25uZWN0ZWQgPSBmYWxzZTsKKworCXB1YmxpYyBFdmVudFByb2Nlc3NvcihFdmVudElucHV0IGV2ZW50SW5wdXQsIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLAorCQkJUGVha05vdGlmaWNhdGlvbk1hbmFnZXIgb2RzTm90aWZpY2F0aW9uTWFuYWdlciwgTWVkaWFUeXBlIGV2ZW50TWVkaWFUeXBlKSB7CisJCXRoaXMuZXZlbnRJbnB1dCA9IGV2ZW50SW5wdXQ7CisJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKwkJdGhpcy5vZHNOb3RpZmljYXRpb25NYW5hZ2VyID0gb2RzTm90aWZpY2F0aW9uTWFuYWdlcjsKKwkJdGhpcy5ldmVudE1lZGlhVHlwZSA9IGV2ZW50TWVkaWFUeXBlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJ1bigpIHsKKworCQl3aGlsZSAoIWV2ZW50SW5wdXQuaXNDbG9zZWQoKSkgeworCisJCQlmaW5hbCBJbmJvdW5kRXZlbnQgaW5ib3VuZEV2ZW50ID0gZXZlbnRJbnB1dC5yZWFkKCk7CisKKwkJCWlmIChpbmJvdW5kRXZlbnQgPT0gbnVsbCkgeworCQkJCWlmICghY2xvc2VJbnZva2VkKSB7CisJCQkJCW9kc05vdGlmaWNhdGlvbk1hbmFnZXIKKwkJCQkJCQkucHJvY2Vzc0V4Y2VwdGlvbihuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJJbmJvdW5kIGV2ZW50IGlucHV0IHN0cmVhbSBjbG9zZWQhIikpOworCQkJCX0KKwkJCQlkaXNjb25uZWN0ZWQgPSB0cnVlOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJdHJ5IHsKKwkJCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQkJTE9HR0VSLnRyYWNlKCJSZWNlaXZlZCBldmVudDogIiArIGluYm91bmRFdmVudCk7CisJCQkJfQorCQkJCU5vdGlmaWNhdGlvbiBuID0gaW5ib3VuZEV2ZW50LnJlYWREYXRhKE5vdGlmaWNhdGlvbi5jbGFzcywgZXZlbnRNZWRpYVR5cGUpOworCQkJCW9kc05vdGlmaWNhdGlvbk1hbmFnZXIucHJvY2Vzc05vdGlmaWNhdGlvbihuLCBnZXRMaXN0ZW5lcigpKTsKKwkJCX0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworCQkJCW9kc05vdGlmaWNhdGlvbk1hbmFnZXIKKwkJCQkJCS5wcm9jZXNzRXhjZXB0aW9uKG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oIkNhbm5vdCBkZXNlcmlhbGl6ZSBub3RpZmljYXRpb24gZXZlbnQhIiwgZSkpOworCQkJCWRpc2Nvbm5lY3RlZCA9IHRydWU7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJZGlzY29ubmVjdGVkID0gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpIHsKKwkJcmV0dXJuIGRpc2Nvbm5lY3RlZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQljbG9zZUludm9rZWQgPSB0cnVlOworCQkvLyBFdmVudElucHV0IGlzIGNsb3NlZCBieSB0aGUgc2VydmVyIHNpZGUgYWZ0ZXIgaW52b2tpbmcgREVMRVRFCisJCS8vIC9ldmVudHMve3JlZ2lzdHJhdGlvbk5hbWV9LiBPdGhlcndpc2Ugd2UgcnVuIGludG8gYSBkZWFkbG9jayB3aXRoCisJCS8vIGV2ZW50SW5wdXQjcmVhZCgpCisJfQorCisJcHVibGljIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGdldExpc3RlbmVyKCkgeworCQlyZXR1cm4gbGlzdGVuZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL0pzb25NZXNzYWdlQm9keVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvSnNvbk1lc3NhZ2VCb2R5UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjE3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL0pzb25NZXNzYWdlQm9keVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb24ucGVhazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlVjM7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudXRpbC5Kc29uRm9ybWF0OworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudXRpbC5Kc29uRm9ybWF0LlBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWwuSnNvbkZvcm1hdC5QcmludGVyOworCisvKioKKyAqIE1lc3NhZ2VCb2R5UHJvdmlkZXIgZm9yIGhhbmRsaW5nIGpzb24gcGF5bG9hZHMuCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICoKKyAqLworQFByb3ZpZGVyCitAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCitAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCitwdWJsaWMgY2xhc3MgSnNvbk1lc3NhZ2VCb2R5UHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNZXNzYWdlPiwgTWVzc2FnZUJvZHlXcml0ZXI8TWVzc2FnZT4geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldHMuVVRGXzg7CisJcHJpdmF0ZSBQcmludGVyIGpzb25QcmludGVyID0gSnNvbkZvcm1hdC5wcmludGVyKCk7CisJcHJpdmF0ZSBQYXJzZXIganNvblBhcnNlciA9IEpzb25Gb3JtYXQucGFyc2VyKCk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKwkJCWZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKwkJcmV0dXJuIE1lc3NhZ2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWVzc2FnZSByZWFkRnJvbShmaW5hbCBDbGFzczxNZXNzYWdlPiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisJCQlmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlmaW5hbCBNZXRob2QgbmV3QnVpbGRlciA9IHR5cGUuZ2V0TWV0aG9kKCJuZXdCdWlsZGVyIik7CisJCQlmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlVjMuQnVpbGRlcjw/PiBidWlsZGVyID0gKEdlbmVyYXRlZE1lc3NhZ2VWMy5CdWlsZGVyPD8+KSBuZXdCdWlsZGVyLmludm9rZSh0eXBlKTsKKwkJCWpzb25QYXJzZXIubWVyZ2UobmV3IElucHV0U3RyZWFtUmVhZGVyKGVudGl0eVN0cmVhbSwgY2hhcnNldCksIGJ1aWxkZXIpOworCQkJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgTWVzc2FnZSBtLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisJCQlmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisJCQlmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisJCXJldHVybiBNZXNzYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBNZXNzYWdlIG0sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKwkJCWZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKwkJCWZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWVudGl0eVN0cmVhbS53cml0ZShqc29uUHJpbnRlci5wcmludChtKS5nZXRCeXRlcyhjaGFyc2V0KSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL1BlYWtOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvUGVha05vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E2N2I3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL1BlYWtOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLnBlYWs7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnLktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRJbnB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlRmVhdHVyZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLnBlYWtzb2x1dGlvbi5vZHMubm90aWZpY2F0aW9uLnByb3RvYnVmLk5vdGlmaWNhdGlvblByb3Rvcy5Ob3RpZmljYXRpb247CisKKy8qKgorICogTm90aWZpY2F0aW9uIG1hbmFnZXIgZm9yIGhhbmRsaW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgUGVhayBPRFMgU2VydmVyCisgKiBOb3RpZmljYXRpb24gUGx1Z2luCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICoKKyAqLworcHVibGljIGNsYXNzIFBlYWtOb3RpZmljYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgTm90aWZpY2F0aW9uU2VydmljZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGVha05vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworCisJcHJpdmF0ZSBmaW5hbCBDbGllbnQgY2xpZW50OworCXByaXZhdGUgZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50OworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFdmVudFByb2Nlc3Nvcj4gcHJvY2Vzc29ycyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCXByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKKworCXByaXZhdGUgZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKworCXByaXZhdGUgZmluYWwgTm90aWZpY2F0aW9uRW50aXR5TG9hZGVyIGxvYWRlcjsKKworCS8qKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIKKwkgKiBAcGFyYW0gdXJsICAgICAgICAgICAgICAgICAgICBVUkwgb2YgdGhlIG5vdGlmaWNhdGlvbiBwbHVnaW4KKwkgKiBAcGFyYW0gbG9hZENvbnRleHREZXNjcmliYWJsZSBpZiB0cnVlLCB0aGUgY29ycmVzcG9uZGluZyBjb250ZXh0IGRlc2NyaWJhYmxlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbG9hZGVkIGlmIGEgbm90aWZpY2F0aW9uIGZvciBhIGNvbnRleHQgcm9vdAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNvbnRleHQgY29tcG9uZW50IGlzIHJlY2VpdmVkLgorCSAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIFRocm93biBpZiB0aGUgbWFuYWdlciBjYW5ub3QgY29ubmVjdCB0byB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24gc2VydmVyLgorCSAqLworCXB1YmxpYyBQZWFrTm90aWZpY2F0aW9uTWFuYWdlcihPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBTdHJpbmcgdXJsLAorCQkJYm9vbGVhbiBsb2FkQ29udGV4dERlc2NyaWJhYmxlKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKKwkJdGhpcy5tb2RlbE1hbmFnZXIgPSBtb2RlbE1hbmFnZXI7CisJCWxvYWRlciA9IG5ldyBOb3RpZmljYXRpb25FbnRpdHlMb2FkZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIGxvYWRDb250ZXh0RGVzY3JpYmFibGUpOworCisJCXRyeSB7CisJCQljbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS5yZWdpc3RlcihTc2VGZWF0dXJlLmNsYXNzKS5yZWdpc3RlcihKc29uTWVzc2FnZUJvZHlQcm92aWRlci5jbGFzcykKKwkJCQkJLmJ1aWxkKCk7CisKKwkJCWVuZHBvaW50ID0gY2xpZW50LnRhcmdldCh1cmwpLnBhdGgoImV2ZW50cyIpOworCisJCQlFeGVjdXRvcnMubmV3U2NoZWR1bGVkVGhyZWFkUG9vbCgxKS5zY2hlZHVsZUF0Rml4ZWRSYXRlKCgpIC0+IHJlY29ubmVjdCgpLCAxMCwgMTAsIFRpbWVVbml0LlNFQ09ORFMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSAiICsgUGVha05vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIiEiLCBlKTsKKwkJfQorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25NYW5hZ2VyI3JlZ2lzdGVyKGphdmEuCisJICogbGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRmlsdGVyLAorCSAqIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXIpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHJlZ2lzdHJhdGlvbiwgTm90aWZpY2F0aW9uRmlsdGVyIGZpbHRlciwgTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCisJCQl0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKKwkJTE9HR0VSLmluZm8oIlN0YXJ0aW5nIHJlZ2lzdHJhdGlvbiBmb3Igd2l0aCBuYW1lOiB7fSIsIHJlZ2lzdHJhdGlvbik7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBlbmRwb2ludC5wYXRoKHJlZ2lzdHJhdGlvbikucmVxdWVzdCgpLnBvc3QoCisJCQkJamF2YXgud3MucnMuY2xpZW50LkVudGl0eS5lbnRpdHkoUHJvdG9idWZDb252ZXJ0ZXIuZnJvbShmaWx0ZXIpLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKSk7CisKKwkJaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCkgPT0gU3RhdHVzLkNPTkZMSUNULmdldFN0YXR1c0NvZGUoKSkgeworCQkJaWYgKExPR0dFUi5pc0luZm9FbmFibGVkKCkpIHsKKwkJCQlMT0dHRVIuaW5mbygiQSByZWdpc3RyYXRpb24gd2l0aCB0aGUgbmFtZSBhbHJlYWR5IGV4aXN0czoge30iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCQkJCUxPR0dFUi5pbmZvKCJUcnlpbmcgdG8gcmVyZWdpc3Rlci4uLiIpOworCQkJfQorCQkJZGVyZWdpc3RlcihyZWdpc3RyYXRpb24pOworCQkJTE9HR0VSLmluZm8oIkRlcmVnaXN0ZXJhdGlvbiBzdWNjZXNzZnVsLiIpOworCQkJcmVnaXN0ZXIocmVnaXN0cmF0aW9uLCBmaWx0ZXIsIGxpc3RlbmVyKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChyZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpICE9IFN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpIHsKKwkJCXRocm93IG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oCisJCQkJCSJDb3VsZCBub3QgY3JlYXRlIHJlZ2lzdHJhdGlvbiBhdCBub3RpZmljYXRpb24gc2VydmljZTogIiArIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisJCX0KKworCQlyZWNyZWF0ZUV2ZW50U3RyZWFtKHJlZ2lzdHJhdGlvbiwgbGlzdGVuZXIpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUKKwkgKiBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbk1hbmFnZXIjZGVyZWdpc3RlcihqYXZhCisJICogLmxhbmcuU3RyaW5nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXIoU3RyaW5nIHJlZ2lzdHJhdGlvbikgeworCQlpZiAocHJvY2Vzc29ycy5jb250YWluc0tleShyZWdpc3RyYXRpb24pKSB7CisJCQljbG9zZShyZWdpc3RyYXRpb24pOworCQl9CisKKwkJZW5kcG9pbnQucGF0aChyZWdpc3RyYXRpb24pLnJlcXVlc3QoKS5kZWxldGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZShib29sZWFuIGlzRGVyZWdpc3RlckFsbCkgdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiB7CisJCUxPR0dFUi5pbmZvKCJDbG9zaW5nIE5vdGlmaWNhdGlvbk1hbmFnZXIuLi4iKTsKKworCQlmb3IgKFN0cmluZyByZWdpc3RyYXRpb24gOiBwcm9jZXNzb3JzLmtleVNldCgpKSB7CisJCQlpZiAoaXNEZXJlZ2lzdGVyQWxsKSB7CisJCQkJTE9HR0VSLmRlYnVnKCJEZXJlZ2lzdGVyaW5nICd7fScuIiwgcmVnaXN0cmF0aW9uKTsKKwkJCQlkZXJlZ2lzdGVyKHJlZ2lzdHJhdGlvbik7CisJCQl9IGVsc2UgeworCQkJCUxPR0dFUi5kZWJ1ZygiRGlzY29ubmVjdGluZyAne30nLiIsIHJlZ2lzdHJhdGlvbik7CisJCQkJY2xvc2UocmVnaXN0cmF0aW9uKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJlY3JlYXRlcyB0aGUge0BsaW5rIEV2ZW50SW5wdXR9LCBhdHRhY2hlcyBhbiB7QGxpbmsgRXZlbnRQcm9jZXNzb3J9IHRvIGl0CisJICogYW5kIHN0b3JlcyB0aGUge0BsaW5rIEV2ZW50UHJvY2Vzc29yfSBpbiB0aGUgcHJvY2Vzc29ycyBtYXAuCisJICogCisJICogQHBhcmFtIHJlZ2lzdHJhdGlvbgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIHJlY3JlYXRlRXZlbnRTdHJlYW0oU3RyaW5nIHJlZ2lzdHJhdGlvbiwgTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24geworCQl0cnkgeworCQkJTE9HR0VSLmluZm8oIlJlcXVlc3RpbmcgZXZlbnQgaW5wdXQgZm9yIHt9IiwgcmVnaXN0cmF0aW9uKTsKKwkJCUV2ZW50SW5wdXQgZXZlbnRJbnB1dCA9IGVuZHBvaW50LnBhdGgocmVnaXN0cmF0aW9uKS5yZXF1ZXN0KFNzZUZlYXR1cmUuU0VSVkVSX1NFTlRfRVZFTlRTX1RZUEUpCisJCQkJCS5nZXQoRXZlbnRJbnB1dC5jbGFzcyk7CisKKwkJCUxPR0dFUi5pbmZvKCJSZWNlaXZlZCBldmVudCBpbnB1dCwgc3RhcnRpbmcgZXZlbnQgcHJvY2Vzc29yLiIpOworCQkJRXZlbnRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEV2ZW50UHJvY2Vzc29yKGV2ZW50SW5wdXQsIGxpc3RlbmVyLCB0aGlzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKworCQkJZXhlY3V0b3Iuc3VibWl0KHByb2Nlc3Nvcik7CisKKwkJCXByb2Nlc3NvcnMucHV0KHJlZ2lzdHJhdGlvbiwgcHJvY2Vzc29yKTsKKwkJCUxPR0dFUi5pbmZvKCJFdmVudCBwcm9jZXNzb3Igc3RhcnRlZC4iKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRyeSB7CisJCQkJZGVyZWdpc3RlcihyZWdpc3RyYXRpb24pOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gdXBvbiBkZXJlZ2lzdGVyaW5nISIpOworCQkJfQorCQkJdGhyb3cgbmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBldmVudCBpbnB1dCBzdHJlYW0hIiwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVja3MgaWYgYW55IHJlZ2lzdGVyZWQgZXZlbnQgcHJvY2Vzc29yIGdvdCBkaXNjb25uZWN0ZWQgYW5kIHRyaWVzIHRvCisJICogcmVjcmVhdGUgdGhlIGV2ZW50IHN0cmVhbSwgaWYgbmVjZXNzYXJ5LgorCSAqLworCXByaXZhdGUgdm9pZCByZWNvbm5lY3QoKSB7CisKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBFdmVudFByb2Nlc3Nvcj4gZW50cnkgOiBwcm9jZXNzb3JzLmVudHJ5U2V0KCkpIHsKKwkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpLmlzRGlzY29ubmVjdGVkKCkpIHsKKwkJCQl0cnkgeworCQkJCQlMT0dHRVIudHJhY2UoIlJlZ2lzdHJhdGlvbiAne30nIHdhcyBkaXNjb25uZWN0ZWQgYW5kIHdpbGwgYmUgcmVjcmVhdGVkLiIsIGVudHJ5LmdldEtleSgpKTsKKwkJCQkJcmVjcmVhdGVFdmVudFN0cmVhbShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKS5nZXRMaXN0ZW5lcigpKTsKKwkJCQl9IGNhdGNoIChOb3RpZmljYXRpb25FeGNlcHRpb24gZSkgeworCQkJCQlMT0dHRVIud2FybigiQ2Fubm90IHJlY3JlYXRlIGV2ZW50IHN0cmVhbSBmb3IgcmVnaXN0cmF0aW9uICIgKyBlbnRyeS5nZXRLZXkoKSwgZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsb3NlKFN0cmluZyByZWdpc3RyYXRpb24pIHsKKwkJaWYgKHByb2Nlc3NvcnMuY29udGFpbnNLZXkocmVnaXN0cmF0aW9uKSkgeworCQkJRXZlbnRQcm9jZXNzb3IgcHJvY2Vzc29yID0gcHJvY2Vzc29ycy5nZXQocmVnaXN0cmF0aW9uKTsKKwkJCXByb2Nlc3Nvci5zdG9wKCk7CisJCQlwcm9jZXNzb3JzLnJlbW92ZShyZWdpc3RyYXRpb24pOworCQl9CisJfQorCisJLyoqCisJICogSGFuZGxlciBmb3IgRXhjZXB0aW9ucyBkdXJpbmcgZXZlbnQgcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gZSBFeGNlcHRpb24gd2hpY2ggb2NjdXJlZCBkdXJpbmcgZXZlbnQgcHJvY2Vzc2luZy4KKwkgKi8KKwl2b2lkIHByb2Nlc3NFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKwkJTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gZHVyaW5nIG5vdGlmaWNhdGlvbiBwcm9jZXNzaW5nISIsIGUpOworCX0KKworCS8qKgorCSAqIEhhbmRsZXIgZm9yIG5vdGlmaWNhdGlvbnMuCisJICogCisJICogQHBhcmFtIG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbiB0byBwcm9jZXNzLgorCSAqIEBwYXJhbSBub3RpZmljYXRpb25MaXN0ZW5lciBub3RpZmljYXRpb24gbGlzdGVuZXIgZm9yIGhhbmRsaW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uCisJICovCisJdm9pZCBwcm9jZXNzTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBuLCBOb3RpZmljYXRpb25MaXN0ZW5lciBub3RpZmljYXRpb25MaXN0ZW5lcikgeworCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCUxPR0dFUi5kZWJ1ZygiUHJvY2Vzc2luZyBub3RpZmljYXRpb24gZXZlbnQ6ICIgKyBuKTsKKwkJfQorCisJCXRyeSB7CisJCQlVc2VyIHVzZXIgPSBsb2FkZXIubG9hZChuZXcgS2V5PD4oVXNlci5jbGFzcyksIExvbmcudG9TdHJpbmcobi5nZXRVc2VySWQoKSkpOworCisJCQlFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZUJ5SWQoTG9uZy50b1N0cmluZyhuLmdldEFpZCgpKSk7CisKKwkJCWlmIChMT0dHRVIuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJCUxPR0dFUi50cmFjZSgiTm90aWZpY2F0aW9uIGV2ZW50IHdpdGg6IGVudGl0eVR5cGU9IiArIGVudGl0eVR5cGUgKyAiLCB1c2VyPSIgKyB1c2VyKTsKKwkJCX0KKwkJCXN3aXRjaCAobi5nZXRUeXBlKCkpIHsKKwkJCWNhc2UgTkVXOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLmluc3RhbmNlQ3JlYXRlZChsb2FkZXIubG9hZEVudGl0aWVzKGVudGl0eVR5cGUsIG4uZ2V0SWlkTGlzdCgpLnN0cmVhbSgpCisJCQkJCQkubWFwKGlkIC0+IGlkLnRvU3RyaW5nKCkpLmZpbHRlcihPRFNVdGlsczo6aXNWYWxpZElEKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PRElGWToKKwkJCQlub3RpZmljYXRpb25MaXN0ZW5lci5pbnN0YW5jZU1vZGlmaWVkKGxvYWRlci5sb2FkRW50aXRpZXMoZW50aXR5VHlwZSwgbi5nZXRJaWRMaXN0KCkuc3RyZWFtKCkKKwkJCQkJCS5tYXAoaWQgLT4gaWQudG9TdHJpbmcoKSkuZmlsdGVyKE9EU1V0aWxzOjppc1ZhbGlkSUQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpLCB1c2VyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgREVMRVRFOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLmluc3RhbmNlRGVsZXRlZChlbnRpdHlUeXBlLCBuLmdldElpZExpc3QoKS5zdHJlYW0oKS5tYXAoaWQgLT4gaWQudG9TdHJpbmcoKSkKKwkJCQkJCS5maWx0ZXIoT0RTVXRpbHM6OmlzVmFsaWRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVMOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLm1vZGVsTW9kaWZpZWQoZW50aXR5VHlwZSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNFQ1VSSVRZOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLnNlY3VyaXR5TW9kaWZpZWQoZW50aXR5VHlwZSwgbi5nZXRJaWRMaXN0KCkuc3RyZWFtKCkubWFwKGlkIC0+IGlkLnRvU3RyaW5nKCkpCisJCQkJCQkuZmlsdGVyKE9EU1V0aWxzOjppc1ZhbGlkSUQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSksIHVzZXIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcm9jZXNzRXhjZXB0aW9uKG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oIkludmFsaWQgbm90aWZpY2F0aW9uIHR5cGUhIikpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcHJvY2Vzc0V4Y2VwdGlvbihuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJDb3VsZCBub3QgcHJvY2VzcyBub3RpZmljYXRpb24hIiwgZSkpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvUHJvdG9idWZDb252ZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vcGVhay9Qcm90b2J1ZkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2Q5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvUHJvdG9idWZDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLm5vdGlmaWNhdGlvbi5wZWFrOworCitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25GaWx0ZXIuTW9kaWZpY2F0aW9uVHlwZTsKKworaW1wb3J0IGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuUmVnaXN0cmF0aW9uOworaW1wb3J0IGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuUmVnaXN0cmF0aW9uLk5vdGlmaWNhdGlvbk1vZGU7CisKKy8qKgorICogSGVscGVyIGNsYXNzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gcHJvdG9idWYgYW5kIG1kbSB0eXBlcy4KKyAqIAorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIE1hdHRoaWFzIEtvbGxlciwgUGVhayBTb2x1dGlvbiBHbWJICisgKgorICovCitwdWJsaWMgY2xhc3MgUHJvdG9idWZDb252ZXJ0ZXIgeworCisJLyoqCisJICogQ29udmVydCBhIG5vdGlmaWNhdGlvbiBmaWx0ZXIgdG8gYSByZWdpc3RyYXRpb24uCisJICogCisJICogQHBhcmFtIGZpbHRlciBub3RpZmljYXRpb24gZmlsdGVyLgorCSAqIEByZXR1cm4gcmVnaXN0cmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZpbHRlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlZ2lzdHJhdGlvbiBmcm9tKE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIpIHsKKwkJcmV0dXJuIFJlZ2lzdHJhdGlvbi5uZXdCdWlsZGVyKCkuc2V0TW9kZShOb3RpZmljYXRpb25Nb2RlLlBVU0gpCisJCQkJLmFkZEFsbEFpZCgKKwkJCQkJCWZpbHRlci5nZXRFbnRpdHlUeXBlcygpLnN0cmVhbSgpLm1hcChlIC0+IExvbmcudmFsdWVPZihlLmdldElkKCkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKQorCQkJCS5hZGRBbGxUeXBlKGZpbHRlci5nZXRUeXBlcygpLnN0cmVhbSgpLm1hcCh0IC0+IFByb3RvYnVmQ29udmVydGVyLmZyb20odCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpCisJCQkJLmJ1aWxkKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHQgbWRtIG1vZGlmaWNhdGlvbiB0eXBlLgorCSAqIEByZXR1cm4gcHJvdG9idWYgbm90aWZpY2F0aW9uIHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBjb20ucGVha3NvbHV0aW9uLm9kcy5ub3RpZmljYXRpb24ucHJvdG9idWYuTm90aWZpY2F0aW9uUHJvdG9zLk1vZGlmaWNhdGlvblR5cGUgZnJvbSgKKwkJCU1vZGlmaWNhdGlvblR5cGUgdCkgeworCQlzd2l0Y2ggKHQpIHsKKwkJY2FzZSBJTlNUQU5DRV9DUkVBVEVEOgorCQkJcmV0dXJuIGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuTW9kaWZpY2F0aW9uVHlwZS5ORVc7CisJCWNhc2UgSU5TVEFOQ0VfTU9ESUZJRUQ6CisJCQlyZXR1cm4gY29tLnBlYWtzb2x1dGlvbi5vZHMubm90aWZpY2F0aW9uLnByb3RvYnVmLk5vdGlmaWNhdGlvblByb3Rvcy5Nb2RpZmljYXRpb25UeXBlLk1PRElGWTsKKwkJY2FzZSBJTlNUQU5DRV9ERUxFVEVEOgorCQkJcmV0dXJuIGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuTW9kaWZpY2F0aW9uVHlwZS5ERUxFVEU7CisJCWNhc2UgTU9ERUxfTU9ESUZJRUQ6CisJCQlyZXR1cm4gY29tLnBlYWtzb2x1dGlvbi5vZHMubm90aWZpY2F0aW9uLnByb3RvYnVmLk5vdGlmaWNhdGlvblByb3Rvcy5Nb2RpZmljYXRpb25UeXBlLk1PREVMOworCQljYXNlIFNFQ1VSSVRZX01PRElGSUVEOgorCQkJcmV0dXJuIGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuTW9kaWZpY2F0aW9uVHlwZS5TRUNVUklUWTsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZW51bSB2YWx1ZSEiKTsgLy8gVE9ETworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIHQgcHJvdG9idWYgbm90aWZpY2F0aW9uIHR5cGUKKwkgKiBAcmV0dXJuIG1kbSBub3RpZmljYXRpb24gdHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgTW9kaWZpY2F0aW9uVHlwZSB0bygKKwkJCWNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuTW9kaWZpY2F0aW9uVHlwZSB0KSB7CisJCXN3aXRjaCAodCkgeworCQljYXNlIE5FVzoKKwkJCXJldHVybiBNb2RpZmljYXRpb25UeXBlLklOU1RBTkNFX0NSRUFURUQ7CisJCWNhc2UgTU9ESUZZOgorCQkJcmV0dXJuIE1vZGlmaWNhdGlvblR5cGUuSU5TVEFOQ0VfTU9ESUZJRUQ7CisJCWNhc2UgREVMRVRFOgorCQkJcmV0dXJuIE1vZGlmaWNhdGlvblR5cGUuSU5TVEFOQ0VfREVMRVRFRDsKKwkJY2FzZSBNT0RFTDoKKwkJCXJldHVybiBNb2RpZmljYXRpb25UeXBlLk1PREVMX01PRElGSUVEOworCQljYXNlIFNFQ1VSSVRZOgorCQkJcmV0dXJuIE1vZGlmaWNhdGlvblR5cGUuU0VDVVJJVFlfTU9ESUZJRUQ7CisJCWRlZmF1bHQ6CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGVudW0gdmFsdWUhIik7IC8vIFRPRE8KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjNiZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU0F0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Mb25nU3RyZWFtOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxBdHRyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTVXRpbHM7CisKKy8qKgorICogT0RTIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQXR0cmlidXRlfSBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBPRFNBdHRyaWJ1dGUgaW1wbGVtZW50cyBBdHRyaWJ1dGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgRW51bWVyYXRpb248Pz4gZW51bU9iajsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCXByaXZhdGUgZmluYWwgU3RyaW5nIHVuaXQ7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlUeXBlIGVudGl0eVR5cGU7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZVR5cGU8Pz4gdmFsdWVUeXBlOworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0lkQXR0cmlidXRlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHBhcmVudCB7QGxpbmsgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIGFwcGxBdHRyICAgVGhlIE9EUyBtZXRhIGRhdGEgZm9yIHRoaXMgYXR0cmlidXRlLgorCSAqIEBwYXJhbSB1bml0ICAgICAgIFRoZSB1bml0IG5hbWUuCisJICogQHBhcmFtIGVudW1PYmogICAgVGhlIGVudW1lcmF0aW9uIGNsYXNzLCBtYXkgYmUgbnVsbC4KKwkgKi8KKwlPRFNBdHRyaWJ1dGUoRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBBcHBsQXR0ciBhcHBsQXR0ciwgU3RyaW5nIHVuaXQsIEVudW1lcmF0aW9uPD8+IGVudW1PYmopIHsKKwkJdGhpcy5lbnRpdHlUeXBlID0gZW50aXR5VHlwZTsKKwkJbmFtZSA9IGFwcGxBdHRyLmFhTmFtZTsKKwkJdGhpcy51bml0ID0gdW5pdCA9PSBudWxsID8gIiIgOiB1bml0OworCisJCWlmIChpc0lEQXR0cmlidXRlKGVudGl0eVR5cGUsIGFwcGxBdHRyKSkgeworCQkJdmFsdWVUeXBlID0gVmFsdWVUeXBlLlNUUklORzsKKwkJCWlzSWRBdHRyaWJ1dGUgPSB0cnVlOworCQl9IGVsc2UgeworCQkJdmFsdWVUeXBlID0gT0RTVXRpbHMuVkFMVUVUWVBFUy5pbnZlcnNlKCkuZ2V0KGFwcGxBdHRyLmRUeXBlKTsKKwkJCWlzSWRBdHRyaWJ1dGUgPSBmYWxzZTsKKwkJfQorCisJCWlmICh2YWx1ZVR5cGUuaXNFbnVtZXJhdGlvblR5cGUoKSAmJiBlbnVtT2JqID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisJCQkJCSJBIG1vZGVsZWQgYXR0cmlidXRlIHdpdGggYW4gZW51bWVyYXRpb24gdmFsdWUgdHlwZSBtdXN0IGhhdmUgYW4gIiArICJlbnVtZXJhdGlvbiBkZWZpbml0aW9uLiIpOworCQl9CisKKwkJdGhpcy5lbnVtT2JqID0gZW51bU9iajsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNJREF0dHJpYnV0ZShFbnRpdHlUeXBlIGVudGl0eVR5cGUsIEFwcGxBdHRyIGFwcGxBdHRyKSB7CisJCWZvciAoUmVsYXRpb24gciA6IGVudGl0eVR5cGUuZ2V0UmVsYXRpb25zKCkpIHsKKwkJCWlmIChhcHBsQXR0ci5hYU5hbWUuZXF1YWxzSWdub3JlQ2FzZShyLmdldE5hbWUoKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gImlkIi5lcXVhbHNJZ25vcmVDYXNlKGFwcGxBdHRyLmJhTmFtZSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJZEF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIGlzSWRBdHRyaWJ1dGU7CisJfQorCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXQoKSB7CisJCXJldHVybiB1bml0OworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5VHlwZSBnZXRFbnRpdHlUeXBlKCkgeworCQlyZXR1cm4gZW50aXR5VHlwZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFZhbHVlVHlwZTw/PiBnZXRWYWx1ZVR5cGUoKSB7CisJCXJldHVybiB2YWx1ZVR5cGU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnVtZXJhdGlvbjw/PiBnZXRFbnVtT2JqKCkgeworCQlpZiAoZ2V0VmFsdWVUeXBlKCkuaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJcmV0dXJuIGVudW1PYmo7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgdmFsdWUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYW4gZW51bWVyYXRpb24gdHlwZS4iKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVmFsdWUgY3JlYXRlVmFsdWUoU3RyaW5nIHVuaXQsIGJvb2xlYW4gdmFsaWQsIE9iamVjdCBpbnB1dCkgeworCQlyZXR1cm4gQXR0cmlidXRlLnN1cGVyLmNyZWF0ZVZhbHVlKHVuaXQsIHZhbGlkLCBjb252ZXJ0SW5wdXRGb3JJZEF0dHJpYnV0ZShpbnB1dCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBWYWx1ZSBjcmVhdGVWYWx1ZVNlcShTdHJpbmcgdW5pdCwgT2JqZWN0IGlucHV0KSB7CisJCXJldHVybiBBdHRyaWJ1dGUuc3VwZXIuY3JlYXRlVmFsdWVTZXEodW5pdCwgY29udmVydElucHV0Rm9ySWRBdHRyaWJ1dGUoaW5wdXQpKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyB0aGUgaW5wdXQgb2JqZWN0IGZyb20gbG9uZy9sb25nLWFycmF5L2ludC9pbnQtYXJyYXkgdG8gYQorCSAqIFN0cmluZy9TdHJpbmctYXJyYXkKKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHRvIGNvbnZlcnQKKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQgaW5wdXQKKwkgKi8KKwlwcml2YXRlIE9iamVjdCBjb252ZXJ0SW5wdXRGb3JJZEF0dHJpYnV0ZShPYmplY3QgaW5wdXQpIHsKKwkJaWYgKGlzSWRBdHRyaWJ1dGUpIHsKKwkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIExvbmcgfHwgaW5wdXQgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisJCQkJcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7CisJCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgbG9uZ1tdKSB7CisJCQkJcmV0dXJuIExvbmdTdHJlYW0ub2YoKGxvbmdbXSkgaW5wdXQpLm1hcFRvT2JqKExvbmc6OnRvU3RyaW5nKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOworCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIGludFtdKSB7CisJCQkJcmV0dXJuIEludFN0cmVhbS5vZigoaW50W10pIGlucHV0KS5tYXBUb09iaihJbnRlZ2VyOjp0b1N0cmluZykudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBpbnB1dDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIE9iamVjdHMuaGFzaChnZXRFbnRpdHlUeXBlKCksIGdldE5hbWUoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBPRFNBdHRyaWJ1dGUpIHsKKwkJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlKSBvYmplY3Q7CisJCQlyZXR1cm4gZ2V0RW50aXR5VHlwZSgpLmVxdWFscyhhdHRyaWJ1dGUuZ2V0RW50aXR5VHlwZSgpKSAmJiBnZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gZ2V0TmFtZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNFbnRpdHlGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTRW50aXR5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYmI3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTRW50aXR5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5OworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQXR0cmlidXRlLlZBVFRSX0VOVU1FUkFUSU9OX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQXR0cmlidXRlLlZBVFRSX1NDQUxBUl9UWVBFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0F0dHJpYnV0ZS5WQVRUUl9TRVFVRU5DRTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5DaGlsZHJlblN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRGVmYXVsdENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5U3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkF4aXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5JbnRlcnBvbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UeXBlU3BlY2lmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WZXJzaW9uU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkVudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZy5LZXk7CisKKy8qKgorICogT0RTIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgRW50aXR5RmFjdG9yeX0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPRFNFbnRpdHlGYWN0b3J5IGV4dGVuZHMgRW50aXR5RmFjdG9yeSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPj4gRU5VTV9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8PigpOworCisJc3RhdGljIHsKKwkJRU5VTV9DTEFTU0VTLmFkZChTY2FsYXJUeXBlLmNsYXNzKTsKKwkJRU5VTV9DTEFTU0VTLmFkZChWZXJzaW9uU3RhdGUuY2xhc3MpOworCQlFTlVNX0NMQVNTRVMuYWRkKEludGVycG9sYXRpb24uY2xhc3MpOworCQlFTlVNX0NMQVNTRVMuYWRkKEF4aXNUeXBlLmNsYXNzKTsKKwkJRU5VTV9DTEFTU0VTLmFkZChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLmNsYXNzKTsKKwkJRU5VTV9DTEFTU0VTLmFkZChUeXBlU3BlY2lmaWNhdGlvbi5jbGFzcyk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwlwcml2YXRlIGZpbmFsIE9wdGlvbmFsPFVzZXI+IGxvZ2dlZEluVXNlcjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBjcmVhdGUge0BsaW5rIENvcmV9cy4KKwkgKiBAcGFyYW0gbG9nZ2VkSW5Vc2VyIFRoZSBsb2dnZWQgaW4ge0BsaW5rIFVzZXJ9LgorCSAqLworCXB1YmxpYyBPRFNFbnRpdHlGYWN0b3J5KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIE9wdGlvbmFsPFVzZXI+IGxvZ2dlZEluVXNlcikgeworCQl0aGlzLm1vZGVsTWFuYWdlciA9IG1vZGVsTWFuYWdlcjsKKwkJdGhpcy5sb2dnZWRJblVzZXIgPSBsb2dnZWRJblVzZXI7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogRXh0cmFjdHMgdGhlIHtAbGluayBDb3JlfSBmcm9tIGFuIHtAbGluayBFbnRpdHl9IGluc3RhbmNlLiBUaGlzIG1ldGhvZAorCSAqIGVmZmVjdGl2ZWx5IG1ha2VzIGFjY2VzcyB0byB0aGUgQ29yZSBvZiBhIEJhc2VFbnRpdHkgcHVibGljbHkgYXZhaWxhYmxlIChieQorCSAqIGNhbGxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcHJvdGVjdGVkIG1ldGhvZCBvZiBCYXNlRW50aXR5RmFjdG9yeSwgd2hpY2ggaXMKKwkgKiB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcykgdG8gdXNlcnMgb2YgT0RTRW50aXR5RmFjdG9yeS4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5IFRoZSB7QGxpbmsgRW50aXR5fSBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIHtAbGluayBDb3JlfS4KKwkgKiBAcmV0dXJuIFRoZSBlbnRpdHkncyB7QGxpbmsgQ29yZX0uCisJICovCisJcHVibGljIHN0YXRpYyBDb3JlIGV4dHJhY3QoRW50aXR5IGVudGl0eSkgeworCQlpZiAoZW50aXR5IGluc3RhbmNlb2YgQmFzZUVudGl0eSkgeworCQkJcmV0dXJuIGdldENvcmUoKEJhc2VFbnRpdHkpIGVudGl0eSk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnRpdHkgb2YgdHlwZSAnIiArIGVudGl0eS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKQorCQkJCQkrICInIGRvZXMgbm90IGV4dGVuZCAnIiArIEJhc2VFbnRpdHkuY2xhc3MuZ2V0TmFtZSgpICsgIiciKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGltcGxlbWVudGluZyB0aGUge0BsaW5rIEVudGl0eX0gaW50ZXJmYWNlIHdpdGgKKwkgKiBjb3JlIGFzIHRoZSBpbnN0YW5jZSdzIHtAbGluayBDb3JlfS4gVGhpcyBtZXRob2QgZWZmZWN0aXZlbHkgbWFrZXMgdGhlCisJICogcHJvdGVjdGVkIEJhc2VFbnRpdHkgY29uc3RydWN0b3IgcHVibGljbHkgYXZhaWxhYmxlIChieSBjYWxsaW5nIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgcHJvdGVjdGVkIG1ldGhvZCBvZiBCYXNlRW50aXR5RmFjdG9yeSwgd2hpY2ggaXMgdGhpcyBjbGFzcydzCisJICogc3VwZXJjbGFzcykgdG8gdXNlcnMgb2YgT0RTRW50aXR5RmFjdG9yeS4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlLCBtdXN0IGltcGxlbWVudCB0aGUge0BsaW5rIEVudGl0eX0KKwkgKiAgICAgICAgICAgICAgaW50ZXJmYWNlLgorCSAqIEBwYXJhbSBjb3JlICBUaGUge0BsaW5rIENvcmV9IHRvIHVzZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2UuCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IFQgY3JlYXRlRW50aXR5KENsYXNzPFQ+IGNsYXp6LCBDb3JlIGNvcmUpIHsKKwkJaWYgKEJhc2VFbnRpdHkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsKKwkJCXJldHVybiAoVCkgY3JlYXRlQmFzZUVudGl0eShjbGF6ei5hc1N1YmNsYXNzKEJhc2VFbnRpdHkuY2xhc3MpLCBjb3JlKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJDbGFzcyAnIiArIGNsYXp6LmdldFNpbXBsZU5hbWUoKSArICInIGRvZXMgbm90IGV4dGVuZCAnIiArIEJhc2VFbnRpdHkuY2xhc3MuZ2V0TmFtZSgpICsgIiciKTsKKwkJfQorCisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByb3RlY3RlZCBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcHRpb25hbDxVc2VyPiBnZXRMb2dnZWRJblVzZXIoKSB7CisJCXJldHVybiBsb2dnZWRJblVzZXI7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudGl0eT4gQ29yZSBjcmVhdGVDb3JlKENsYXNzPFQ+IGVudGl0eUNsYXNzKSB7CisJCXJldHVybiBjcmVhdGVDb3JlKG5ldyBLZXk8PihlbnRpdHlDbGFzcykpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBFbnRpdHk+IENvcmUgY3JlYXRlQ29yZShDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUpIHsKKwkJcmV0dXJuIGNyZWF0ZUNvcmUobmV3IEtleTw+KGVudGl0eUNsYXNzLCBjb250ZXh0VHlwZSkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eVN0b3JlIGdldE11dGFibGVTdG9yZShCYXNlRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gRW50aXR5RmFjdG9yeS5nZXRNdXRhYmxlU3RvcmUoZW50aXR5KTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHlTdG9yZSBnZXRQZXJtYW5lbnRTdG9yZShCYXNlRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gRW50aXR5RmFjdG9yeS5nZXRQZXJtYW5lbnRTdG9yZShlbnRpdHkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkcmVuU3RvcmUgZ2V0Q2hpbGRyZW5TdG9yZShCYXNlRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gRW50aXR5RmFjdG9yeS5nZXRDaGlsZHJlblN0b3JlKGVudGl0eSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudGl0eT4gQ29yZSBjcmVhdGVDb3JlKFN0cmluZyBuYW1lLCBDbGFzczxUPiBlbnRpdHlDbGFzcykgeworCQlFbnRpdHlDb25maWc8Pz4gZW50aXR5Q29uZmlnID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eUNvbmZpZyhtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShuYW1lKSk7CisJCWlmICghZW50aXR5Q2xhc3MuZXF1YWxzKGVudGl0eUNvbmZpZy5nZXRFbnRpdHlDbGFzcygpKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb21wYXRpYmxlIGVudGl0eSBjbGFzcyBleHBlY3RlZCAnIiArIGVudGl0eUNsYXNzLmdldE5hbWUoKQorCQkJCQkrICInIGJ1dCBnb3QgJyIgKyBlbnRpdHlDb25maWcuZ2V0RW50aXR5Q2xhc3MoKS5nZXROYW1lKCkgKyAiJyIpOworCQl9CisJCUNvcmUgY29yZSA9IG5ldyBEZWZhdWx0Q29yZShlbnRpdHlDb25maWcuZ2V0RW50aXR5VHlwZSgpKTsKKwkJY29yZS5nZXRWYWx1ZXMoKS5nZXQoRW50aXR5LkFUVFJfTUlNRVRZUEUpLnNldChlbnRpdHlDb25maWcuZ2V0TWltZVR5cGUoKSk7CisKKwkJcmV0dXJuIGNvcmU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRW51bShFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbk9iaikgeworCQlFbnVtUmVnaXN0cnkgZXIgPSBFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKKwkJLy8gY2hlY2sgaWYgZW51bSBpcyBwcm9wZXJseSByZWdpc3RlcmVkCisJCWlmIChlci5nZXQoZW51bWVyYXRpb25PYmouZ2V0TmFtZSgpKSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBlbnVtIGNsYXNzICciICsgZW51bWVyYXRpb25PYmouZ2V0TmFtZSgpICsgIicgaXMgbm90IHN1cHBvcnRlZC4iKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBCYXNlRW50aXR5PiBUIGNyZWF0ZUJhc2VFbnRpdHkoQ2xhc3M8VD4gY2xhenosIENvcmUgY29yZSkgeworCQl0cnkgeworCQkJQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBjbGF6ei5nZXREZWNsYXJlZENvbnN0cnVjdG9yKENvcmUuY2xhc3MpOworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoY29yZSk7CisJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4YykgeworCQkJCXJldHVybiBzdXBlci5jcmVhdGVCYXNlRW50aXR5KGNsYXp6LCBjb3JlKTsKKwkJCX0KKwkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB8IEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGV4Yy5nZXRNZXNzYWdlKCksIGV4Yyk7CisJCX0KKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhIGNvbmZpZ3VyZWQge0BsaW5rIENvcmV9IGZvciBnaXZlbiB7QGxpbmsgS2V5fS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgVXNlZCBhcyBpZGVudGlmaWVyIHRvIHJlc29sdmUgdGhlIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIENvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgPFQgZXh0ZW5kcyBFbnRpdHk+IENvcmUgY3JlYXRlQ29yZShLZXk8VD4ga2V5KSB7CisJCUVudGl0eUNvbmZpZzxUPiBlbnRpdHlDb25maWcgPSBtb2RlbE1hbmFnZXIuZmluZEVudGl0eUNvbmZpZyhrZXkpOworCQlDb3JlIGNvcmUgPSBuZXcgRGVmYXVsdENvcmUoZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKSk7CisJCWNvcmUuZ2V0VmFsdWVzKCkuZ2V0KEVudGl0eS5BVFRSX01JTUVUWVBFKS5zZXQoZW50aXR5Q29uZmlnLmdldE1pbWVUeXBlKCkpOworCisJCWlmIChDYXRhbG9nQXR0cmlidXRlLmNsYXNzLmVxdWFscyhlbnRpdHlDb25maWcuZ2V0RW50aXR5Q2xhc3MoKSkpIHsKKwkJCWNvcmUuZ2V0VmFsdWVzKCkucHV0KFZBVFRSX0VOVU1FUkFUSU9OX05BTUUsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKFZBVFRSX0VOVU1FUkFUSU9OX05BTUUpKTsKKwkJCWNvcmUuZ2V0VmFsdWVzKCkucHV0KFZBVFRSX1NDQUxBUl9UWVBFLAorCQkJCQlWYWx1ZVR5cGUuRU5VTUVSQVRJT04uY3JlYXRlKEVudW1SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiU2NhbGFyVHlwZSIpLCBWQVRUUl9TQ0FMQVJfVFlQRSkpOworCQkJY29yZS5nZXRWYWx1ZXMoKS5wdXQoVkFUVFJfU0VRVUVOQ0UsIFZhbHVlVHlwZS5CT09MRUFOLmNyZWF0ZShWQVRUUl9TRVFVRU5DRSkpOworCQl9CisKKwkJcmV0dXJuIGNvcmU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU0VudGl0eVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNFbnRpdHlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwNGQ3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNFbnRpdHlUeXBlLmphdmEKQEAgLTAsMCArMSwzMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnk7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uLmlkZW50aXR5OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuZ3JvdXBpbmdCeTsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTWFwOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQXBwbEVsZW07CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworCisvKioKKyAqIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEVudGl0eVR5cGV9IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9EU0VudGl0eVR5cGUgaW1wbGVtZW50cyBFbnRpdHlUeXBlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxFbnRpdHlUeXBlLCBNYXA8U3RyaW5nLCBSZWxhdGlvbj4+IHJlbGF0aW9uc0J5RW50aXR5TmFtZSA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxFbnRpdHlUeXBlLCBSZWxhdGlvbj4gcmVsYXRpb25zQnlFbnRpdHkgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxSZWxhdGlvblR5cGUsIExpc3Q8UmVsYXRpb24+PiByZWxhdGlvbnNCeVR5cGUgPSBuZXcgRW51bU1hcDw+KFJlbGF0aW9uVHlwZS5jbGFzcyk7CisJcHJpdmF0ZSBmaW5hbCBMaXN0PFJlbGF0aW9uPiByZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQXR0cmlidXRlPiBhdHRyaWJ1dGVCeU5hbWU7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBzb3VyY2VOYW1lOworCXByaXZhdGUgZmluYWwgVF9MT05HTE9ORyBvZHNJRDsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBiYXNlTmFtZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHNvdXJjZU5hbWUgIE5hbWUgb2YgdGhlIGRhdGEgc291cmNlLgorCSAqIEBwYXJhbSBhcHBsRWxlbSAgICBUaGUgT0RTIG1ldGEgZGF0YSBmb3IgdGhpcyBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gdW5pdHMgICAgICAgVGhlIHVuaXQge0Bjb2RlIE1hcH0gZm9yIHVuaXQgbWFwcGluZyBvZiBhdHRyaWJ1dGVzLgorCSAqIEBwYXJhbSBlbnVtQ2xhc3NlcyBUaGUgZW51bWVyYXRpb24gY2xhc3Mge0Bjb2RlIE1hcH0gZm9yIGVudW0gbWFwcGluZyBvZgorCSAqICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLgorCSAqLworCisJT0RTRW50aXR5VHlwZShTdHJpbmcgc291cmNlTmFtZSwgQXBwbEVsZW0gYXBwbEVsZW0sIE1hcDxTdHJpbmcsIFN0cmluZz4gdW5pdHMsCisJCQlNYXA8U3RyaW5nLCBFbnVtZXJhdGlvbjw/Pj4gZW51bU9ianMpIHsKKwkJdGhpcy5zb3VyY2VOYW1lID0gc291cmNlTmFtZTsKKwkJYmFzZU5hbWUgPSBhcHBsRWxlbS5iZU5hbWU7CisJCW5hbWUgPSBhcHBsRWxlbS5hZU5hbWU7CisJCW9kc0lEID0gYXBwbEVsZW0uYWlkOworCisJCWF0dHJpYnV0ZUJ5TmFtZSA9IEFycmF5cworCQkJCS5zdHJlYW0oYXBwbEVsZW0uYXR0cmlidXRlcykubWFwKGEgLT4gbmV3IE9EU0F0dHJpYnV0ZSh0aGlzLCBhLAorCQkJCQkJdW5pdHMuZ2V0KExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGEudW5pdElkKSkpLCBlbnVtT2Jqcy5nZXQoYS5hYU5hbWUpKSkKKwkJCQkuY29sbGVjdCh0b01hcChBdHRyaWJ1dGU6OmdldE5hbWUsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gc291cmNlTmFtZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBPRFMgYmFzZSBuYW1lIHRoaXMgZW50aXR5IHR5cGUgaXMgZGVyaXZlZCBmcm9tLgorCSAqCisJICogQHJldHVybiBUaGUgYmFzZSBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7CisJCXJldHVybiBiYXNlTmFtZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gbmV3IEFycmF5TGlzdDw+KGF0dHJpYnV0ZUJ5TmFtZS52YWx1ZXMoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVCeU5hbWUuZ2V0KG5hbWUpOworCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKKwkJCU9wdGlvbmFsPFJlbGF0aW9uPiByZWxhdGlvbiA9IGdldFJlbGF0aW9ucygpLnN0cmVhbSgpLmZpbHRlcihyIC0+IHIuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEFueSgpOworCQkJcmV0dXJuIHJlbGF0aW9uLm1hcChSZWxhdGlvbjo6Z2V0QXR0cmlidXRlKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiQXR0cmlidXRlIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBub3QgZm91bmQgYXQgZW50aXR5IHR5cGUgJyIgKyBnZXROYW1lKCkgKyAiJy4iKSk7CisJCX0KKwkJcmV0dXJuIGF0dHJpYnV0ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBPRFMgdHlwZSBJRCBvZiB0aGlzIGVudGl0eSB0eXBlLgorCSAqCisJICogQHJldHVybiBUaGUgT0RTIHR5cGUgSUQgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRfTE9OR0xPTkcgZ2V0T0RTSUQoKSB7CisJCXJldHVybiBvZHNJRDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKG9kc0lEKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldFJlbGF0aW9ucygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVsYXRpb25zKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldFBhcmVudFJlbGF0aW9ucygpIHsKKwkJcmV0dXJuIGdldFJlbGF0aW9ucyhSZWxhdGlvblR5cGUuRkFUSEVSX0NISUxEKS5zdHJlYW0oKQorCQkJCS5maWx0ZXIociAtPiAoKE9EU1JlbGF0aW9uKSByKS5pc091dGdvaW5nKFJlbGF0aW9uVHlwZS5GQVRIRVJfQ0hJTEQpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxSZWxhdGlvbj4gZ2V0Q2hpbGRSZWxhdGlvbnMoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnMoUmVsYXRpb25UeXBlLkZBVEhFUl9DSElMRCkuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKHIgLT4gKChPRFNSZWxhdGlvbikgcikuaXNJbmNvbWluZyhSZWxhdGlvblR5cGUuRkFUSEVSX0NISUxEKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldEluZm9SZWxhdGlvbnMoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnMoUmVsYXRpb25UeXBlLklORk8pLnN0cmVhbSgpLmZpbHRlcihyIC0+ICgoT0RTUmVsYXRpb24pIHIpLmlzT3V0Z29pbmcoUmVsYXRpb25UeXBlLklORk8pKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxSZWxhdGlvbj4gZ2V0UmVsYXRpb25zKFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGUpIHsKKwkJTGlzdDxSZWxhdGlvbj4gcmVzdWx0ID0gcmVsYXRpb25zQnlUeXBlLmdldChyZWxhdGlvblR5cGUpOworCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0KTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlbGF0aW9uIGdldFJlbGF0aW9uKEVudGl0eVR5cGUgdGFyZ2V0KSB7CisJCVJlbGF0aW9uIHJlbGF0aW9uID0gcmVsYXRpb25zQnlFbnRpdHkuZ2V0KHRhcmdldCk7CisJCWlmIChyZWxhdGlvbiA9PSBudWxsKSB7CisJCQkvLyBtdWx0aXBsZSByZWxhdGlvbnMgdG8gdGFyZ2V0IGV4aXN0LCB0cnkgdG8gdXNlIGEgZGVmYXVsdAorCQkJTWFwPFN0cmluZywgUmVsYXRpb24+IHJlbGF0aW9uc0J5TmFtZSA9IHJlbGF0aW9uc0J5RW50aXR5TmFtZS5nZXQodGFyZ2V0KTsKKwkJCWlmIChyZWxhdGlvbnNCeU5hbWUgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlbGF0aW9ucyB0byAnIiArIHRhcmdldCArICInIG5vdCBmb3VuZCEiKTsKKwkJCX0KKworCQkJcmVsYXRpb24gPSByZWxhdGlvbnNCeU5hbWUuZ2V0KHRhcmdldC5nZXROYW1lKCkpOworCQl9CisJCXJldHVybiByZWxhdGlvbiA9PSBudWxsID8gZ2V0UGFyZW50UmVsYXRpb24odGFyZ2V0KSA6IHJlbGF0aW9uOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb24gZ2V0UmVsYXRpb24oRW50aXR5VHlwZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7CisJCU1hcDxTdHJpbmcsIFJlbGF0aW9uPiByZWxhdGlvbnNCeU5hbWUgPSByZWxhdGlvbnNCeUVudGl0eU5hbWUuZ2V0KHRhcmdldCk7CisJCWlmIChyZWxhdGlvbnNCeU5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRpb25zIHRvICciICsgdGFyZ2V0ICsgIicgbm90IGZvdW5kISIpOworCQl9CisKKwkJUmVsYXRpb24gcmVsYXRpb24gPSByZWxhdGlvbnNCeU5hbWUuZ2V0KG5hbWUpOworCQlpZiAocmVsYXRpb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRpb24gdG8gJyIgKyB0YXJnZXQgKyAiJyB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgbm90IGZvdW5kISIpOworCQl9CisJCXJldHVybiByZWxhdGlvbjsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgT0RTRW50aXR5VHlwZSkgeworCQkJcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMoKChFbnRpdHlUeXBlKSBvYmplY3QpLmdldE5hbWUoKSk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBnZXROYW1lKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFBhY2thZ2UgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIFJlbGF0aW9ufXMuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb25zIHtAY29kZSBSZWxhdGlvbn1zIHdoaWNoIHdpbGwgYmUgYWRkZWQuCisJICovCisJdm9pZCBzZXRSZWxhdGlvbnMoTGlzdDxSZWxhdGlvbj4gcmVsYXRpb25zKSB7CisJCU1hcDxFbnRpdHlUeXBlLCBMaXN0PFJlbGF0aW9uPj4gZW50aXR5UmVsYXRpb25zQnlUYXJnZXQgPSByZWxhdGlvbnMuc3RyZWFtKCkuZGlzdGluY3QoKQorCQkJCS5maWx0ZXIociAtPiBlcXVhbHMoci5nZXRTb3VyY2UoKSkpLmNvbGxlY3QoZ3JvdXBpbmdCeShSZWxhdGlvbjo6Z2V0VGFyZ2V0KSk7CisKKwkJZm9yIChFbnRyeTxFbnRpdHlUeXBlLCBMaXN0PFJlbGF0aW9uPj4gZW50cnkgOiBlbnRpdHlSZWxhdGlvbnNCeVRhcmdldC5lbnRyeVNldCgpKSB7CisJCQlMaXN0PFJlbGF0aW9uPiBlbnRpdHlUeXBlUmVsYXRpb25zID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCUVudGl0eVR5cGUgdGFyZ2V0ID0gZW50cnkuZ2V0S2V5KCk7CisKKwkJCWVudGl0eVR5cGVSZWxhdGlvbnMuZm9yRWFjaCh0aGlzOjphZGRSZWxhdGlvbik7CisKKwkJCWlmIChlbnRpdHlUeXBlUmVsYXRpb25zLnNpemUoKSA+IDEpIHsKKwkJCQlyZWxhdGlvbnNCeUVudGl0eU5hbWUucHV0KHRhcmdldCwKKwkJCQkJCWVudGl0eVR5cGVSZWxhdGlvbnMuc3RyZWFtKCkuY29sbGVjdCh0b01hcChSZWxhdGlvbjo6Z2V0TmFtZSwgaWRlbnRpdHkoKSkpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVsYXRpb25zQnlFbnRpdHkucHV0KHRhcmdldCwgZW50aXR5VHlwZVJlbGF0aW9ucy5nZXQoMCkpOworCQkJfQorCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRyaWVzIHRvIGZpbmQgYSBwYXJlbnQge0BsaW5rIFJlbGF0aW9ufSB0byBnaXZlbiB0YXJnZXQge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgcGFyZW50IHtAY29kZSBSZWxhdGlvbn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIG5vIHN1Y2gge0Bjb2RlIFJlbGF0aW9ufSBleGlzdHMuCisJICovCisJcHJpdmF0ZSBSZWxhdGlvbiBnZXRQYXJlbnRSZWxhdGlvbihFbnRpdHlUeXBlIHRhcmdldCkgeworCQlyZXR1cm4gZ2V0UGFyZW50UmVsYXRpb25zKCkuc3RyZWFtKCkuZmlsdGVyKGV0IC0+IGV0LmdldFRhcmdldCgpLmVxdWFscyh0YXJnZXQpKS5maW5kQW55KCkub3JFbHNlVGhyb3coCisJCQkJKCkgLT4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRpb24gdG8gZW50aXR5IHR5cGUgJyIgKyB0YXJnZXQgKyAiJyBkb2VzIG5vdCBleGlzdC4iKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgUmVsYXRpb259LgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uIHtAY29kZSBSZWxhdGlvbn0gd2hpY2ggd2lsbCBiZSBhZGRlZC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkUmVsYXRpb24oUmVsYXRpb24gcmVsYXRpb24pIHsKKwkJcmVsYXRpb25zQnlUeXBlLmNvbXB1dGVJZkFic2VudChyZWxhdGlvbi5nZXRSZWxhdGlvblR5cGUoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkuYWRkKHJlbGF0aW9uKTsKKwkJcmVsYXRpb25zLmFkZChyZWxhdGlvbik7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTTW9kZWxNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTTW9kZWxNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3ZjdmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNNb2RlbE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDQ0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuZ3JvdXBpbmdCeTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5BSUROYW1lOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BZ2dyRnVuYzsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQXBwbEVsZW07CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxFbGVtQWNjZXNzOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsUmVsOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsaWNhdGlvblN0cnVjdHVyZVZhbHVlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtUmVzdWx0U2V0RXh0OworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbnVtZXJhdGlvbkF0dHJpYnV0ZVN0cnVjdHVyZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuRW51bWVyYXRpb25JdGVtU3RydWN0dXJlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbnVtZXJhdGlvblN0cnVjdHVyZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuSm9pbkRlZjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuUXVlcnlTdHJ1Y3R1cmVFeHQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNlbEFJRE5hbWVVbml0SWQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNlbEl0ZW07CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNlbE9yZGVyOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkRlZmF1bHRFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZ1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNFbnVtZXJhdGlvbnM7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBPRFMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNb2RlbE1hbmFnZXJ9IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIE9EU01vZGVsTWFuYWdlciBpbXBsZW1lbnRzIE1vZGVsTWFuYWdlciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT0RTTW9kZWxNYW5hZ2VyLmNsYXNzKTsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRW50aXR5VHlwZT4gZW50aXR5VHlwZXNCeU5hbWUgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIE9SQiBvcmI7CisKKwlwcml2YXRlIGZpbmFsIExvY2sgd3JpdGU7CisJcHJpdmF0ZSBmaW5hbCBMb2NrIHJlYWQ7CisKKwlwcml2YXRlIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnkgZW50aXR5Q29uZmlnUmVwb3NpdG9yeTsKKwlwcml2YXRlIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIgZW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcjsKKworCXByaXZhdGUgQXBwbEVsZW1BY2Nlc3MgYXBwbEVsZW1BY2Nlc3M7CisJcHJpdmF0ZSBBb1Nlc3Npb24gYW9TZXNzaW9uOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gb3JiICAgICAgIFVzZWQgdG8gYWN0aXZhdGUgQ09SQkEgc2VydmljZSBvYmplY3RzLgorCSAqIEBwYXJhbSBhb1Nlc3Npb24gVGhlIHVuZGVybHlpbmcgT0RTIHNlc3Npb24uCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gb24gZXJyb3JzLgorCSAqLworCXB1YmxpYyBPRFNNb2RlbE1hbmFnZXIoT1JCIG9yYiwgQW9TZXNzaW9uIGFvU2Vzc2lvbikgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJdGhpcyhvcmIsIGFvU2Vzc2lvbiwgbmV3IERlZmF1bHRFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyKCkpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG9yYiAgICAgICBVc2VkIHRvIGFjdGl2YXRlIENPUkJBIHNlcnZpY2Ugb2JqZWN0cy4KKwkgKiBAcGFyYW0gYW9TZXNzaW9uIFRoZSB1bmRlcmx5aW5nIE9EUyBzZXNzaW9uLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIG9uIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgT0RTTW9kZWxNYW5hZ2VyKE9SQiBvcmIsIEFvU2Vzc2lvbiBhb1Nlc3Npb24sIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIgZW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcikKKwkJCXRocm93cyBBb0V4Y2VwdGlvbiB7CisJCXRoaXMuYW9TZXNzaW9uID0gYW9TZXNzaW9uOworCQl0aGlzLm9yYiA9IG9yYjsKKwkJYXBwbEVsZW1BY2Nlc3MgPSBhb1Nlc3Npb24uZ2V0QXBwbEVsZW1BY2Nlc3MoKTsKKwkJdGhpcy5lbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyID0gZW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcjsKKworCQkvLyBzZXR1cCBsb2NrcworCQlSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHJlZW50cmFudFJlYWRXcml0ZUxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworCQl3cml0ZSA9IHJlZW50cmFudFJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCk7CisJCXJlYWQgPSByZWVudHJhbnRSZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCk7CisKKwkJaW5pdGlhbGl6ZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBPUkJ9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9SQn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIE9SQiBnZXRPUkIoKSB7CisJCXJldHVybiBvcmI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbm9uIHJvb3Qge0BsaW5rIEVudGl0eUNvbmZpZ30gZm9yIGdpdmVuIHtAbGluayBLZXl9LgorCSAqCisJICogQHBhcmFtIDxUPiBUaGUgY29uY3JldGUgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGtleSBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUgbm9uIHJvb3Qge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBFbnRpdHlDb25maWc8VD4gZmluZEVudGl0eUNvbmZpZyhLZXk8VD4ga2V5KSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kKGtleSk7CisJCX0gZmluYWxseSB7CisJCQlyZWFkLnVubG9jaygpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcm9vdCB7QGxpbmsgRW50aXR5Q29uZmlnfSBmb3IgZ2l2ZW4ge0BsaW5rIEtleX0uCisJICoKKwkgKiBAcGFyYW0gPFQ+IFRoZSBjb25jcmV0ZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0ga2V5IFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSByb290IHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gRW50aXR5Q29uZmlnPFQ+IGdldEVudGl0eUNvbmZpZyhLZXk8VD4ga2V5KSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChrZXkpOworCQl9IGZpbmFsbHkgeworCQkJcmVhZC51bmxvY2soKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBFbnRpdHlDb25maWd9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEVudGl0eUNvbmZpZzw/PiBnZXRFbnRpdHlDb25maWcoRW50aXR5VHlwZSBlbnRpdHlUeXBlKSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kKGVudGl0eVR5cGUpOworCQl9IGZpbmFsbHkgeworCQkJcmVhZC51bmxvY2soKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxFbnRpdHlUeXBlPiBsaXN0RW50aXR5VHlwZXMoKSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PD4oZW50aXR5VHlwZXNCeU5hbWUudmFsdWVzKCkpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWQudW5sb2NrKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZShDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcykgeworCQlyZWFkLmxvY2soKTsKKworCQl0cnkgeworCQkJcmV0dXJuIGdldEVudGl0eUNvbmZpZyhuZXcgS2V5PD4oZW50aXR5Q2xhc3MpKS5nZXRFbnRpdHlUeXBlKCk7CisJCX0gZmluYWxseSB7CisJCQlyZWFkLnVubG9jaygpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gZ2V0RW50aXR5Q29uZmlnKG5ldyBLZXk8PihlbnRpdHlDbGFzcywgY29udGV4dFR5cGUpKS5nZXRFbnRpdHlUeXBlKCk7CisJCX0gZmluYWxseSB7CisJCQlyZWFkLnVubG9jaygpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoU3RyaW5nIG5hbWUpIHsKKwkJcmVhZC5sb2NrKCk7CisKKwkJdHJ5IHsKKwkJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IGVudGl0eVR5cGVzQnlOYW1lLmdldChuYW1lKTsKKwkJCWlmIChlbnRpdHlUeXBlID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnRpdHkgd2l0aCBuYW1lICciICsgbmFtZSArICInIG5vdCBmb3VuZC4iKTsKKwkJCX0KKworCQkJcmV0dXJuIGVudGl0eVR5cGU7CisJCX0gZmluYWxseSB7CisJCQlyZWFkLnVubG9jaygpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZUJ5SWQoU3RyaW5nIGlkKSB7CisJCU9wdGlvbmFsPEVudGl0eVR5cGU+IGVudGl0eVR5cGUgPSBsaXN0RW50aXR5VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoZXQgLT4gZXQuZ2V0SWQoKS5lcXVhbHMoaWQpKS5maW5kRmlyc3QoKTsKKwkJaWYgKCFlbnRpdHlUeXBlLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnRpdHkgd2l0aCBpZCAnIiArIGlkICsgIicgbm90IGZvdW5kLiIpOworCQl9CisKKwkJcmV0dXJuIGVudGl0eVR5cGUuZ2V0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEFvU2Vzc2lvbn0gb2YgdGhpcyBtb2RlbCBtYW5hZ2VyLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEFvU2Vzc2lvbn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEFvU2Vzc2lvbiBnZXRBb1Nlc3Npb24oKSB7CisJCXdyaXRlLmxvY2soKTsKKworCQl0cnkgeworCQkJcmV0dXJuIGFvU2Vzc2lvbjsKKwkJfSBmaW5hbGx5IHsKKwkJCXdyaXRlLnVubG9jaygpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEFwcGxFbGVtQWNjZXNzfSBvZiB0aGlzIG1vZGVsIG1hbmFnZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQXBwbEVsZW1BY2Nlc3N9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBBcHBsRWxlbUFjY2VzcyBnZXRBcHBsRWxlbUFjY2VzcygpIHsKKwkJcmVhZC5sb2NrKCk7CisKKwkJdHJ5IHsKKwkJCXJldHVybiBhcHBsRWxlbUFjY2VzczsKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWQudW5sb2NrKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDbG9zZXMgdGhlIE9EUyBjb25uZWN0aW9uLgorCSAqCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gb24gZXJyb3JzLgorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJcmVhZC5sb2NrKCk7CisKKwkJdHJ5IHsKKwkJCWFwcGxFbGVtQWNjZXNzLl9yZWxlYXNlKCk7CisJCQlhb1Nlc3Npb24uY2xvc2UoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWQudW5sb2NrKCk7CisJCQlhb1Nlc3Npb24uX3JlbGVhc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbG9hZHMgdGhlIGNvbXBsZXRlIHNlc3Npb24gY29udGV4dC4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZWxvYWRBcHBsaWNhdGlvbk1vZGVsKCkgeworCQl3cml0ZS5sb2NrKCk7CisKKwkJQW9TZXNzaW9uIGFvU2Vzc2lvbk9sZCA9IGFvU2Vzc2lvbjsKKwkJQXBwbEVsZW1BY2Nlc3MgYXBwbEVsZW1BY2Nlc3NPbGQgPSBhcHBsRWxlbUFjY2VzczsKKwkJdHJ5IHsKKwkJCWVudGl0eVR5cGVzQnlOYW1lLmNsZWFyKCk7CisKKwkJCWFvU2Vzc2lvbiA9IGFvU2Vzc2lvbi5jcmVhdGVDb1Nlc3Npb24oKTsKKwkJCWFwcGxFbGVtQWNjZXNzID0gYW9TZXNzaW9uLmdldEFwcGxFbGVtQWNjZXNzKCk7CisJCQlpbml0aWFsaXplKCk7CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCUxPR0dFUi5lcnJvcigiVW5hYmxlIHRvIHJlbG9hZCB0aGUgYXBwbGljYXRpb24gbW9kZWwgZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9IGZpbmFsbHkgeworCQkJd3JpdGUudW5sb2NrKCk7CisJCX0KKworCQl0cnkgeworCQkJYXBwbEVsZW1BY2Nlc3NPbGQuX3JlbGVhc2UoKTsKKwkJCWFvU2Vzc2lvbk9sZC5jbG9zZSgpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQlMT0dHRVIuZGVidWcoIlVuYWJsZSB0byBjbG9zZSByZXBsYWNlZCBzZXNzaW9uIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWFvU2Vzc2lvbk9sZC5fcmVsZWFzZSgpOworCQl9CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhpcyBtb2RlbCBtYW5hZ2VyIGJ5IGNhY2hpbmcgdGhlIGFwcGxpY2F0aW9uIG1vZGVsIGFuZCBsb2FkaW5nCisJICogdGhlIHtAbGluayBFbnRpdHlDb25maWd9cy4KKwkgKgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIG9uIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCWxvYWRBcHBsaWNhdGlvbk1vZGVsKCk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkgPSBlbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmxvYWRFbnRpdHlDb25maWd1cmF0aW9ucyh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDYWNoZXMgdGhlIHdob2xlIGFwcGxpY2F0aW9uIG1vZGVsIGFzIHByb3ZpZGVkIGJ5IHRoZSBPRFMgc2Vzc2lvbi4KKwkgKgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIG9uIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgbG9hZEFwcGxpY2F0aW9uTW9kZWwoKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQlMT0dHRVIuZGVidWcoIlJlYWRpbmcgdGhlIGFwcGxpY2F0aW9uIG1vZGVsLi4uIik7CisKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgRW51bWVyYXRpb248Pz4+PiBlbnVtQ2xhc3NNYXAgPSBsb2FkT0RTRW51bWVyYXRpb25zKCk7CisKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlBcHBsaWNhdGlvblN0cnVjdHVyZVZhbHVlIGFwcGxpY2F0aW9uU3RydWN0dXJlVmFsdWUgPSBhb1Nlc3Npb24uZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZSgpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHVuaXRzID0gZ2V0VW5pdE1hcHBpbmcoYXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZS5hcHBsRWxlbXMpOworCisJCS8vIGNyZWF0ZSBlbnRpdHkgdHlwZXMgKGluY2wuIGF0dHJpYnV0ZXMpCisJCU1hcDxTdHJpbmcsIE9EU0VudGl0eVR5cGU+IGVudGl0eVR5cGVzQnlJRCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJU3RyaW5nIHNvdXJjZU5hbWUgPSBhb1Nlc3Npb24uZ2V0TmFtZSgpOworCQlmb3IgKEFwcGxFbGVtIGFwcGxFbGVtIDogYXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZS5hcHBsRWxlbXMpIHsKKwkJCVN0cmluZyBvZHNJRCA9IExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGFwcGxFbGVtLmFpZCkpOworCQkJTWFwPFN0cmluZywgRW51bWVyYXRpb248Pz4+IGVudGl0eUVudW1NYXAgPSBlbnVtQ2xhc3NNYXAuZ2V0T3JEZWZhdWx0KG9kc0lELCBuZXcgSGFzaE1hcDw+KCkpOworCisJCQlPRFNFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBuZXcgT0RTRW50aXR5VHlwZShzb3VyY2VOYW1lLCBhcHBsRWxlbSwgdW5pdHMsIGVudGl0eUVudW1NYXApOworCQkJZW50aXR5VHlwZXNCeU5hbWUucHV0KGFwcGxFbGVtLmFlTmFtZSwgZW50aXR5VHlwZSk7CisJCQllbnRpdHlUeXBlc0J5SUQucHV0KG9kc0lELCBlbnRpdHlUeXBlKTsKKwkJfQorCisJCS8vIGNyZWF0ZSByZWxhdGlvbnMKKwkJTGlzdDxSZWxhdGlvbj4gcmVsYXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoQXBwbFJlbCBhcHBsUmVsIDogYXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZS5hcHBsUmVscykgeworCQkJRW50aXR5VHlwZSBzb3VyY2UgPSBlbnRpdHlUeXBlc0J5SUQuZ2V0KExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGFwcGxSZWwuZWxlbTEpKSk7CisJCQlFbnRpdHlUeXBlIHRhcmdldCA9IGVudGl0eVR5cGVzQnlJRC5nZXQoTG9uZy50b1N0cmluZyhPRFNDb252ZXJ0ZXIuZnJvbU9EU0xvbmcoYXBwbFJlbC5lbGVtMikpKTsKKwkJCXJlbGF0aW9ucy5hZGQobmV3IE9EU1JlbGF0aW9uKGFwcGxSZWwsIHNvdXJjZSwgdGFyZ2V0KSk7CisJCX0KKworCQkvLyBhc3NpZ24gcmVsYXRpb25zIHRvIHRoZWlyIHNvdXJjZSBlbnRpdHkgdHlwZXMKKwkJcmVsYXRpb25zLnN0cmVhbSgpLmNvbGxlY3QoZ3JvdXBpbmdCeShSZWxhdGlvbjo6Z2V0U291cmNlKSkKKwkJCQkuZm9yRWFjaCgoZSwgcikgLT4gKChPRFNFbnRpdHlUeXBlKSBlKS5zZXRSZWxhdGlvbnMocikpOworCisJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlMT0dHRVIuZGVidWcoInt9IGVudGl0eSB0eXBlcyB3aXRoIHt9IHJlbGF0aW9ucyBmb3VuZCBpbiB7fSBtcy4iLCBlbnRpdHlUeXBlc0J5TmFtZS5zaXplKCksIHJlbGF0aW9ucy5zaXplKCksCisJCQkJc3RvcCAtIHN0YXJ0KTsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEVudW1lcmF0aW9uPD8+Pj4gbG9hZE9EU0VudW1lcmF0aW9ucygpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCUxPR0dFUi5kZWJ1ZygiTG9hZGluZyBPRFMgZW51bWVyYXRpb25zLi4uIik7CisJCWxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQkvLyBlbnVtZXJhdGlvbiBtYXBwaW5ncyAoYWVJRCAtPiAoYWFOYW1lIC0+IGVudW1DbGFzcykpCisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEVudW1lcmF0aW9uPD8+Pj4gZW51bUNsYXNzTWFwID0gbmV3IEhhc2hNYXA8PigpOworCQlFbnVtUmVnaXN0cnkgZXIgPSBFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKKworCQlNYXA8U3RyaW5nLCBFbnVtZXJhdGlvbkl0ZW1TdHJ1Y3R1cmVbXT4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworCQlmb3IgKEVudW1lcmF0aW9uU3RydWN0dXJlIGVzIDogYW9TZXNzaW9uLmdldEVudW1lcmF0aW9uU3RydWN0dXJlKCkpIHsKKwkJCW1hcC5wdXQoZXMuZW51bU5hbWUsIGVzLml0ZW1zKTsKKwkJfQorCisJCWZvciAoRW51bWVyYXRpb25BdHRyaWJ1dGVTdHJ1Y3R1cmUgZWFzIDogYW9TZXNzaW9uLmdldEVudW1lcmF0aW9uQXR0cmlidXRlcygpKSB7CisKKwkJCS8vIG1ha2Ugc3VyZSB0aGUgZW51bWVyYXRpb24gaXMgZm91bmQKKwkJCWlmIChPRFNFbnVtZXJhdGlvbnMuZ2V0RW51bU9iaihlYXMuZW51bU5hbWUpID09IG51bGwpIHsKKwkJCQlFbnVtZXJhdGlvbjxPRFNFbnVtPiBlbnVtZHluID0gbmV3IEVudW1lcmF0aW9uPD4oT0RTRW51bS5jbGFzcywgZWFzLmVudW1OYW1lKTsKKwkJCQlmb3IgKEVudW1lcmF0aW9uSXRlbVN0cnVjdHVyZSBlbnVtSXRlbVN0cnVjdCA6IG1hcC5nZXQoZWFzLmVudW1OYW1lKSkgeworCQkJCQlMT0dHRVIudHJhY2UoInt9Ont9Ont9IiwgZWFzLmVudW1OYW1lLCBlbnVtSXRlbVN0cnVjdC5pdGVtTmFtZSwgZW51bUl0ZW1TdHJ1Y3QuaW5kZXgpOworCQkJCQllbnVtZHluLmFkZFZhbHVlKG5ldyBPRFNFbnVtKGVudW1JdGVtU3RydWN0Lml0ZW1OYW1lLCBlbnVtSXRlbVN0cnVjdC5pbmRleCkpOworCQkJCX0KKwkJCQllci5hZGQoZWFzLmVudW1OYW1lLCBlbnVtZHluKTsKKwkJCX0KKworCQkJZW51bUNsYXNzTWFwLmNvbXB1dGVJZkFic2VudChMb25nLnRvU3RyaW5nKE9EU0NvbnZlcnRlci5mcm9tT0RTTG9uZyhlYXMuYWlkKSksIGsgLT4gbmV3IEhhc2hNYXA8PigpKQorCQkJCQkucHV0KGVhcy5hYU5hbWUsIE9EU0VudW1lcmF0aW9ucy5nZXRFbnVtT2JqKGVhcy5lbnVtTmFtZSkpOworCQl9CisJCUxPR0dFUi5kZWJ1ZygiTG9hZGluZyBlbnVtZXJhdGlvbnMgdG9vayB7fW1zIiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0MSk7CisJCXJldHVybiBlbnVtQ2xhc3NNYXA7CisJfQorCisJLyoqCisJICogTG9hZHMgYWxsIGF2YWlsYWJsZSB7QGxpbmsgVW5pdH0gbmFtZXMgbWFwcGVkIGJ5IHRoZWlyIGluc3RhbmNlIElEcy4KKwkgKgorCSAqIEBwYXJhbSBhcHBsRWxlbXMgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgbWV0YSBkYXRhIGluc3RhbmNlcy4KKwkgKiBAcmV0dXJuIFRoZSB1bml0IG5hbWVzIG1hcHBlZCBieSB0aGUgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBJRHMuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgdGhlIHVuaXQgbWFwcGluZ3MuCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFVuaXRNYXBwaW5nKEFwcGxFbGVtW10gYXBwbEVsZW1zKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQlBcHBsRWxlbSB1bml0RWxlbSA9IFN0cmVhbS5vZihhcHBsRWxlbXMpLmZpbHRlcihhZSAtPiBhZS5iZU5hbWUuZXF1YWxzKCJBb1VuaXQiKSkuZmluZEFueSgpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFwcGxpY2F0aW9uIGVsZW1lbnQgJ1VuaXQnIGlzIG5vdCBkZWZpbmVkLiIpKTsKKworCQlRdWVyeVN0cnVjdHVyZUV4dCBxc2UgPSBuZXcgUXVlcnlTdHJ1Y3R1cmVFeHQoKTsKKwkJcXNlLmFudVNlcSA9IG5ldyBTZWxBSUROYW1lVW5pdElkW10geworCQkJCW5ldyBTZWxBSUROYW1lVW5pdElkKG5ldyBBSUROYW1lKHVuaXRFbGVtLmFpZCwgIklkIiksIG5ldyBUX0xPTkdMT05HKCksIEFnZ3JGdW5jLk5PTkUpLAorCQkJCW5ldyBTZWxBSUROYW1lVW5pdElkKG5ldyBBSUROYW1lKHVuaXRFbGVtLmFpZCwgIk5hbWUiKSwgbmV3IFRfTE9OR0xPTkcoKSwgQWdnckZ1bmMuTk9ORSkgfTsKKwkJcXNlLmNvbmRTZXEgPSBuZXcgU2VsSXRlbVswXTsKKwkJcXNlLmdyb3VwQnkgPSBuZXcgQUlETmFtZVswXTsKKwkJcXNlLmpvaW5TZXEgPSBuZXcgSm9pbkRlZlswXTsKKwkJcXNlLm9yZGVyQnkgPSBuZXcgU2VsT3JkZXJbMF07CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiB1bml0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJRWxlbVJlc3VsdFNldEV4dCB1bml0UmVzdWx0U2V0RXh0ID0gZ2V0QXBwbEVsZW1BY2Nlc3MoKS5nZXRJbnN0YW5jZXNFeHQocXNlLCAwKVswXS5maXJzdEVsZW1zWzBdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXRSZXN1bHRTZXRFeHQudmFsdWVzWzBdLnZhbHVlLmZsYWcubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyB1bml0SUQgPSBMb25nCisJCQkJCS50b1N0cmluZyhPRFNDb252ZXJ0ZXIuZnJvbU9EU0xvbmcodW5pdFJlc3VsdFNldEV4dC52YWx1ZXNbMF0udmFsdWUudS5sb25nbG9uZ1ZhbCgpW2ldKSk7CisJCQlTdHJpbmcgdW5pdE5hbWUgPSB1bml0UmVzdWx0U2V0RXh0LnZhbHVlc1sxXS52YWx1ZS51LnN0cmluZ1ZhbCgpW2ldOworCQkJdW5pdHMucHV0KHVuaXRJRCwgdW5pdE5hbWUpOworCQl9CisKKwkJcmV0dXJuIHVuaXRzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNRdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU1F1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3NDhjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5BSUROYW1lOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BSUROYW1lVW5pdElkOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQXBwbEVsZW1BY2Nlc3M7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkVsZW1SZXN1bHRTZXRFeHQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkpvaW5EZWY7CitpbXBvcnQgb3JnLmFzYW0ub2RzLk5hbWVWYWx1ZVNlcVVuaXRJZDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuUXVlcnlTdHJ1Y3R1cmVFeHQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlJlc3VsdFNldEV4dDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuU2VsQUlETmFtZVVuaXRJZDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuU2VsSXRlbTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuU2VsT3JkZXI7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNlbFZhbHVlRXh0OworaW1wb3J0IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkNvbmRpdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Kb2luVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU1V0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CisKKy8qKgorICogT0RTIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgUXVlcnl9IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIE9EU1F1ZXJ5IGltcGxlbWVudHMgUXVlcnkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPRFNRdWVyeS5jbGFzcyk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfTkFNRSA9ICJuYW1lIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfQUdHUkZVTkMgPSAiYWdncmZ1bmMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gQUdHUkVHQVRJT05fTkFNRV9QQVRURVJOID0gUGF0dGVybgorCQkJLmNvbXBpbGUoIig/PCIgKyBHUk9VUF9BR0dSRlVOQyArICI+XFxTKylcXCgoPzwiICsgR1JPVVBfTkFNRSArICI+XFxTKylcXCkiKTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEVudGl0eVR5cGU+IGVudGl0eVR5cGVzQnlJRCA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIFNldDxFbnRpdHlUeXBlPiBxdWVyaWVkRW50aXR5VHlwZXMgPSBuZXcgSGFzaFNldDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBMaXN0PFNlbEFJRE5hbWVVbml0SWQ+IGFudVNlcSA9IG5ldyBBcnJheUxpc3Q8PigpOworCXByaXZhdGUgZmluYWwgTGlzdDxKb2luRGVmPiBqb2luU2VxID0gbmV3IEFycmF5TGlzdDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBMaXN0PEFJRE5hbWU+IGdyb3VwQnkgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8U2VsT3JkZXI+IG9yZGVyQnkgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCXByaXZhdGUgZmluYWwgQXBwbEVsZW1BY2Nlc3MgYXBwbEVsZW1BY2Nlc3M7CisKKwlwcml2YXRlIGludCBsaW1pdDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBhcHBsRWxlbUFjY2VzcyBVc2VkIHRvIGV4ZWN1dGUgdGhlIHF1ZXJ5LgorCSAqLworCU9EU1F1ZXJ5KEFwcGxFbGVtQWNjZXNzIGFwcGxFbGVtQWNjZXNzKSB7CisJCXRoaXMuYXBwbEVsZW1BY2Nlc3MgPSBhcHBsRWxlbUFjY2VzczsKKwkJbGltaXQgPSAwOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1F1ZXJpZWQoRW50aXR5VHlwZSBlbnRpdHlUeXBlKSB7CisJCXJldHVybiBxdWVyaWVkRW50aXR5VHlwZXMuY29udGFpbnMoZW50aXR5VHlwZSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBRdWVyeSBsaW1pdChpbnQgbGltaXQpIHsKKwkJdGhpcy5saW1pdCA9IGxpbWl0OworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFF1ZXJ5IHNlbGVjdChBdHRyaWJ1dGUgYXR0cmlidXRlLCBBZ2dyZWdhdGlvbiBhZ2dyZWdhdGlvbikgeworCQlFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBhdHRyaWJ1dGUuZ2V0RW50aXR5VHlwZSgpOworCQllbnRpdHlUeXBlc0J5SUQucHV0KExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKCgoT0RTRW50aXR5VHlwZSkgZW50aXR5VHlwZSkuZ2V0T0RTSUQoKSkpLAorCQkJCWVudGl0eVR5cGUpOworCQlxdWVyaWVkRW50aXR5VHlwZXMuYWRkKGVudGl0eVR5cGUpOworCQlhbnVTZXEuYWRkKGNyZWF0ZVNlbGVjdChhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uKSk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUXVlcnkgam9pbihSZWxhdGlvbiByZWxhdGlvbiwgSm9pblR5cGUgam9pbikgeworCQlxdWVyaWVkRW50aXR5VHlwZXMuYWRkKHJlbGF0aW9uLmdldFNvdXJjZSgpKTsKKwkJcXVlcmllZEVudGl0eVR5cGVzLmFkZChyZWxhdGlvbi5nZXRUYXJnZXQoKSk7CisJCWpvaW5TZXEuYWRkKGNyZWF0ZUpvaW4ocmVsYXRpb24sIGpvaW4pKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBRdWVyeSBncm91cChMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcykgeworCQlmb3IgKEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGVzKSB7CisJCQlncm91cChhdHRyaWJ1dGUpOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUXVlcnkgZ3JvdXAoQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlncm91cEJ5LmFkZChjcmVhdGVBSUROYW1lKGF0dHJpYnV0ZSkpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFF1ZXJ5IG9yZGVyKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIGJvb2xlYW4gYXNjZW5kaW5nKSB7CisJCW9yZGVyQnkuYWRkKGNyZWF0ZU9yZGVyQnkoYXR0cmlidXRlLCBhc2NlbmRpbmcpKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPcHRpb25hbDxSZXN1bHQ+IGZldGNoU2luZ2xldG9uKEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTGlzdDxSZXN1bHQ+IHJlc3VsdHMgPSBmZXRjaChmaWx0ZXIpOworCQlpZiAocmVzdWx0cy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCQl9IGVsc2UgaWYgKHJlc3VsdHMuc2l6ZSgpID4gMSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIk11bHRpcGxlIHJlc3VsdHMgZm91bmQgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBzaW5nbGV0b24gcXVlcnkhIik7CisJCX0KKworCQlyZXR1cm4gT3B0aW9uYWwub2YocmVzdWx0cy5nZXQoMCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxSZXN1bHQ+IGZldGNoKEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKworCQkJTGlzdDxTZWxJdGVtPiBjb25kU2VxID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlpbnQgY29uZENvdW50ID0gMDsKKwkJCWZvciAoRmlsdGVySXRlbSBjb25kaXRpb25JdGVtIDogZmlsdGVyKSB7CisJCQkJU2VsSXRlbSBzZWxJdGVtID0gbmV3IFNlbEl0ZW0oKTsKKwkJCQlpZiAoY29uZGl0aW9uSXRlbS5pc0NvbmRpdGlvbigpKSB7CisJCQkJCXNlbEl0ZW0udmFsdWUoY3JlYXRlQ29uZGl0aW9uKGNvbmRpdGlvbkl0ZW0uZ2V0Q29uZGl0aW9uKCkpKTsKKwkJCQl9IGVsc2UgaWYgKGNvbmRpdGlvbkl0ZW0uaXNCcmFja2V0T3BlcmF0b3IoKSkgeworCQkJCQlzZWxJdGVtLl9vcGVyYXRvcihPRFNVdGlscy5CUkFDS0VUT1BFUkFUT1JTLmdldChjb25kaXRpb25JdGVtLmdldEJyYWNrZXRPcGVyYXRvcigpKSk7CisJCQkJfSBlbHNlIGlmIChjb25kaXRpb25JdGVtLmlzQm9vbGVhbk9wZXJhdG9yKCkpIHsKKwkJCQkJc2VsSXRlbS5fb3BlcmF0b3IoT0RTVXRpbHMuT1BFUkFUT1JTLmdldChjb25kaXRpb25JdGVtLmdldEJvb2xlYW5PcGVyYXRvcigpKSk7CisJCQkJCWNvbmRDb3VudCsrOworCQkJCX0gZWxzZSB7CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhc3NlZCBmaWx0ZXIgaXRlbSBpcyBuZWl0aGVyIGFuIG9wZXJhdG9yIG5vciBhIGNvbmRpdGlvbi4iKTsKKwkJCQl9CisKKwkJCQljb25kU2VxLmFkZChzZWxJdGVtKTsKKwkJCX0KKworCQkJUXVlcnlTdHJ1Y3R1cmVFeHQgcXNlID0gbmV3IFF1ZXJ5U3RydWN0dXJlRXh0KCk7CisJCQlxc2UuYW51U2VxID0gYW51U2VxLnRvQXJyYXkobmV3IFNlbEFJRE5hbWVVbml0SWRbYW51U2VxLnNpemUoKV0pOworCQkJcXNlLmNvbmRTZXEgPSBjb25kU2VxLnRvQXJyYXkobmV3IFNlbEl0ZW1bY29uZFNlcS5zaXplKCldKTsKKwkJCXFzZS5ncm91cEJ5ID0gZ3JvdXBCeS50b0FycmF5KG5ldyBBSUROYW1lW2dyb3VwQnkuc2l6ZSgpXSk7CisJCQlxc2Uuam9pblNlcSA9IGpvaW5TZXEudG9BcnJheShuZXcgSm9pbkRlZltqb2luU2VxLnNpemUoKV0pOworCQkJcXNlLm9yZGVyQnkgPSBvcmRlckJ5LnRvQXJyYXkobmV3IFNlbE9yZGVyW29yZGVyQnkuc2l6ZSgpXSk7CisKKwkJCUxpc3Q8UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlmb3IgKFJlc3VsdCByZXN1bHQgOiBuZXcgUmVzdWx0RmFjdG9yeShlbnRpdHlUeXBlc0J5SUQsIGFwcGxFbGVtQWNjZXNzLmdldEluc3RhbmNlc0V4dChxc2UsIGxpbWl0KVswXSkpIHsKKwkJCQlyZXN1bHRzLmFkZChyZXN1bHQpOworCQkJfQorCQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJCUxPR0dFUi5kZWJ1ZygiUXVlcnkgZXhlY3V0ZWQgaW4ge30gbXMgYW5kIHJldHJpZXZlZCB7fSByZXN1bHQgcm93cyAoe30gc2VsZWN0aW9ucywge30gY29uZGl0aW9ucywgIgorCQkJCQkrICJ7fSBqb2lucykuIiwgc3RvcCAtIHN0YXJ0LCByZXN1bHRzLnNpemUoKSwgYW51U2VxLnNpemUoKSwgY29uZENvdW50LCBqb2luU2VxLnNpemUoKSk7CisJCQlyZXR1cm4gcmVzdWx0czsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gYW9lKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbihhb2UucmVhc29uLCBhb2UpOworCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9IGFuZCB7QGxpbmsgQWdncmVnYXRpb259IHRvIGFuIE9EUworCSAqIHtAbGluayBTZWxBSUROYW1lVW5pdElkfS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgICBUaGUge0Bjb2RlIEF0dHJpYnV0ZX0uCisJICogQHBhcmFtIGFnZ3JlZ2F0aW9uIFRoZSB7QGNvZGUgQWdncmVnYXRpb259LgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFNlbEFJRE5hbWVVbml0SWR9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgU2VsQUlETmFtZVVuaXRJZCBjcmVhdGVTZWxlY3QoQXR0cmlidXRlIGF0dHJpYnV0ZSwgQWdncmVnYXRpb24gYWdncmVnYXRpb24pIHsKKwkJU2VsQUlETmFtZVVuaXRJZCBzYW51ID0gbmV3IFNlbEFJRE5hbWVVbml0SWQoKTsKKworCQlzYW51LmFnZ3JlZ2F0ZSA9IE9EU1V0aWxzLkFHR1JFR0FUSU9OUy5nZXQoYWdncmVnYXRpb24pOworCQlzYW51LmF0dHIgPSBjcmVhdGVBSUROYW1lKGF0dHJpYnV0ZSk7CisJCXNhbnUudW5pdElkID0gbmV3IFRfTE9OR0xPTkcoKTsKKworCQlyZXR1cm4gc2FudTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgQ29uZGl0aW9ufSB0byBhbiBPRFMge0BsaW5rIFNlbFZhbHVlRXh0fS4KKwkgKgorCSAqIEBwYXJhbSBjb25kaXRpb24gVGhlIHtAY29kZSBDb25kaXRpb259LgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFNlbFZhbHVlRXh0fSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqLworCXByaXZhdGUgU2VsVmFsdWVFeHQgY3JlYXRlQ29uZGl0aW9uKENvbmRpdGlvbiBjb25kaXRpb24pIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJU2VsVmFsdWVFeHQgc3ZlID0gbmV3IFNlbFZhbHVlRXh0KCk7CisKKwkJc3ZlLm9wZXIgPSBPRFNVdGlscy5PUEVSQVRJT05TLmdldChjb25kaXRpb24uZ2V0Q29tcGFyaXNvbk9wZXJhdG9yKCkpOworCQlzdmUuYXR0ciA9IG5ldyBBSUROYW1lVW5pdElkKCk7CisJCXN2ZS5hdHRyLnVuaXRJZCA9IG5ldyBUX0xPTkdMT05HKCk7CisJCXN2ZS5hdHRyLmF0dHIgPSBjcmVhdGVBSUROYW1lKGNvbmRpdGlvbi5nZXRBdHRyaWJ1dGUoKSk7CisJCXN2ZS52YWx1ZSA9IE9EU0NvbnZlcnRlci50b09EU1ZhbHVlKGNvbmRpdGlvbi5nZXRBdHRyaWJ1dGUoKSwgY29uZGl0aW9uLmdldFZhbHVlKCkpOworCisJCXJldHVybiBzdmU7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFJlbGF0aW9ufSBhbmQge0BsaW5rIEpvaW5UeXBlfSB0byBhbiBPRFMKKwkgKiB7QGxpbmsgSm9pbkRlZn0uCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb24gVGhlIHtAY29kZSBSZWxhdGlvbn0uCisJICogQHBhcmFtIGpvaW4gICAgIFRoZSB7QGNvZGUgSm9pblR5cGV9LgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIEpvaW5EZWZ9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgSm9pbkRlZiBjcmVhdGVKb2luKFJlbGF0aW9uIHJlbGF0aW9uLCBKb2luVHlwZSBqb2luKSB7CisJCUpvaW5EZWYgam9pbkRlZiA9IG5ldyBKb2luRGVmKCk7CisKKwkJam9pbkRlZi5mcm9tQUlEID0gKChPRFNFbnRpdHlUeXBlKSByZWxhdGlvbi5nZXRTb3VyY2UoKSkuZ2V0T0RTSUQoKTsKKwkJam9pbkRlZi50b0FJRCA9ICgoT0RTRW50aXR5VHlwZSkgcmVsYXRpb24uZ2V0VGFyZ2V0KCkpLmdldE9EU0lEKCk7CisJCWpvaW5EZWYucmVmTmFtZSA9IHJlbGF0aW9uLmdldE5hbWUoKTsKKwkJam9pbkRlZi5qb2luaW5nVHlwZSA9IE9EU1V0aWxzLkpPSU5TLmdldChqb2luKTsKKworCQlyZXR1cm4gam9pbkRlZjsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfSBhbmQgc29ydCBvcmRlciBmbGFnIHRvIGFuIE9EUworCSAqIHtAbGluayBTZWxPcmRlcn0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSB7QGNvZGUgQXR0cmlidXRlfS4KKwkgKiBAcGFyYW0gYXNjZW5kaW5nIFRoZSBzb3J0IG9yZGVyLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFNlbE9yZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIFNlbE9yZGVyIGNyZWF0ZU9yZGVyQnkoQXR0cmlidXRlIGF0dHJpYnV0ZSwgYm9vbGVhbiBhc2NlbmRpbmcpIHsKKwkJU2VsT3JkZXIgc2VsT3JkZXIgPSBuZXcgU2VsT3JkZXIoKTsKKworCQlzZWxPcmRlci5hdHRyID0gY3JlYXRlQUlETmFtZShhdHRyaWJ1dGUpOworCQlzZWxPcmRlci5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7CisKKwkJcmV0dXJuIHNlbE9yZGVyOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9IHRvIGFuIE9EUyB7QGxpbmsgQUlETmFtZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSB7QGNvZGUgQXR0cmlidXRlfS4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIHtAY29kZSBBSUROYW1lfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIEFJRE5hbWUgY3JlYXRlQUlETmFtZShBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCUFJRE5hbWUgYWlkTmFtZSA9IG5ldyBBSUROYW1lKCk7CisKKwkJYWlkTmFtZS5haWQgPSAoKE9EU0VudGl0eVR5cGUpIGF0dHJpYnV0ZS5nZXRFbnRpdHlUeXBlKCkpLmdldE9EU0lEKCk7CisJCWFpZE5hbWUuYWFOYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKKworCQlyZXR1cm4gYWlkTmFtZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBBZ2dyZWdhdGlvbiBnZXRBZ2dyZWdhdGlvbihTdHJpbmcgb2RzQWdnckZ1bmMpIHsKKwkJc3dpdGNoIChTdHJpbmdzLm51bGxUb0VtcHR5KG9kc0FnZ3JGdW5jKS50cmltKCkudG9VcHBlckNhc2UoKSkgeworCQljYXNlICJDT1VOVCI6CisJCQlyZXR1cm4gQWdncmVnYXRpb24uQ09VTlQ7CisJCWNhc2UgIkRDT1VOVCI6CisJCQlyZXR1cm4gQWdncmVnYXRpb24uRElTVElOQ1RfQ09VTlQ7CisJCWNhc2UgIk1JTiI6CisJCQlyZXR1cm4gQWdncmVnYXRpb24uTUlOSU1VTTsKKwkJY2FzZSAiTUFYIjoKKwkJCXJldHVybiBBZ2dyZWdhdGlvbi5NQVhJTVVNOworCQljYXNlICJBVkciOgorCQkJcmV0dXJuIEFnZ3JlZ2F0aW9uLkFWRVJBR0U7CisJCWNhc2UgIlNURERFViI6CisJCQlyZXR1cm4gQWdncmVnYXRpb24uREVWSUFUSU9OOworCQljYXNlICJTVU0iOgorCQkJcmV0dXJuIEFnZ3JlZ2F0aW9uLlNVTTsKKwkJY2FzZSAiRElTVElOQ1QiOgorCQkJcmV0dXJuIEFnZ3JlZ2F0aW9uLkRJU1RJTkNUOworCQlkZWZhdWx0OgorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIlVuc3VwcG9ydGVkIGFnZ3JlZ2F0ZSBmdW5jdGlvbiAnIiArIFN0cmluZ3MubnVsbFRvRW1wdHkob2RzQWdnckZ1bmMpLnRyaW0oKS50b1VwcGVyQ2FzZSgpICsgIichIik7CisJCX0KKworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbm5lciBjbGFzc2VzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVHJhdmVyc2VzIHRoZSBPRFMge0BsaW5rIFJlc3VsdFNldEV4dH0gYW5kIGNyZWF0ZXMgYSB7QGxpbmsgUmVzdWx0fSBmb3IgZWFjaAorCSAqIHJvdy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXN1bHRGYWN0b3J5IGltcGxlbWVudHMgSXRlcmFibGU8UmVzdWx0PiwgSXRlcmF0b3I8UmVzdWx0PiB7CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCXByaXZhdGUgZmluYWwgTGlzdDxSZWNvcmRGYWN0b3J5PiByZWNvcmRGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOworCQlwcml2YXRlIGludCBpbmRleDsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIENvbnN0cnVjdG9ycworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yLgorCQkgKgorCQkgKiBAcGFyYW0gZW50aXR5VHlwZXMgIFVzZWQgdG8gYWNjZXNzIHtAbGluayBFbnRpdHlUeXBlfSBieSBpdHMgT0RTIElELgorCQkgKiBAcGFyYW0gcmVzdWx0U2V0RXh0IFRoZSBPRFMgdmFsdWVzIHNlcXVlbmNlIGNvbnRhaW5lcnMuCisJCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gb24gY29udmVyc2lvbiBlcnJvcnMuCisJCSAqLworCQlwdWJsaWMgUmVzdWx0RmFjdG9yeShNYXA8U3RyaW5nLCBFbnRpdHlUeXBlPiBlbnRpdHlUeXBlcywgUmVzdWx0U2V0RXh0IHJlc3VsdFNldEV4dCkKKwkJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCQlmb3IgKEVsZW1SZXN1bHRTZXRFeHQgZWxlbVJlc3VsdFNldEV4dCA6IHJlc3VsdFNldEV4dC5maXJzdEVsZW1zKSB7CisJCQkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gZW50aXR5VHlwZXMuZ2V0KExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGVsZW1SZXN1bHRTZXRFeHQuYWlkKSkpOworCQkJCXJlY29yZEZhY3Rvcmllcy5hZGQobmV3IFJlY29yZEZhY3RvcnkoZW50aXR5VHlwZSwgZWxlbVJlc3VsdFNldEV4dC52YWx1ZXMpKTsKKwkJCX0KKworCQkJbGVuZ3RoID0gcmVjb3JkRmFjdG9yaWVzLmlzRW1wdHkoKSA/IDAgOiByZWNvcmRGYWN0b3JpZXMuZ2V0KDApLmdldExlbmd0aCgpOworCQl9CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBQdWJsaWMgbWV0aG9kcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworCQkJcmV0dXJuIGluZGV4IDwgbGVuZ3RoOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgUmVzdWx0IG5leHQoKSB7CisJCQlpZiAoIWhhc05leHQoKSkgeworCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJObyBzdWNoIGVsZW1lbnQgYXZhaWxhYmxlLiIpOworCQkJfQorCQkJUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKKworCQkJZm9yIChSZWNvcmRGYWN0b3J5IHJlY29yZEZhY3RvcnkgOiByZWNvcmRGYWN0b3JpZXMpIHsKKwkJCQlyZXN1bHQuYWRkUmVjb3JkKHJlY29yZEZhY3RvcnkuY3JlYXRlUmVjb3JkKGluZGV4KSk7CisJCQl9CisKKwkJCWluZGV4Kys7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSXRlcmF0b3I8UmVzdWx0PiBpdGVyYXRvcigpIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEge0BsaW5rIFJlY29yZH0gZm9yIGdpdmVuIGluZGV4IGZyb20gdGhlIG9yaWdpbmFsIE9EUyB2YWx1ZXMKKwkgKiBzZXF1ZW5jZSBmb3IgYSBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX0uCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjb3JkRmFjdG9yeSB7CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCXByaXZhdGUgZmluYWwgTGlzdDxWYWx1ZUZhY3Rvcnk+IHZhbHVlRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXByaXZhdGUgZmluYWwgRW50aXR5VHlwZSBlbnRpdHlUeXBlOworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ29uc3RydWN0b3JzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkJICogQHBhcmFtIG52c3VpcyAgICAgVGhlIE9EUyB2YWx1ZSBzZXF1ZW5jZSBjb250YWluZXJzLgorCQkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIG9uIGNvbnZlcnNpb24gZXJyb3JzLgorCQkgKi8KKwkJcHJpdmF0ZSBSZWNvcmRGYWN0b3J5KEVudGl0eVR5cGUgZW50aXR5VHlwZSwgTmFtZVZhbHVlU2VxVW5pdElkW10gbnZzdWlzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCQl0aGlzLmVudGl0eVR5cGUgPSBlbnRpdHlUeXBlOworCQkJZm9yIChOYW1lVmFsdWVTZXFVbml0SWQgbnZzdWkgOiBudnN1aXMpIHsKKwkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG52c3VpLnZhbE5hbWU7CisJCQkJQWdncmVnYXRpb24gYWdncmVnYXRpb24gPSBBZ2dyZWdhdGlvbi5OT05FOworCQkJCU1hdGNoZXIgbWF0Y2hlciA9IEFHR1JFR0FUSU9OX05BTUVfUEFUVEVSTi5tYXRjaGVyKG52c3VpLnZhbE5hbWUpOworCQkJCWlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworCQkJCQlhdHRyaWJ1dGVOYW1lID0gbWF0Y2hlci5ncm91cChHUk9VUF9OQU1FKTsKKwkJCQkJYWdncmVnYXRpb24gPSBPRFNRdWVyeS5nZXRBZ2dyZWdhdGlvbihtYXRjaGVyLmdyb3VwKEdST1VQX0FHR1JGVU5DKSk7CisJCQkJfQorCisJCQkJdmFsdWVGYWN0b3JpZXMuYWRkKG5ldyBWYWx1ZUZhY3RvcnkoZW50aXR5VHlwZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSksIGFnZ3JlZ2F0aW9uLCBudnN1aSkpOworCQkJfQorCQl9CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBQcml2YXRlIG1ldGhvZHMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCXByaXZhdGUgaW50IGdldExlbmd0aCgpIHsKKwkJCXJldHVybiB2YWx1ZUZhY3Rvcmllcy5pc0VtcHR5KCkgPyAwIDogdmFsdWVGYWN0b3JpZXMuZ2V0KDApLmdldExlbmd0aCgpOworCQl9CisKKwkJcHJpdmF0ZSBSZWNvcmQgY3JlYXRlUmVjb3JkKGludCBpbmRleCkgeworCQkJUmVjb3JkIHJlY29yZCA9IG5ldyBSZWNvcmQoZW50aXR5VHlwZSk7CisJCQlmb3IgKFZhbHVlRmFjdG9yeSB2YWx1ZUZhY3RvcnkgOiB2YWx1ZUZhY3RvcmllcykgeworCQkJCXJlY29yZC5hZGRWYWx1ZSh2YWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUoaW5kZXgpKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlY29yZDsKKwkJfQorCisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIHtAbGluayBWYWx1ZX0gY29udGFpbmVyIGZvciBnaXZlbiBpbmRleCBmcm9tIHRoZSBvcmlnaW5hbCBPRFMgdmFsdWUKKwkgKiBzZXF1ZW5jZSBmb3IgYSBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWYWx1ZUZhY3RvcnkgeworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQlwcml2YXRlIGZpbmFsIExpc3Q8VmFsdWU+IHZhbHVlczsKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdW5pdDsKKwkJcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ29uc3RydWN0b3JzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIGFzc29jaWF0ZWQge0BsaW5rIEF0dHJpYnV0ZX0uCisJCSAqIEBwYXJhbSBudnN1aSAgICAgVGhlIE9EUyB2YWx1ZSBzZXF1ZW5jZSBjb250YWluZXIuCisJCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gb24gY29udmVyc2lvbiBlcnJvcnMuCisJCSAqLworCQlwcml2YXRlIFZhbHVlRmFjdG9yeShBdHRyaWJ1dGUgYXR0cmlidXRlLCBBZ2dyZWdhdGlvbiBhZ2dyZWdhdGlvbiwgTmFtZVZhbHVlU2VxVW5pdElkIG52c3VpKQorCQkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJCWxlbmd0aCA9IG52c3VpLnZhbHVlLmZsYWcubGVuZ3RoOworCQkJdW5pdCA9IGF0dHJpYnV0ZS5nZXRVbml0KCk7CisJCQl2YWx1ZXMgPSBPRFNDb252ZXJ0ZXIuZnJvbU9EU1ZhbHVlU2VxKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIHVuaXQsIG52c3VpLnZhbHVlKTsKKwkJfQorCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gUHJpdmF0ZSBtZXRob2RzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4KKwkJICoKKwkJICogQHJldHVybiBMZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzIHJldHVybmVkLgorCQkgKi8KKwkJcHJpdmF0ZSBpbnQgZ2V0TGVuZ3RoKCkgeworCQkJcmV0dXJuIGxlbmd0aDsKKwkJfQorCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmFsdWV9IGZvciBnaXZlbiBpbmRleC4KKwkJICoKKwkJICogQHBhcmFtIGluZGV4IEluZGV4IHdpdGhpbiB0aGUgc2VxdWVuY2UuCisJCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkJICovCisJCXByaXZhdGUgVmFsdWUgY3JlYXRlVmFsdWUoaW50IGluZGV4KSB7CisJCQlyZXR1cm4gdmFsdWVzLmdldChpbmRleCk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU1F1ZXJ5U2VydmljZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU1F1ZXJ5U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNTE3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTUXVlcnlTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworCitwdWJsaWMgY2xhc3MgT0RTUXVlcnlTZXJ2aWNlIGltcGxlbWVudHMgUXVlcnlTZXJ2aWNlIHsKKworCXByaXZhdGUgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKworCXB1YmxpYyBPRFNRdWVyeVNlcnZpY2UoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcikgeworCQl0aGlzLm1vZGVsTWFuYWdlciA9IG1vZGVsTWFuYWdlcjsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFF1ZXJ5IGNyZWF0ZVF1ZXJ5KCkgeworCQlyZXR1cm4gbmV3IE9EU1F1ZXJ5KG1vZGVsTWFuYWdlci5nZXRBcHBsRWxlbUFjY2VzcygpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTUmVsYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNSZWxhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Y2Y3NzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTUmVsYXRpb24uamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeTsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxBdHRyOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsUmVsOworaW1wb3J0IG9yZy5hc2FtLm9kcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU1V0aWxzOworCisvKioKKyAqIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFJlbGF0aW9ufSBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPRFNSZWxhdGlvbiBpbXBsZW1lbnRzIFJlbGF0aW9uIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGU7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlUeXBlIHNvdXJjZTsKKwlwcml2YXRlIGZpbmFsIEVudGl0eVR5cGUgdGFyZ2V0OworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwlwcml2YXRlIGZpbmFsIGludCByYW5nZU1heDsKKwlwcml2YXRlIGZpbmFsIGludCBpbnZSYW5nZU1heDsKKwlwcml2YXRlIEF0dHJpYnV0ZSBhdHRyaWJ1dGU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gYXBwbFJlbCBUaGUgT0RTIG1ldGEgZGF0YSBmb3IgdGhpcyByZWxhdGlvbi4KKwkgKiBAcGFyYW0gc291cmNlICBUaGUgc291cmNlIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gdGFyZ2V0ICBUaGUgdGFyZ2V0IHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKi8KKwlPRFNSZWxhdGlvbihBcHBsUmVsIGFwcGxSZWwsIEVudGl0eVR5cGUgc291cmNlLCBFbnRpdHlUeXBlIHRhcmdldCkgeworCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKwkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisJCW5hbWUgPSBhcHBsUmVsLmFyTmFtZTsKKwkJcmVsYXRpb25UeXBlID0gT0RTVXRpbHMuUkVMQVRJT05TSElQUy5pbnZlcnNlKCkuZ2V0KGFwcGxSZWwuYXJSZWxhdGlvblR5cGUpOworCQlyYW5nZU1heCA9IGFwcGxSZWwuYXJSZWxhdGlvblJhbmdlLm1heDsKKwkJaW52UmFuZ2VNYXggPSBhcHBsUmVsLmludlJlbGF0aW9uUmFuZ2UubWF4OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5VHlwZSBnZXRTb3VyY2UoKSB7CisJCXJldHVybiBzb3VyY2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldFRhcmdldCgpIHsKKwkJcmV0dXJuIHRhcmdldDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlbGF0aW9uVHlwZSBnZXRSZWxhdGlvblR5cGUoKSB7CisJCXJldHVybiByZWxhdGlvblR5cGU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKCkgeworCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKKwkJCWF0dHJpYnV0ZSA9IG5ldyBPRFNBdHRyaWJ1dGUoZ2V0U291cmNlKCksCisJCQkJCW5ldyBBcHBsQXR0cihnZXROYW1lKCksICIiLCBEYXRhVHlwZS5EVF9MT05HTE9ORywgMCwgdHJ1ZSwgZmFsc2UsIG51bGwpLCBudWxsLCBudWxsKTsKKwkJfQorCisJCXJldHVybiBhdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBPYmplY3RzLmhhc2goZ2V0U291cmNlKCksIGdldFRhcmdldCgpLCBnZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgT0RTUmVsYXRpb24pIHsKKwkJCVJlbGF0aW9uIHJlbGF0aW9uID0gKFJlbGF0aW9uKSBvYmplY3Q7CisJCQlyZXR1cm4gZ2V0U291cmNlKCkuZXF1YWxzKHJlbGF0aW9uLmdldFNvdXJjZSgpKSAmJiBnZXRUYXJnZXQoKS5lcXVhbHMocmVsYXRpb24uZ2V0VGFyZ2V0KCkpCisJCQkJCSYmIGdldE5hbWUoKS5lcXVhbHMocmVsYXRpb24uZ2V0TmFtZSgpKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldE5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNPdXRnb2luZyhSZWxhdGlvblR5cGUgcmVsYXRpb25UeXBlKSB7CisJCXJldHVybiByZWxhdGlvblR5cGUuZXF1YWxzKGdldFJlbGF0aW9uVHlwZSgpKSAmJiByYW5nZU1heCA9PSAxOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0luY29taW5nKFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGUpIHsKKwkJcmV0dXJuIHJlbGF0aW9uVHlwZS5lcXVhbHMoZ2V0UmVsYXRpb25UeXBlKCkpICYmIHJhbmdlTWF4ID09IC0xOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTnRvTSgpIHsKKwkJcmV0dXJuIHJlbGF0aW9uVHlwZSA9PSBSZWxhdGlvblR5cGUuSU5GTyAmJiByYW5nZU1heCA9PSAtMSAmJiBpbnZSYW5nZU1heCA9PSAtMTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQmFzZUVudGl0eVNlYXJjaFF1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL0Jhc2VFbnRpdHlTZWFyY2hRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmRiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL0Jhc2VFbnRpdHlTZWFyY2hRdWVyeS5qYXZhCkBAIC0wLDAgKzEsMjc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuZ3JvdXBpbmdCeTsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnJlZHVjaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5BZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Kb2luVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5Kb2luVHJlZS5Kb2luQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2guSm9pblRyZWUuSm9pbk5vZGU7CisKKy8qKgorICogQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgZW50aXR5IHtAbGluayBTZWFyY2hRdWVyeX0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2Fic3RyYWN0IGNsYXNzIEJhc2VFbnRpdHlTZWFyY2hRdWVyeSBpbXBsZW1lbnRzIFNlYXJjaFF1ZXJ5IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHJvb3RFbnRpdHlDbGFzczsKKwlwcml2YXRlIGZpbmFsIEpvaW5UcmVlIGpvaW5UcmVlID0gbmV3IEpvaW5UcmVlKCk7CisJcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzczsKKworCXByaXZhdGUgZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwlwcml2YXRlIGZpbmFsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2U7CisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciAgICBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgICAgIFRoZSBzb3VyY2UgZW50aXR5IGNsYXNzIG9mIHRoaXMgc2VhcmNoIHF1ZXJ5LgorCSAqIEBwYXJhbSByb290RW50aXR5Q2xhc3MgVGhlIHJvb3QgZW50aXR5IGNsYXNzIG9mIHRoaXMgc2VhcmNoIHF1ZXJ5LgorCSAqLworCXByb3RlY3RlZCBCYXNlRW50aXR5U2VhcmNoUXVlcnkoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSwKKwkJCUNsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzLCBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiByb290RW50aXR5Q2xhc3MpIHsKKwkJdGhpcy5tb2RlbE1hbmFnZXIgPSBtb2RlbE1hbmFnZXI7CisJCXRoaXMucXVlcnlTZXJ2aWNlID0gcXVlcnlTZXJ2aWNlOworCQl0aGlzLmVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3M7CisJCXRoaXMucm9vdEVudGl0eUNsYXNzID0gcm9vdEVudGl0eUNsYXNzOworCisJCUVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5Q29uZmlnKG5ldyBLZXk8PihlbnRpdHlDbGFzcykpOworCQlFbnRpdHlUeXBlIHNvdXJjZSA9IGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCk7CisKKwkJZW50aXR5Q29uZmlnLmdldE9wdGlvbmFsQ29uZmlncygpLnN0cmVhbSgpLm1hcChFbnRpdHlDb25maWc6OmdldEVudGl0eVR5cGUpCisJCQkJLmZpbHRlcihldCAtPiAhIkNsYXNzaWZpY2F0aW9uIi5lcXVhbHMoZXQuZ2V0TmFtZSgpKSkuZm9yRWFjaChlbnRpdHlUeXBlIC0+IHsKKwkJCQkJam9pblRyZWUuYWRkTm9kZShzb3VyY2UsIGVudGl0eVR5cGUsIHRydWUsIEpvaW5UeXBlLk9VVEVSKTsKKwkJCQl9KTsKKworCQllbnRpdHlDb25maWcuZ2V0TWFuZGF0b3J5Q29uZmlncygpLnN0cmVhbSgpLm1hcChFbnRpdHlDb25maWc6OmdldEVudGl0eVR5cGUpLmZvckVhY2goZW50aXR5VHlwZSAtPiB7CisJCQlqb2luVHJlZS5hZGROb2RlKHNvdXJjZSwgZW50aXR5VHlwZSwgdHJ1ZSwgSm9pblR5cGUuSU5ORVIpOworCQl9KTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIExpc3Q8RW50aXR5VHlwZT4gbGlzdEVudGl0eVR5cGVzKCkgeworCQlyZXR1cm4gam9pblRyZWUuZ2V0Tm9kZU5hbWVzKCkuc3RyZWFtKCkubWFwKG1vZGVsTWFuYWdlcjo6Z2V0RW50aXR5VHlwZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIFNlYXJjaGFibGUgZ2V0U2VhcmNoYWJsZVJvb3QoKSB7CisJCUZ1bmN0aW9uPFN0cmluZywgU2VhcmNoYWJsZU5vZGU+IGZhY3RvcnkgPSBrIC0+IHsKKwkJCXJldHVybiBuZXcgU2VhcmNoYWJsZU5vZGUobW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoaykpOworCQl9OworCisJCU1hcDxTdHJpbmcsIFNlYXJjaGFibGVOb2RlPiBub2RlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBqb2luVHJlZS5nZXRUcmVlKCkuZW50cnlTZXQoKSkgeworCQkJU2VhcmNoYWJsZU5vZGUgcGFyZW50ID0gbm9kZXMuY29tcHV0ZUlmQWJzZW50KGVudHJ5LmdldEtleSgpLCBmYWN0b3J5KTsKKworCQkJZm9yIChTdHJpbmcgY2hpbGROYW1lIDogZW50cnkuZ2V0VmFsdWUoKSkgeworCQkJCXBhcmVudC5hZGRSZWxhdGVkKG5vZGVzLmNvbXB1dGVJZkFic2VudChjaGlsZE5hbWUsIGZhY3RvcnkpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBub2Rlcy5nZXQobW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUocm9vdEVudGl0eUNsYXNzKS5nZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgTGlzdDxWYWx1ZT4gZ2V0RmlsdGVyVmFsdWVzKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3QoYXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5ESVNUSU5DVCkuZ3JvdXAoYXR0cmlidXRlKTsKKworCQkvLyBhZGQgcmVxdWlyZWQgam9pbnMKKwkJZmlsdGVyLnN0cmVhbSgpLmZpbHRlcihGaWx0ZXJJdGVtOjppc0NvbmRpdGlvbikubWFwKEZpbHRlckl0ZW06OmdldENvbmRpdGlvbikuZm9yRWFjaChjIC0+IHsKKwkJCWFkZEpvaW5zKHF1ZXJ5LCBjLmdldEF0dHJpYnV0ZSgpLmdldEVudGl0eVR5cGUoKSk7CisJCX0pOworCisJCXJldHVybiBxdWVyeS5mZXRjaChmaWx0ZXIpLnN0cmVhbSgpLm1hcChyIC0+IHIuZ2V0VmFsdWUoYXR0cmlidXRlKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIExpc3Q8UmVzdWx0PiBmZXRjaENvbXBsZXRlKExpc3Q8RW50aXR5VHlwZT4gZW50aXR5VHlwZXMsIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRChtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShlbnRpdHlDbGFzcykpOworCisJCS8vIGFkZCByZXF1aXJlZCBqb2lucworCQllbnRpdHlUeXBlcy5zdHJlYW0oKS5mb3JFYWNoKGVudGl0eVR5cGUgLT4geworCQkJYWRkSm9pbnMocXVlcnksIGVudGl0eVR5cGUpOworCQkJcXVlcnkuc2VsZWN0QWxsKGVudGl0eVR5cGUpOworCQl9KTsKKworCQlyZXR1cm4gZmV0Y2gocXVlcnksIGZpbHRlcik7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBMaXN0PFJlc3VsdD4gZmV0Y2goTGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMsIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRChtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShlbnRpdHlDbGFzcykpOworCisJCS8vIGFkZCByZXF1aXJlZCBqb2lucworCQlhdHRyaWJ1dGVzLnN0cmVhbSgpLmZvckVhY2goYXR0cmlidXRlIC0+IHsKKwkJCWFkZEpvaW5zKHF1ZXJ5LCBhdHRyaWJ1dGUuZ2V0RW50aXR5VHlwZSgpKTsKKwkJCXF1ZXJ5LnNlbGVjdChhdHRyaWJ1dGUpOworCQl9KTsKKworCQlyZXR1cm4gZmV0Y2gocXVlcnksIGZpbHRlcik7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByb3RlY3RlZCBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgSm9pbkNvbmZpZ30gdG8gdGhlIGludGVybmFsbHkgbWFuYWdlZCB7QGxpbmsgSm9pblRyZWV9LgorCSAqCisJICogQHBhcmFtIGpvaW5Db25maWcgV2lsbCBiZSBhZGRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRKb2luQ29uZmlnKEpvaW5Db25maWcgam9pbkNvbmZpZykgeworCQlFbnRpdHlDb25maWc8Pz4gdGFyZ2V0RW50aXR5Q29uZmlnID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eUNvbmZpZyhuZXcgS2V5PD4oam9pbkNvbmZpZy50YXJnZXQpKTsKKwkJRW50aXR5VHlwZSB0YXJnZXQgPSB0YXJnZXRFbnRpdHlDb25maWcuZ2V0RW50aXR5VHlwZSgpOworCisJCS8vIGFkZCBkZXBlbmRlbmN5IHNvdXJjZSB0byB0YXJnZXQKKwkJam9pblRyZWUuYWRkTm9kZShtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShqb2luQ29uZmlnLnNvdXJjZSksIHRhcmdldCwgam9pbkNvbmZpZy52aWFQYXJlbnQsIEpvaW5UeXBlLklOTkVSKTsKKworCQkvLyBhZGQgdGFyZ2V0J3Mgb3B0aW9uYWwgZGVwZW5kZW5jaWVzCisJCXRhcmdldEVudGl0eUNvbmZpZy5nZXRPcHRpb25hbENvbmZpZ3MoKS5zdHJlYW0oKS5tYXAoRW50aXR5Q29uZmlnOjpnZXRFbnRpdHlUeXBlKQorCQkJCS5maWx0ZXIoZXQgLT4gISJDbGFzc2lmaWNhdGlvbiIuZXF1YWxzKGV0LmdldE5hbWUoKSkpLmZvckVhY2goZW50aXR5VHlwZSAtPiB7CisJCQkJCWpvaW5UcmVlLmFkZE5vZGUodGFyZ2V0LCBlbnRpdHlUeXBlLCB0cnVlLCBKb2luVHlwZS5PVVRFUik7CisJCQkJfSk7CisKKwkJLy8gYWRkIHRhcmdldCdzIG1hbmRhdG9yeSBkZXBlbmRlbmNpZXMKKwkJdGFyZ2V0RW50aXR5Q29uZmlnLmdldE1hbmRhdG9yeUNvbmZpZ3MoKS5zdHJlYW0oKS5tYXAoRW50aXR5Q29uZmlnOjpnZXRFbnRpdHlUeXBlKS5mb3JFYWNoKGVudGl0eVR5cGUgLT4geworCQkJam9pblRyZWUuYWRkTm9kZSh0YXJnZXQsIGVudGl0eVR5cGUsIHRydWUsIEpvaW5UeXBlLklOTkVSKTsKKwkJfSk7CisJfQorCisJLyoqCisJICogQWRkcyBqb2lucyB0byBjb250ZXh0IGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0U3RhdGUgVGhlIHtAY29kZSBDb250ZXh0U3RhdGV9LgorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZEpvaW5Db25maWcoQ29udGV4dFN0YXRlIGNvbnRleHRTdGF0ZSkgeworCQlpZiAoY29udGV4dFN0YXRlID09IG51bGwpIHsKKwkJCS8vIG5vdGhpbmcgdG8gZG8KKwkJCXJldHVybjsKKwkJfQorCisJCUNsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHNvdXJjZSA9IGNvbnRleHRTdGF0ZS5pc09yZGVyZWQoKSA/IFRlc3RTdGVwLmNsYXNzIDogTWVhc3VyZW1lbnQuY2xhc3M7CisJCWZvciAoQ29udGV4dFR5cGUgY29udGV4dFR5cGUgOiBDb250ZXh0VHlwZS52YWx1ZXMoKSkgeworCQkJRW50aXR5VHlwZSByb290RW50aXR5VHlwZSA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKENvbnRleHRSb290LmNsYXNzLCBjb250ZXh0VHlwZSk7CisJCQlmb3IgKFJlbGF0aW9uIGNvbXBvbmVudFJlbGF0aW9uIDogcm9vdEVudGl0eVR5cGUuZ2V0Q2hpbGRSZWxhdGlvbnMoKSkgeworCQkJCWpvaW5UcmVlLmFkZE5vZGUoY29tcG9uZW50UmVsYXRpb24uZ2V0U291cmNlKCksIGNvbXBvbmVudFJlbGF0aW9uLmdldFRhcmdldCgpLCB0cnVlLCBKb2luVHlwZS5PVVRFUik7CisKKwkJCQlmb3IgKFJlbGF0aW9uIHNlbnNvclJlbGF0aW9uIDogY29tcG9uZW50UmVsYXRpb24uZ2V0VGFyZ2V0KCkuZ2V0Q2hpbGRSZWxhdGlvbnMoKSkgeworCQkJCQlqb2luVHJlZS5hZGROb2RlKHNlbnNvclJlbGF0aW9uLmdldFNvdXJjZSgpLCBzZW5zb3JSZWxhdGlvbi5nZXRUYXJnZXQoKSwgdHJ1ZSwgSm9pblR5cGUuT1VURVIpOworCQkJCX0KKwkJCX0KKworCQkJam9pblRyZWUuYWRkTm9kZShtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShzb3VyY2UpLCByb290RW50aXR5VHlwZSwgdHJ1ZSwgSm9pblR5cGUuT1VURVIpOworCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEV4ZWN1dGVzIGdpdmVuIHtAbGluayBRdWVyeX0gdXNpbmcgZ2l2ZW4ge0BsaW5rIEZpbHRlcn0uIEpvaW5zIHJlcXVpcmVkIGZvcgorCSAqIHRoZSBnaXZlbiB7QGNvZGUgRmlsdGVyfSB3aWxsIGJlIGltcGxpY2l0bHkgYWRkZWQgYXMgbmVlZGVkLgorCSAqCisJICogQHBhcmFtIHF1ZXJ5ICBXaWxsIGJlIGV4ZWN1dGVkLgorCSAqIEBwYXJhbSBmaWx0ZXIgVGhlIHF1ZXJ5IGZpbHRlcmluZyBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHtAbGluayBSZXN1bHR9cyBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIGZhaWxlZCB0byBleGVjdXRlIGdpdmVuIHtAY29kZSBRdWVyeX0uCisJICovCisJcHJpdmF0ZSBMaXN0PFJlc3VsdD4gZmV0Y2goUXVlcnkgcXVlcnksIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJZmlsdGVyLnN0cmVhbSgpLmZpbHRlcihGaWx0ZXJJdGVtOjppc0NvbmRpdGlvbikubWFwKEZpbHRlckl0ZW06OmdldENvbmRpdGlvbikKKwkJCQkuZm9yRWFjaChjIC0+IGFkZEpvaW5zKHF1ZXJ5LCBjLmdldEF0dHJpYnV0ZSgpLmdldEVudGl0eVR5cGUoKSkpOworCisJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGVudGl0eUNsYXNzKTsKKwkJcmV0dXJuIHF1ZXJ5Lm9yZGVyKGVudGl0eVR5cGUuZ2V0SURBdHRyaWJ1dGUoKSkuZmV0Y2goZmlsdGVyKS5zdHJlYW0oKQorCQkJCS8vIGdyb3VwIGJ5IGluc3RhbmNlIElEIGFuZCBtZXJnZSBncm91cGVkIHJlc3VsdHMKKwkJCQkuY29sbGVjdChncm91cGluZ0J5KHIgLT4gci5nZXRSZWNvcmQoZW50aXR5VHlwZSkuZ2V0SUQoKSwgcmVkdWNpbmcoUmVzdWx0OjptZXJnZSkpKQorCQkJCS8vIGNvbGxlY3QgbWVyZ2VkIHJlc3VsdHMKKwkJCQkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKE9wdGlvbmFsOjppc1ByZXNlbnQpLm1hcChPcHRpb25hbDo6Z2V0KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgam9pbiBzdGF0ZW1lbnRzIHRvIGdpdmVuIHRhcmdldCB7QGxpbmsgRW50aXR5VHlwZX0gYXMgbmVlZGVkIHRvIGJlIGFibGUKKwkgKiB0byBleGVjdXRlIGdpdmVuIHtAY29kZSBRdWVyeX0uCisJICoKKwkgKiBAcGFyYW0gcXVlcnkgICAgICBUaGUge0BsaW5rIFF1ZXJ5fS4KKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkSm9pbnMoUXVlcnkgcXVlcnksIEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQlpZiAocXVlcnkuaXNRdWVyaWVkKGVudGl0eVR5cGUpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlKb2luTm9kZSBqb2luTm9kZSA9IGpvaW5UcmVlLmdldEpvaW5Ob2RlKGVudGl0eVR5cGUuZ2V0TmFtZSgpKTsKKwkJRW50aXR5VHlwZSBzb3VyY2VFbnRpdHlUeXBlID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoam9pbk5vZGUuc291cmNlKTsKKwkJYWRkSm9pbnMocXVlcnksIHNvdXJjZUVudGl0eVR5cGUpOworCQlxdWVyeS5qb2luKHNvdXJjZUVudGl0eVR5cGUuZ2V0UmVsYXRpb24oZW50aXR5VHlwZSksIGpvaW5Ob2RlLmpvaW5UeXBlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ2hhbm5lbEdyb3VwU2VhcmNoUXVlcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ2hhbm5lbEdyb3VwU2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjRjNWVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9DaGFubmVsR3JvdXBTZWFyY2hRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5Kb2luVHJlZS5Kb2luQ29uZmlnOworCisvKioKKyAqIHtAbGluayBTZWFyY2hRdWVyeX0gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBDaGFubmVsR3JvdXB9IGFzIHNvdXJjZSBlbnRpdHkKKyAqIHR5cGUuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yCisgKi8KK2ZpbmFsIGNsYXNzIENoYW5uZWxHcm91cFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gY29udGV4dFN0YXRlIFRoZSB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKi8KKwlDaGFubmVsR3JvdXBTZWFyY2hRdWVyeShPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBDb250ZXh0U3RhdGUgY29udGV4dFN0YXRlKSB7CisJCXN1cGVyKG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlLCBDaGFubmVsR3JvdXAuY2xhc3MsIFByb2plY3QuY2xhc3MpOworCisJCS8vIGxheWVycworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoUG9vbC5jbGFzcywgUHJvamVjdC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoVGVzdC5jbGFzcywgUG9vbC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoVGVzdFN0ZXAuY2xhc3MsIFRlc3QuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKE1lYXN1cmVtZW50LmNsYXNzLCBUZXN0U3RlcC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoQ2hhbm5lbEdyb3VwLmNsYXNzLCBNZWFzdXJlbWVudC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbC5jbGFzcykpOworCisJCS8vIGNvbnRleHQKKwkJYWRkSm9pbkNvbmZpZyhjb250ZXh0U3RhdGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9DaGFubmVsU2VhcmNoUXVlcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ2hhbm5lbFNlYXJjaFF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1NmRjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ2hhbm5lbFNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoLkpvaW5UcmVlLkpvaW5Db25maWc7CisKKy8qKgorICoge0BsaW5rIFNlYXJjaFF1ZXJ5fSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIENoYW5uZWx9IGFzIHNvdXJjZSBlbnRpdHkgdHlwZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IganN0LCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqLworZmluYWwgY2xhc3MgQ2hhbm5lbFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gY29udGV4dFN0YXRlIFRoZSB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKi8KKwlDaGFubmVsU2VhcmNoUXVlcnkoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSwgQ29udGV4dFN0YXRlIGNvbnRleHRTdGF0ZSkgeworCQlzdXBlcihtb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSwgQ2hhbm5lbC5jbGFzcywgUHJvamVjdC5jbGFzcyk7CisKKwkJLy8gbGF5ZXJzCisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChQb29sLmNsYXNzLCBQcm9qZWN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChUZXN0LmNsYXNzLCBQb29sLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChUZXN0U3RlcC5jbGFzcywgVGVzdC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoTWVhc3VyZW1lbnQuY2xhc3MsIFRlc3RTdGVwLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChDaGFubmVsLmNsYXNzLCBNZWFzdXJlbWVudC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbEdyb3VwLmNsYXNzKSk7CisKKwkJLy8gY29udGV4dAorCQlhZGRKb2luQ29uZmlnKGNvbnRleHRTdGF0ZSk7CisKKwkJLy8gVE9ETyBqb2luIHRvIHNlbnNvciB0YWJsZXMuLi4uIHx8IHRoaXMgd2lsbCBicmVhayB0aGUgam9pbnMgdG8KKwkJLy8gY29udGV4dCBkYXRhCisJCS8vIG11bHRpcGxlIG91dGVyIGpvaW4gdG8gdGhlIHNhbWUgdGFibGUuLi4KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ29udGV4dFN0YXRlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL0NvbnRleHRTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmJjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL0NvbnRleHRTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CisKKy8qKgorICogQ29udGV4dCBzdGF0ZSBlbnVtZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworZW51bSBDb250ZXh0U3RhdGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEVudW0gY29uc3RhbnRzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmVmZXJlbmNlcyB7QGxpbmsgQ29udGV4dFJvb3R9cyBvZiB7QGxpbmsgVGVzdFN0ZXB9cy4KKwkgKi8KKwlPUkRFUkVELAorCisJLyoqCisJICogUmVmZXJlbmNlcyB7QGxpbmsgQ29udGV4dFJvb3R9cyBvZiB7QGxpbmsgTWVhc3VyZW1lbnR9cy4KKwkgKi8KKwlNRUFTVVJFRDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udGV4dCBzdGF0ZSBpcyB7QGxpbmsgI09SREVSRUR9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIGlzIHtAbGluayAjT1JERVJFRH0uCisJICovCisJcHVibGljIGJvb2xlYW4gaXNPcmRlcmVkKCkgeworCQlyZXR1cm4gT1JERVJFRCA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udGV4dCBzdGF0ZSBpcyB7QGxpbmsgI01FQVNVUkVEfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSBpcyB7QGxpbmsgI01FQVNVUkVEfS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01lYXN1cmVkKCkgeworCQlyZXR1cm4gTUVBU1VSRUQgPT0gdGhpczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvSm9pblRyZWUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvSm9pblRyZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTJiMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9Kb2luVHJlZS5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuSm9pblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hRdWVyeTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHNwYW5zIGEgZGVwZW5kZW5jeSB0cmVlIGZvciBjb25kaXRpb25hbCBqb2luIHN0YXRlbWVudHMgaXMKKyAqIHtAbGluayBTZWFyY2hRdWVyeX0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIEpvaW5UcmVlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gdHJlZSA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEpvaW5Ob2RlPiBqb2luTm9kZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBub2RlTmFtZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0cmVlIGNvbmZpZ3VyYXRpb24uIEl0IG1hcHBzIGEgc291cmNlIGVudGl0eSB0eXBlIG5hbWVzIHRvCisJICogc3VwcG9ydGVkIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lcy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBNYXB9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRUcmVlKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRyZWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSB7QGNvZGUgTGlzdH0gd2l0aCBkaXN0aW5jdCBlbnRpdHkgdHlwZSBuYW1lcyBjb3ZlcmVkIGJ5IHRoaXMgam9pbgorCSAqIHRyZWUuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldE5vZGVOYW1lcygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChub2RlTmFtZXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBKb2luTm9kZX0gZm9yIGdpdmVuIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lLgorCSAqCisJICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlIG5hbWUuCisJICogQHJldHVybiBUaGUge0Bjb2RlIEpvaW5Ob2RlfSBmb3IgZ2l2ZW4gdGFyZ2V0IGVudGl0eSB0eXBlIG5hbWUgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIG5vIHN1Y2gge0Bjb2RlIEpvaW5Ob2RlfSBleGlzdHMuCisJICovCisJcHVibGljIEpvaW5Ob2RlIGdldEpvaW5Ob2RlKFN0cmluZyB0YXJnZXQpIHsKKwkJSm9pbk5vZGUgam9pbk5vZGUgPSBqb2luTm9kZXMuZ2V0KHRhcmdldCk7CisJCWlmIChqb2luTm9kZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWxhdGlvbiB0byAnIiArIHRhcmdldCArICInIG5vdCBwb3NzaWJsZS4iKTsKKwkJfQorCisJCXJldHVybiBqb2luTm9kZTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIGRlcGVuZGVuY3kgc2V0dXAgdG8gdGhpcyBqb2luIHRyZWUuCisJICoKKwkgKiBAcGFyYW0gc291cmNlICAgIFRoZSBzb3VyY2UgZW50aXR5IHR5cGUgbmFtZS4KKwkgKiBAcGFyYW0gdGFyZ2V0ICAgIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUgbmFtZS4KKwkgKiBAcGFyYW0gdmlhUGFyZW50IElmIHRydWUsIHRoZW4gc291cmNlIGlzIHRoZSBjb25zaWRlcmVkIHBhcmVudCBvZiB0aGUgdGFyZ2V0LgorCSAqIEBwYXJhbSBqb2luVHlwZSAgRWl0aGVyIGlubmVyIG9yIG91dGVyIGpvaW5UeXBlLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiBzZXR1cCBvdmVycmlkZXMgYW4gZXhpc3RpbmcKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgKGEgdGFyZ2V0IGVudGl0eSB0eXBlIGlzIGFsbG93ZWQgdG8gYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luZWQgb25seSBvbmNlKS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGROb2RlKEVudGl0eVR5cGUgc291cmNlLCBFbnRpdHlUeXBlIHRhcmdldCwgYm9vbGVhbiB2aWFQYXJlbnQsIEpvaW5UeXBlIGpvaW5UeXBlKSB7CisJCVN0cmluZyBzb3VyY2VOYW1lID0gc291cmNlLmdldE5hbWUoKTsKKwkJU3RyaW5nIHRhcmdldE5hbWUgPSB0YXJnZXQuZ2V0TmFtZSgpOworCisJCWlmIChqb2luTm9kZXMucHV0KHRhcmdldE5hbWUsIG5ldyBKb2luTm9kZShzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCBqb2luVHlwZSkpICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkl0IGlzIG5vdCBhbGxvd2VkIHRvIG92ZXJyaWRlIGpvaW4gbm9kZXMuIik7CisJCX0KKworCQlpZiAodmlhUGFyZW50KSB7CisJCQl0cmVlLmNvbXB1dGVJZkFic2VudChzb3VyY2VOYW1lLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQodGFyZ2V0TmFtZSk7CisJCX0gZWxzZSB7CisJCQl0cmVlLmNvbXB1dGVJZkFic2VudCh0YXJnZXROYW1lLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQoc291cmNlTmFtZSk7CisJCX0KKworCQlub2RlTmFtZXMuYWRkKHNvdXJjZU5hbWUpOworCQlub2RlTmFtZXMuYWRkKHRhcmdldE5hbWUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbm5lciBjbGFzc2VzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQSBzaW1wbGUgam9pblR5cGUgbm9kZSBzZXR1cC4KKwkgKi8KKwlzdGF0aWMgZmluYWwgY2xhc3MgSm9pbk5vZGUgeworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQlmaW5hbCBTdHJpbmcgc291cmNlOworCQlmaW5hbCBTdHJpbmcgdGFyZ2V0OworCQlmaW5hbCBKb2luVHlwZSBqb2luVHlwZTsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIENvbnN0cnVjdG9ycworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yLgorCQkgKgorCQkgKiBAcGFyYW0gc291cmNlICAgVGhlIHNvdXJjZSBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcGFyYW0gdGFyZ2V0ICAgVGhlIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcGFyYW0gam9pblR5cGUgRWl0aGVyIGlubmVyIG9yIG91dGVyIHtAbGluayBKb2luVHlwZX0uCisJCSAqLworCQlwcml2YXRlIEpvaW5Ob2RlKFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQsIEpvaW5UeXBlIGpvaW5UeXBlKSB7CisJCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKwkJCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OworCQkJdGhpcy5qb2luVHlwZSA9IGpvaW5UeXBlOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBBIHNpbXBsZSBqb2luVHlwZSBjb25maWd1cmF0aW9uIHNldHVwLgorCSAqLworCXN0YXRpYyBmaW5hbCBjbGFzcyBKb2luQ29uZmlnIHsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJZmluYWwgQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gc291cmNlOworCQlmaW5hbCBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiB0YXJnZXQ7CisJCWZpbmFsIGJvb2xlYW4gdmlhUGFyZW50OworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ29uc3RydWN0b3JzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBzb3VyY2UgICAgVGhlIHNvdXJjZSBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcGFyYW0gdGFyZ2V0ICAgIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUgbmFtZS4KKwkJICogQHBhcmFtIHZpYVBhcmVudCBJZiB0cnVlLCB0aGVuIHNvdXJjZSBpcyB0aGUgY29uc2lkZXJlZCBwYXJlbnQgb2YgdGhlIHRhcmdldC4KKwkJICovCisJCXByaXZhdGUgSm9pbkNvbmZpZyhDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBzb3VyY2UsIENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHRhcmdldCwgYm9vbGVhbiB2aWFQYXJlbnQpIHsKKwkJCXRoaXMuc291cmNlID0gc291cmNlOworCQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisJCQl0aGlzLnZpYVBhcmVudCA9IHZpYVBhcmVudDsKKwkJfQorCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gUGFja2FnZSBtZXRob2RzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm9pbkNvbmZpZ30gd2hlcmUgZ2l2ZW4gc291cmNlIGlzIGNvbnNpZGVyZWQgYXMgdGhlCisJCSAqIGNoaWxkIG9mIGdpdmVuIHRhcmdldC4KKwkJICoKKwkJICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGVudGl0eSB0eXBlIG5hbWUuCisJCSAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBKb2luQ29uZmlnfSBpcyByZXR1cm5lZC4KKwkJICovCisJCXN0YXRpYyBKb2luQ29uZmlnIHVwKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHNvdXJjZSwgQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gdGFyZ2V0KSB7CisJCQlyZXR1cm4gbmV3IEpvaW5Db25maWcoc291cmNlLCB0YXJnZXQsIGZhbHNlKTsKKwkJfQorCisJCS8qKgorCQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBKb2luQ29uZmlnfSB3aGVyZSBnaXZlbiBzb3VyY2UgaXMgY29uc2lkZXJlZCBhcyB0aGUKKwkJICogcGFyZW50IG9mIGdpdmVuIHRhcmdldC4KKwkJICoKKwkJICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGVudGl0eSB0eXBlIG5hbWUuCisJCSAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBKb2luQ29uZmlnfSBpcyByZXR1cm5lZC4KKwkJICovCisJCXN0YXRpYyBKb2luQ29uZmlnIGRvd24oQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gc291cmNlLCBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiB0YXJnZXQpIHsKKwkJCXJldHVybiBuZXcgSm9pbkNvbmZpZyhzb3VyY2UsIHRhcmdldCwgdHJ1ZSk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9NZWFzdXJlbWVudFNlYXJjaFF1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL01lYXN1cmVtZW50U2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDdjNTllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9NZWFzdXJlbWVudFNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoLkpvaW5UcmVlLkpvaW5Db25maWc7CisKKy8qKgorICoge0BsaW5rIFNlYXJjaFF1ZXJ5fSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIE1lYXN1cmVtZW50fSBhcyBzb3VyY2UgZW50aXR5CisgKiB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBqc3QsIFBlYWsgU29sdXRpb24gR21iSAorICovCitmaW5hbCBjbGFzcyBNZWFzdXJlbWVudFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gY29udGV4dFN0YXRlIFRoZSB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKi8KKwlNZWFzdXJlbWVudFNlYXJjaFF1ZXJ5KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UsIENvbnRleHRTdGF0ZSBjb250ZXh0U3RhdGUpIHsKKwkJc3VwZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIE1lYXN1cmVtZW50LmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkvLyBsYXllcnMKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBvb2wuY2xhc3MsIFByb2plY3QuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3QuY2xhc3MsIFBvb2wuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3RTdGVwLmNsYXNzLCBUZXN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChNZWFzdXJlbWVudC5jbGFzcywgVGVzdFN0ZXAuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWwuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWxHcm91cC5jbGFzcykpOworCisJCS8vIGNvbnRleHQKKwkJYWRkSm9pbkNvbmZpZyhjb250ZXh0U3RhdGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9NZXJnZWRTZWFyY2hRdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9NZXJnZWRTZWFyY2hRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWIwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL01lcmdlZFNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy5ncm91cGluZ0J5OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMucmVkdWNpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaGFibGU7CisKKy8qKgorICogTWVyZ2VzIDIgZGlzdGluY3Qgc2VhcmNoIHF1ZXJpZXMsIHdoZXJlIG9uZSBxdWVyaWVzIGNvbnRleHQgZGF0YSBhcyBvcmRlcmVkCisgKiBhbmQgdGhlIG90aGVyIGNvbnRleHQgYXMgbWVhc3VyZWQuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIE1lcmdlZFNlYXJjaFF1ZXJ5IGltcGxlbWVudHMgU2VhcmNoUXVlcnkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgRW50aXR5VHlwZSBlbnRpdHlUeXBlOworCisJcHJpdmF0ZSBmaW5hbCBCYXNlRW50aXR5U2VhcmNoUXVlcnkgYnlSZXN1bHQ7CisJcHJpdmF0ZSBmaW5hbCBCYXNlRW50aXR5U2VhcmNoUXVlcnkgYnlPcmRlcjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlNZXJnZWRTZWFyY2hRdWVyeShFbnRpdHlUeXBlIGVudGl0eVR5cGUsIEZ1bmN0aW9uPENvbnRleHRTdGF0ZSwgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5PiBmYWN0b3J5KSB7CisJCXRoaXMuZW50aXR5VHlwZSA9IGVudGl0eVR5cGU7CisKKwkJYnlSZXN1bHQgPSBmYWN0b3J5LmFwcGx5KENvbnRleHRTdGF0ZS5NRUFTVVJFRCk7CisJCWJ5T3JkZXIgPSBmYWN0b3J5LmFwcGx5KENvbnRleHRTdGF0ZS5PUkRFUkVEKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8RW50aXR5VHlwZT4gbGlzdEVudGl0eVR5cGVzKCkgeworCQlyZXR1cm4gYnlPcmRlci5saXN0RW50aXR5VHlwZXMoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFNlYXJjaGFibGUgZ2V0U2VhcmNoYWJsZVJvb3QoKSB7CisJCXJldHVybiBieU9yZGVyLmdldFNlYXJjaGFibGVSb290KCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFZhbHVlPiBnZXRGaWx0ZXJWYWx1ZXMoQXR0cmlidXRlIGF0dHJpYnV0ZSwgRmlsdGVyIGZpbHRlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMaXN0PFZhbHVlPiBvcmRlclZhbHVlcyA9IGJ5T3JkZXIuZ2V0RmlsdGVyVmFsdWVzKGF0dHJpYnV0ZSwgZmlsdGVyKTsKKwkJTGlzdDxWYWx1ZT4gcmVzdWx0VmFsdWVzID0gYnlSZXN1bHQuZ2V0RmlsdGVyVmFsdWVzKGF0dHJpYnV0ZSwgZmlsdGVyKTsKKworCQlyZXR1cm4gU3RyZWFtLmNvbmNhdChvcmRlclZhbHVlcy5zdHJlYW0oKSwgcmVzdWx0VmFsdWVzLnN0cmVhbSgpKQorCQkJCS8vIGdyb3VwIGJ5IHZhbHVlIGFuZCBtZXJnZSB2YWx1ZXMKKwkJCQkuY29sbGVjdChncm91cGluZ0J5KHYgLT4gdi5leHRyYWN0KCksIHJlZHVjaW5nKCh2MSwgdjIpIC0+IHYxKSkpCisJCQkJLy8gY29sbGVjdCBtZXJnZWQgcmVzdWx0cworCQkJCS52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIoT3B0aW9uYWw6OmlzUHJlc2VudCkubWFwKE9wdGlvbmFsOjpnZXQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFJlc3VsdD4gZmV0Y2hDb21wbGV0ZShMaXN0PEVudGl0eVR5cGU+IGVudGl0eVR5cGVzLCBGaWx0ZXIgZmlsdGVyKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBtZXJnZVJlc3VsdHMoYnlPcmRlci5mZXRjaENvbXBsZXRlKGVudGl0eVR5cGVzLCBmaWx0ZXIpLCBieVJlc3VsdC5mZXRjaENvbXBsZXRlKGVudGl0eVR5cGVzLCBmaWx0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVzdWx0PiBmZXRjaChMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcywgRmlsdGVyIGZpbHRlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbWVyZ2VSZXN1bHRzKGJ5T3JkZXIuZmV0Y2goYXR0cmlidXRlcywgZmlsdGVyKSwgYnlSZXN1bHQuZmV0Y2goYXR0cmlidXRlcywgZmlsdGVyKSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIE1lcmdlcyBnaXZlbiB7QGxpbmsgUmVzdWx0fXMgdG8gb25lIHVzaW5nIHRoZSByb290IGVudGl0eSB0eXBlIG9mIHRoaXMgc2VhcmNoCisJICogcXVlcnkuCisJICoKKwkgKiBAcGFyYW0gcmVzdWx0czEgVGhlIGZpcnN0IHtAY29kZSBSZXN1bHR9LgorCSAqIEBwYXJhbSByZXN1bHRzMiBUaGUgc2Vjb25kIHtAY29kZSBSZXN1bHR9LgorCSAqIEByZXR1cm4gVGhlIG1lcmdlZCB7QGxpbmsgUmVzdWx0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIExpc3Q8UmVzdWx0PiBtZXJnZVJlc3VsdHMoTGlzdDxSZXN1bHQ+IHJlc3VsdHMxLCBMaXN0PFJlc3VsdD4gcmVzdWx0czIpIHsKKwkJcmV0dXJuIFN0cmVhbS5jb25jYXQocmVzdWx0czEuc3RyZWFtKCksIHJlc3VsdHMyLnN0cmVhbSgpKQorCQkJCS8vIGdyb3VwIGJ5IGluc3RhbmNlIElEIGFuZCBtZXJnZSBncm91cGVkIHJlc3VsdHMKKwkJCQkuY29sbGVjdChncm91cGluZ0J5KHIgLT4gci5nZXRSZWNvcmQoZW50aXR5VHlwZSkuZ2V0SUQoKSwgcmVkdWNpbmcoUmVzdWx0OjptZXJnZSkpKQorCQkJCS8vIGNvbGxlY3QgbWVyZ2VkIHJlc3VsdHMKKwkJCQkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKE9wdGlvbmFsOjppc1ByZXNlbnQpLm1hcChPcHRpb25hbDo6Z2V0KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNGcmVlVGV4dFNlYXJjaC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNGcmVlVGV4dFNlYXJjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjdjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU0ZyZWVUZXh0U2VhcmNoLmphdmEKQEAgLTAsMCArMSwyNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuQnl0ZUFycmF5UmVxdWVzdEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlBvc3RNZXRob2Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ0VzY2FwZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIHJlcXVlc3RzIHdoaWNoIGFyZSBzZW50IHRvIHRoZSBGcmVlVGV4dFNlYXJjaAorICogCisgKiBAYXV0aG9yIENocmlzdGlhbiBXZXllcm1hbm4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBPRFNGcmVlVGV4dFNlYXJjaCB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwYXlsb2FkIHdoaWNoIG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBwb3N0IHRvIGFkZCBhCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTX1BPU1REQVRBID0gIntcInF1ZXJ5XCI6e1wic2ltcGxlX3F1ZXJ5X3N0cmluZ1wiOntcInF1ZXJ5XCI6XCIlc1wiLFwiZGVmYXVsdF9vcGVyYXRvclwiOlwib3JcIixcImxlbmllbnRcIjpcInRydWVcIixcImZpZWxkc1wiOltcIm5hbWVeMlwiLFwiX2FsbFwiXX19fSI7CisKKwkvKioKKwkgKiBtYWlubHkgbG9ncyByZXF1ZXN0cyBvbiBJTkZPCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9EU0ZyZWVUZXh0U2VhcmNoLmNsYXNzKTsKKworCS8qKgorCSAqIFVzZWQgdG8gZmluYWxseSBsb2FkIHRoZSBFbnRpdGVzCisJICovCisJcHJpdmF0ZSBFbnRpdHlMb2FkZXIgbG9hZGVyOworCisJLyoqCisJICogVGhlIFVSTCBpcyBoYXJkIGNvZGVkCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdXJsOworCisJLyoqCisJICogVGhlIGNsaWVudCBpcyBjcmVhdGVkIG9uY2UgYW5kIHJldXNlZAorCSAqLworCXByaXZhdGUgSHR0cENsaWVudCBjbGllbnQ7CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgc3RhcnQgdXAgdGhlIEZyZWVUZXh0IFNlYXJjaC4gTm8gdXBmcm9uIHF1ZXJyaWVzIGFyZSBkb25lLiBUaHVzCisJICogdGhpcyBjYW4gYmUgY2FsbGVkIGFzIG9mdGVuIGFzIGRlc2lyZWQgd2l0aG91dCBhbnkgbWFqb3IgcGVyZm9ybWFuY2UgbG9zcworCSAqIAorCSAqIEBwYXJhbSBlbnRpdHlMb2FkZXIKKwkgKiBAcGFyYW0gc291cmNlTmFtZQorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPRFNGcmVlVGV4dFNlYXJjaChFbnRpdHlMb2FkZXIgZW50aXR5TG9hZGVyLCBTdHJpbmcgc291cmNlTmFtZSwgU3RyaW5nIGhvc3QpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJdGhpcy5sb2FkZXIgPSBlbnRpdHlMb2FkZXI7CisKKwkJdXJsID0gaG9zdCArICIvIiArIHNvdXJjZU5hbWUudG9Mb3dlckNhc2UoKSArICIvX3NlYXJjaD9maWVsZHM9X3R5cGUsX2lkLF9pbmRleCZzaXplPTUwIjsKKworCQljbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOworCX0KKworCS8qKgorCSAqIEEgc2VhcmNoIHdoaWNoIGlzIGNvbXBhdGlibGUgdG8gdGhlIFNlYXJjaCBhcyBkZWZpbmVkIGluIHRoZSByZXN0IG9mIHRoZSBBUEkuCisJICogCisJICogQHBhcmFtIGlucHV0UXVlcnkKKwkgKiBAcmV0dXJuIG5ldmVyIG51bGwsIGJ1dCBtYXliZSBlbXB0eQorCSAqLworCXB1YmxpYyBNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIExpc3Q8RW50aXR5Pj4gc2VhcmNoKFN0cmluZyBpbnB1dFF1ZXJ5KSB7CisJCU1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxFbnRpdHk+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PFN0cmluZz4+IGluc3RhbmNlcyA9IHNlYXJjaElkcyhpbnB1dFF1ZXJ5KTsKKwkJaW5zdGFuY2VzLmtleVNldCgpLmZvckVhY2godHlwZSAtPiBjb252ZXJ0SWRzMkVudGl0aWVzKHJlc3VsdCwgaW5zdGFuY2VzLCB0eXBlKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQSBzZWFyY2ggd2hpY2ggaXMgY29tcGF0aWJsZSB0byB0aGUgU2VhcmNoIGFzIGRlZmluZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIEFQSS4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXRRdWVyeQorCSAqIEByZXR1cm4gbmV2ZXIgbnVsbCwgYnV0IG1heWJlIGVtcHR5CisJICovCisJcHVibGljIE1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxTdHJpbmc+PiBzZWFyY2hJZHMoU3RyaW5nIGlucHV0UXVlcnkpIHsKKwkJTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PFN0cmluZz4+IGluc3RhbmNlSWRzID0gbmV3IEhhc2hNYXA8PigpOworCisJCUpzb25FbGVtZW50IHJvb3QgPSBxdWVyeUVsYXN0aWNTZWFyY2goaW5wdXRRdWVyeSk7CisJCWlmIChyb290ICE9IG51bGwpIHsKKwkJCUpzb25BcnJheSBoaXRzID0gcm9vdC5nZXRBc0pzb25PYmplY3QoKS5nZXQoImhpdHMiKS5nZXRBc0pzb25PYmplY3QoKS5nZXQoImhpdHMiKS5nZXRBc0pzb25BcnJheSgpOworCisJCQloaXRzLmZvckVhY2goZSAtPiBwdXQoZSwgaW5zdGFuY2VJZHMpKTsKKworCQl9CisJCXJldHVybiBpbnN0YW5jZUlkczsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBhbGwgaW5zdGFuY2VzIHRvIGVudGl0aWVzCisJICogCisJICogQHBhcmFtIGNvbnZlcnRlZE1hcCBpdCB3aWxsCisJICogQHBhcmFtIG1hcAorCSAqIEBwYXJhbSB0eXBlCisJICovCisJcHJpdmF0ZSB2b2lkIGNvbnZlcnRJZHMyRW50aXRpZXMoTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PEVudGl0eT4+IGNvbnZlcnRlZE1hcCwKKwkJCU1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxTdHJpbmc+PiBtYXAsIENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHR5cGUpIHsKKwkJdHJ5IHsKKwkJCUxpc3Q8RW50aXR5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4odHlwZSksIG1hcC5nZXQodHlwZSkpKTsKKworCQkJY29udmVydGVkTWFwLnB1dCh0eXBlLCBsaXN0KTsKKwkJfSBjYXRjaCAoRGF0YUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBpZHMgZnJvbSBPRFMuIFRoaXMgbWVhbnMgbm8gcmVzdWx0cyBhcmUgYXZhaWxhYmxlIiwgZSk7CisJCX0KKworCX0KKworCS8qKgorCSAqIFB1dHMgYWxsIHRoZSBoaXRzIGluIGVsYXN0aWNzZWFyY2gKKwkgKiAKKwkgKiBAcGFyYW0gaGl0IGEgaGl0IGFzIGdpdmVuIGZyb20gRWxhc3RpY1NlYXJjaAorCSAqIEBwYXJhbSBtYXAgdGhlIG1hcCBvZiBhbGwgaWRzIGZvciB0aGUgY2xhc3Mgb2YgdGhlIGVudGl0eQorCSAqLworCXByaXZhdGUgdm9pZCBwdXQoSnNvbkVsZW1lbnQgaGl0LCBNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIExpc3Q8U3RyaW5nPj4gbWFwKSB7CisJCUpzb25PYmplY3Qgb2JqZWN0ID0gaGl0LmdldEFzSnNvbk9iamVjdCgpOworCisJCVN0cmluZyB0eXBlID0gb2JqZWN0LmdldCgiX3R5cGUiKS5nZXRBc1N0cmluZygpOworCQlDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBjbGF6eiA9IGdldENsYXNzNFR5cGUodHlwZSk7CisKKwkJaWYgKGNsYXp6ICE9IG51bGwpIHsKKwkJCWlmICghbWFwLmNvbnRhaW5zS2V5KGNsYXp6KSkgeworCQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJbWFwLnB1dChjbGF6eiwgbGlzdCk7CisJCQl9CisKKwkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbWFwLmdldChjbGF6eik7CisJCQlsaXN0LmFkZCgoU3RyaW5nKSBvYmplY3QuZ2V0KCJfaWQiKS5nZXRBc1N0cmluZygpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGFzIGdpdmVuIGJ5IGVsYXN0aWNzZWFyY2gKKwkgKiBAcmV0dXJuIHRoZSBjbGFzcyBvZiBlYWNoIGVsZW1lbnQKKwkgKi8KKwlwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGdldENsYXNzNFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gY2xheno7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlICJUZXN0U3RlcCI6CisJCQljbGF6eiA9IFRlc3RTdGVwLmNsYXNzOworCQkJYnJlYWs7CisJCWNhc2UgIk1lYXN1cmVtZW50IjoKKwkJCWNsYXp6ID0gTWVhc3VyZW1lbnQuY2xhc3M7CisJCQlicmVhazsKKwkJY2FzZSAiVGVzdCI6CisJCQljbGF6eiA9IFRlc3QuY2xhc3M7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNsYXp6ID0gbnVsbDsKKwkJfQorCQlyZXR1cm4gY2xheno7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgYWN0dWFsbHkgcXVlcnJpZXMgRWxhc3RpY1NlYXJjaC4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXRRdWVyeQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEpzb25FbGVtZW50IHF1ZXJ5RWxhc3RpY1NlYXJjaChTdHJpbmcgaW5wdXRRdWVyeSkgeworCQlQb3N0TWV0aG9kIHBvc3QgPSBuZXcgUG9zdE1ldGhvZCh1cmwpOworCisJCVN0cmluZyByZXF1ZXN0SnNvbiA9IGJ1aWxkUmVxdWVzdEpzb24oaW5wdXRRdWVyeSk7CisKKwkJTE9HR0VSLmluZm8oIlBPU1Q6ICIgKyB1cmwpOworCQlMT0dHRVIuaW5mbygiQXNraW5nOiAiICsgcmVxdWVzdEpzb24pOworCQlieXRlW10ganNvbiA9IHJlcXVlc3RKc29uLmdldEJ5dGVzKCk7CisJCXBvc3Quc2V0UmVxdWVzdEVudGl0eShuZXcgQnl0ZUFycmF5UmVxdWVzdEVudGl0eShqc29uLCAiYXBwbGljYXRpb24vanNvbiIpKTsKKworCQlKc29uRWxlbWVudCByZXN1bHQgPSBleGVjdXRlKHBvc3QpOworCQlMT0dHRVIuaW5mbygiQW5zd2VyZWQ6IiArIHJlc3VsdCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBBY3R1YWxseSBidWlsZHMgdGhlIGpzb24KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXRRdWVyeQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBidWlsZFJlcXVlc3RKc29uKFN0cmluZyBpbnB1dFF1ZXJ5KSB7CisJCVN0cmluZyBxdWVyeSA9IFN0cmluZ0VzY2FwZVV0aWxzLmVzY2FwZUpzb24oaW5wdXRRdWVyeSk7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KEVTX1BPU1REQVRBLCBxdWVyeSk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZXMgdGhlIEhUVFAgbWV0aG9kIGFuZCBleHBlY3RzIGEganNvbiBpbiB0aGUgcmV0dXJuIHBheWxvYWQsIHdoaWNoIGlzCisJICogdGhlbiByZXR1cm5lZAorCSAqIAorCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBKc29uRWxlbWVudCBleGVjdXRlKEh0dHBNZXRob2QgbWV0aG9kKSB7CisJCXRyeSB7CisJCQlpbnQgc3RhdHVzID0gY2xpZW50LmV4ZWN1dGVNZXRob2QobWV0aG9kKTsKKwkJCWlmIChzdGF0dXMgPT0gNDA0KSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCWNoZWNrRXJyb3Ioc3RhdHVzKTsKKwkJCXJldHVybiBidWlsZFJlc3BvbnNlSnNvbihtZXRob2QpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ibGVtcyBxdWVyeWluZyBFbGFzdGljU2VhcmNoLiIsIGUpOworCQl9CisJfQorCisJLyoqCisJICogUmVhZHMgb3V0IHRoZSBodHRwIG1ldGhvZCBhbmQgYnVpbGRzIHRoZSBKU09OIHZpYSBHU09OCisJICogCisJICogQHBhcmFtIG1ldGhvZAorCSAqIEByZXR1cm4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBKc29uRWxlbWVudCBidWlsZFJlc3BvbnNlSnNvbihIdHRwTWV0aG9kIG1ldGhvZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSnNvbkVsZW1lbnQgcmVzID0gbnVsbDsKKworCQlJbnB1dFN0cmVhbSBpbiA9IG1ldGhvZC5nZXRSZXNwb25zZUJvZHlBc1N0cmVhbSgpOworCQl0cnkgKElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpIHsKKwkJCXJlcyA9IG5ldyBKc29uUGFyc2VyKCkucGFyc2UocmVhZGVyKTsKKwkJfQorCisJCXJldHVybiByZXM7CisJfQorCisJLyoqCisJICogSWYgYW4gZXJyb3Igb2NjdXJlZCBhbiBhcHByb3ByaWF0ZSBleGNlcHRpb24gaXMgdGhyb3duLgorCSAqIAorCSAqIEBwYXJhbSBzdGF0dXMKKwkgKi8KKwlwcml2YXRlIHZvaWQgY2hlY2tFcnJvcihpbnQgc3RhdHVzKSB7CisJCVN0cmluZyB0ZXh0ID0gU3RyaW5nLmZvcm1hdCgiRWxhc3RpY1NlYXJjaCBhbnN3ZXJlZCAlZC4gIiwgc3RhdHVzKTsKKworCQlpZiAoc3RhdHVzIC8gMTAwICE9IDIpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24odGV4dCk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNTZWFyY2hTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU1NlYXJjaFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmI3YjgwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNTZWFyY2hTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworCisvKioKKyAqIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFNlYXJjaFNlcnZpY2V9IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IganN0LCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqLworcHVibGljIGNsYXNzIE9EU1NlYXJjaFNlcnZpY2UgaW1wbGVtZW50cyBTZWFyY2hTZXJ2aWNlIHsKKworCXByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBTZWFyY2hRdWVyeT4gc2VhcmNoUXVlcmllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCXByaXZhdGUgZmluYWwgT0RTQ29udGV4dCBjb250ZXh0OworCXByaXZhdGUgZmluYWwgRW50aXR5TG9hZGVyIGVudGl0eUxvYWRlcjsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBlc0hvc3Q7CisJcHJpdmF0ZSBPRFNGcmVlVGV4dFNlYXJjaCBmcmVlVGV4dFNlYXJjaDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VMQVNUSUNfU0VBUkNIX1VSTCA9ICJlbGFzdGljc2VhcmNoLnVybCI7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0ICAgICAgVXNlZCB0byByZXRyaWV2ZSB7QGxpbmsgT0RTTW9kZWxNYW5hZ2VyfS4KKwkgKiBAcGFyYW0gZW50aXR5TG9hZGVyIFVzZWQgdG8gbG9hZCBjb21wbGV0ZSB7QGxpbmsgRW50aXR5fXMuCisJICovCisJcHVibGljIE9EU1NlYXJjaFNlcnZpY2UoT0RTQ29udGV4dCBjb250ZXh0LCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBFbnRpdHlMb2FkZXIgZW50aXR5TG9hZGVyKSB7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJCXRoaXMuZW50aXR5TG9hZGVyID0gZW50aXR5TG9hZGVyOworCQllc0hvc3QgPSBjb250ZXh0LmdldFBhcmFtZXRlcnMoKS5nZXQoUEFSQU1fRUxBU1RJQ19TRUFSQ0hfVVJMKTsKKworCQlyZWdpc3Rlck1lcmdlZFNlYXJjaFF1ZXJ5KFByb2plY3QuY2xhc3MsCisJCQkJYyAtPiBuZXcgUHJvamVjdFNlYXJjaFF1ZXJ5KGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCksIHF1ZXJ5U2VydmljZSwgYykpOworCQlyZWdpc3Rlck1lcmdlZFNlYXJjaFF1ZXJ5KFBvb2wuY2xhc3MsIGMgLT4gbmV3IFBvb2xTZWFyY2hRdWVyeShjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLCBxdWVyeVNlcnZpY2UsIGMpKTsKKwkJcmVnaXN0ZXJNZXJnZWRTZWFyY2hRdWVyeShUZXN0LmNsYXNzLCBjIC0+IG5ldyBUZXN0U2VhcmNoUXVlcnkoY29udGV4dC5nZXRPRFNNb2RlbE1hbmFnZXIoKSwgcXVlcnlTZXJ2aWNlLCBjKSk7CisJCXJlZ2lzdGVyTWVyZ2VkU2VhcmNoUXVlcnkoVGVzdFN0ZXAuY2xhc3MsCisJCQkJYyAtPiBuZXcgVGVzdFN0ZXBTZWFyY2hRdWVyeShjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLCBxdWVyeVNlcnZpY2UsIGMpKTsKKwkJcmVnaXN0ZXJNZXJnZWRTZWFyY2hRdWVyeShNZWFzdXJlbWVudC5jbGFzcywKKwkJCQljIC0+IG5ldyBNZWFzdXJlbWVudFNlYXJjaFF1ZXJ5KGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCksIHF1ZXJ5U2VydmljZSwgYykpOworCQlyZWdpc3Rlck1lcmdlZFNlYXJjaFF1ZXJ5KENoYW5uZWxHcm91cC5jbGFzcywKKwkJCQljIC0+IG5ldyBDaGFubmVsR3JvdXBTZWFyY2hRdWVyeShjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLCBxdWVyeVNlcnZpY2UsIGMpKTsKKwkJcmVnaXN0ZXJNZXJnZWRTZWFyY2hRdWVyeShDaGFubmVsLmNsYXNzLAorCQkJCWMgLT4gbmV3IENoYW5uZWxTZWFyY2hRdWVyeShjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLCBxdWVyeVNlcnZpY2UsIGMpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4+IGxpc3RTZWFyY2hhYmxlVHlwZXMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlMaXN0PD4oc2VhcmNoUXVlcmllcy5rZXlTZXQoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEVudGl0eVR5cGU+IGxpc3RFbnRpdHlUeXBlcyhDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcykgeworCQlyZXR1cm4gZmluZFNlYXJjaFF1ZXJ5KGVudGl0eUNsYXNzKS5saXN0RW50aXR5VHlwZXMoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFNlYXJjaGFibGUgZ2V0U2VhcmNoYWJsZVJvb3QoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MpIHsKKwkJcmV0dXJuIGZpbmRTZWFyY2hRdWVyeShlbnRpdHlDbGFzcykuZ2V0U2VhcmNoYWJsZVJvb3QoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8VmFsdWU+IGdldEZpbHRlclZhbHVlcyhDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcywgQXR0cmlidXRlIGF0dHJpYnV0ZSwgRmlsdGVyIGZpbHRlcikKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZpbmRTZWFyY2hRdWVyeShlbnRpdHlDbGFzcykuZ2V0RmlsdGVyVmFsdWVzKGF0dHJpYnV0ZSwgZmlsdGVyKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGZldGNoQ29tcGxldGUoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIExpc3Q8RW50aXR5VHlwZT4gZW50aXR5VHlwZXMsIEZpbHRlciBmaWx0ZXIpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVSZXN1bHQoZW50aXR5Q2xhc3MsIGZpbmRTZWFyY2hRdWVyeShlbnRpdHlDbGFzcykuZmV0Y2hDb21wbGV0ZShlbnRpdHlUeXBlcywgZmlsdGVyKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBmZXRjaChDbGFzczxUPiBlbnRpdHlDbGFzcywgTGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMsIEZpbHRlciBmaWx0ZXIpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVSZXN1bHQoZW50aXR5Q2xhc3MsIGZpbmRTZWFyY2hRdWVyeShlbnRpdHlDbGFzcykuZmV0Y2goYXR0cmlidXRlcywgZmlsdGVyKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFJlc3VsdD4gZmV0Y2hSZXN1bHRzKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzLCBMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcywgRmlsdGVyIGZpbHRlciwKKwkJCVN0cmluZyBxdWVyeSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlGaWx0ZXIgbWVyZ2VkRmlsdGVyID0gZ2V0TWVyZ2VkRmlsdGVyKGZpbHRlciwgcXVlcnkpOworCQlpZiAobWVyZ2VkRmlsdGVyLmlzRW10cHR5KCkpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJfQorCisJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShlbnRpdHlDbGFzcyk7CisJCU1hcDxTdHJpbmcsIFJlc3VsdD4gcmVjb3Jkc0J5RW50aXR5SUQgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWZvciAoUmVzdWx0IHJlc3VsdCA6IGZpbmRTZWFyY2hRdWVyeShlbnRpdHlDbGFzcykuZmV0Y2goYXR0cmlidXRlcywgbWVyZ2VkRmlsdGVyKSkgeworCQkJcmVjb3Jkc0J5RW50aXR5SUQucHV0KHJlc3VsdC5nZXRSZWNvcmQoZW50aXR5VHlwZSkuZ2V0SUQoKSwgcmVzdWx0KTsKKwkJfQorCisJCXJldHVybiBuZXcgQXJyYXlMaXN0PD4ocmVjb3Jkc0J5RW50aXR5SUQudmFsdWVzKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIExpc3Q8RW50aXR5Pj4gZmV0Y2goU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmIChmcmVlVGV4dFNlYXJjaCA9PSBudWxsKSB7CisJCQlpbml0RnJlZXRleHRTZWFyY2goKTsKKwkJfQorCisJCXJldHVybiBmcmVlVGV4dFNlYXJjaC5zZWFyY2gocXVlcnkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVGV4dFNlYXJjaEF2YWlsYWJsZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGZpbHRlciBtZXJnZWQgZnJvbSBhbiBleGlzdGluZyBmaWx0ZXIgYW5kIGEgZmlsdGVyIHJlc3VsdGluZyBmcm9tIGEKKwkgKiBmcmVldGV4dCBzZWFyY2ggcmVzdWx0LgorCSAqIAorCSAqIEBwYXJhbSBmaWx0ZXIgZmlyc3QgZmlsdGVyIHRvIG1lcmdlCisJICogQHBhcmFtIHF1ZXJ5ICBmcmVldGV4dCBxdWVyeSwgd2hpY2ggcmV0dXJucyB0aGUgaWRzIHRvIGdlbmVyYXRlIHRoZSBzZWNvbmQKKwkgKiAgICAgICAgICAgICAgIGZpbHRlciB0byBtZXJnZQorCSAqIEByZXR1cm4gY29uanVuY3Rpb24gb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgZmlsdGVyCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgT0RTRnJlZVRleHRTZWFyY2h9IGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlIG9yIGNhbm5vdCBleGVjdXRlIHRoZSBxdWVyeS4KKwkgKi8KKwlwcm90ZWN0ZWQgRmlsdGVyIGdldE1lcmdlZEZpbHRlcihGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgcXVlcnkpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoZmlsdGVyLCAiRmlsdGVyIGNhbm5vdCBiZSBudWxsISIpOworCisJCUZpbHRlciBmcmVldGV4dElkc0ZpbHRlciA9IGdldEZpbHRlckZvckZyZWV0ZXh0UXVlcnkocXVlcnkpOworCQkvLyBJZiBmcmVldGV4dCBzZWFyY2ggcXVlcnkgaXMgcHJvdmlkZWQgYnV0IHlpZWxkcyBubyByZXN1bHRzLCByZXR1cm4gZW1wdHkKKwkJLy8gZmlsdGVyIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgYmVoYXZpb3VyOgorCQlpZiAobnVsbCA9PSBmcmVldGV4dElkc0ZpbHRlcikgeworCQkJcmV0dXJuIEZpbHRlci5vcigpOworCQl9IGVsc2UgaWYgKGZpbHRlci5pc0VtdHB0eSgpKSB7CisJCQlyZXR1cm4gZnJlZXRleHRJZHNGaWx0ZXI7CisJCX0gZWxzZSBpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KHF1ZXJ5KSAmJiBmcmVldGV4dElkc0ZpbHRlci5pc0VtdHB0eSgpKSB7CisJCQlyZXR1cm4gZmlsdGVyOworCQl9IGVsc2UgeworCQkJcmV0dXJuIEZpbHRlci5hbmQoKS5tZXJnZShmaWx0ZXIsIGZyZWV0ZXh0SWRzRmlsdGVyKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIGEgZnJlZSB0ZXh0IHNlYXJjaCBhbmQgcmV0dXJucyB0aGUgSURzIG9mIHRoZSBtYXRjaGluZyBlbnRpdGllcy4KKwkgKiAKKwkgKiBAcGFyYW0gcXVlcnkgc2VhcmNoIHF1ZXJ5CisJICogQHJldHVybiBmb3VuZCBlbnRpdHkgSURzIGdyb3VwZWQgYnkgZW50aXR5LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rIE9EU0ZyZWVUZXh0U2VhcmNofSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZSBvciBjYW5ub3QgZXhlY3V0ZSB0aGUgcXVlcnkuCisJICovCisJcHJvdGVjdGVkIE1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxTdHJpbmc+PiBmZXRjaElkcyhTdHJpbmcgcXVlcnkpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShxdWVyeSkpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworCQl9CisKKwkJaWYgKGZyZWVUZXh0U2VhcmNoID09IG51bGwpIHsKKwkJCWluaXRGcmVldGV4dFNlYXJjaCgpOworCQl9CisKKwkJcmV0dXJuIGZyZWVUZXh0U2VhcmNoLnNlYXJjaElkcyhxdWVyeSk7CisJfQorCisJLyoqCisJICogRGVsZWdhdGVzIHRvIHtAbGluayBPRFNGcmVlVGV4dFNlYXJjaH0gdG8gcmV0cmlldmUgYSBtYXAgb2YgYWxsIGVudGl0eSBJRHMKKwkgKiBmb3VuZCBieSB0aGUgZ2l2ZW4gcXVlcnkuIFdpdGggdGhlIHJlc3VsdHMgYSBmaWx0ZXIgaXMgZ2VuZXJhdGVkLCB3aGljaCBjYW4KKwkgKiBiZSB1c2VkIHRvIHF1ZXJ5IHRoZSBlbnRpdHkgaW5zdGFuY2VzIG9mIHJlc3VsdCBvZiB0aGUgZnJlZSB0ZXh0IHF1ZXJ5LgorCSAqIAorCSAqIEBwYXJhbSBxdWVyeSBmdWxsdGV4dCBzZWFyY2ggcXVlcnkKKwkgKiBAcmV0dXJuIEEgbWFwIHdpdGggdGhlIGZvdW5kIGVudGl0eSBJRHMgZ3JvdXBlZCBieSB7QGxpbmsgRW50aXR5fSBjbGFzcyBvcgorCSAqICAgICAgICAgbnVsbCBpZiBhIHF1ZXJ5IHdhcyBwcm92aWRlZCBidXQgeWllbGRlZCBubyByZXN1bHRzLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rIE9EU0ZyZWVUZXh0U2VhcmNofSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZSBvciBjYW5ub3QgZXhlY3V0ZSB0aGUgcXVlcnkuCisJICovCisJcHJvdGVjdGVkIEZpbHRlciBnZXRGaWx0ZXJGb3JGcmVldGV4dFF1ZXJ5KFN0cmluZyBxdWVyeSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCisJCWlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkocXVlcnkpKSB7CisJCQkvLyBObyBxdWVyeSBwcm92aWRlZCA9PiByZXR1cm4gZW1wdHkgZmlsdGVyIGZvciBtZXJnaW5nIHdpdGggb3RoZXIgZmlsdGVyczoKKwkJCXJldHVybiBGaWx0ZXIub3IoKTsKKwkJfQorCisJCUZpbHRlciBmcmVlVGV4dFJlc3VsdHNGaWx0ZXIgPSBudWxsOworCQlmb3IgKE1hcC5FbnRyeTxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGZldGNoSWRzKHF1ZXJ5KS5lbnRyeVNldCgpKSB7CisJCQlpZiAoIWVudHJ5LmdldFZhbHVlKCkuaXNFbXB0eSgpKSB7CisJCQkJaWYgKG51bGwgPT0gZnJlZVRleHRSZXN1bHRzRmlsdGVyKSB7CisJCQkJCWZyZWVUZXh0UmVzdWx0c0ZpbHRlciA9IEZpbHRlci5vcigpOworCQkJCX0KKworCQkJCWZyZWVUZXh0UmVzdWx0c0ZpbHRlci5pZHMoY29udGV4dC5nZXRPRFNNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKGVudHJ5LmdldEtleSgpKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZnJlZVRleHRSZXN1bHRzRmlsdGVyOyAvLyBudWxsIGlmIHF1ZXJ5IHlpZWxkZWQgbm8gcmVzdWx0cworCX0KKworCS8qKgorCSAqIExvYWRzIHtAbGluayBFbnRpdHl9cyBvZiBnaXZlbiBlbnRpdHkgY2xhc3MgZm9yIGdpdmVuIHtAbGluayBSZXN1bHR9cy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIEVudGl0eSBjbGFzcyBvZiB0aGUgbG9hZGVkIHtAY29kZSBFbnRpdHl9cy4KKwkgKiBAcGFyYW0gcmVzdWx0cyAgICAgVGhlIHF1ZXJpZWQge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEByZXR1cm4gQWxsIGxvYWRlZCBlbnRpdGllcyBhcmUgcmV0dXJuZWQgYXMgYSB7QGxpbmsgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCB0aGUge0Bjb2RlIEVudGl0eX1zLgorCSAqLworCXByaXZhdGUgPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gY3JlYXRlUmVzdWx0KENsYXNzPFQ+IGVudGl0eUNsYXNzLCBMaXN0PFJlc3VsdD4gcmVzdWx0cykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gY29udGV4dC5nZXRPRFNNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKGVudGl0eUNsYXNzKTsKKwkJTWFwPFN0cmluZywgUmVzdWx0PiByZWNvcmRzQnlFbnRpdHlJRCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgeworCQkJcmVjb3Jkc0J5RW50aXR5SUQucHV0KHJlc3VsdC5nZXRSZWNvcmQoZW50aXR5VHlwZSkuZ2V0SUQoKSwgcmVzdWx0KTsKKwkJfQorCisJCU1hcDxULCBSZXN1bHQ+IHJlc3VsdHNCeUVudGl0eSA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChUIGVudGl0eSA6IGVudGl0eUxvYWRlci5sb2FkQWxsKG5ldyBLZXk8PihlbnRpdHlDbGFzcyksIHJlY29yZHNCeUVudGl0eUlELmtleVNldCgpKSkgeworCQkJcmVzdWx0c0J5RW50aXR5LnB1dChlbnRpdHksIHJlY29yZHNCeUVudGl0eUlELmdldChlbnRpdHkuZ2V0SUQoKSkpOworCQl9CisKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihyZXN1bHRzQnlFbnRpdHkua2V5U2V0KCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBTZWFyY2hRdWVyeX0gZm9yIGdpdmVuIGVudGl0eSBjbGFzcy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUge0BsaW5rIFNlYXJjaFF1ZXJ5fQorCSAqLworCXByaXZhdGUgU2VhcmNoUXVlcnkgZmluZFNlYXJjaFF1ZXJ5KENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzKSB7CisJCVNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gc2VhcmNoUXVlcmllcy5nZXQoZW50aXR5Q2xhc3MpOworCQlpZiAoc2VhcmNoUXVlcnkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIlNlYXJjaCBxdWVyeSBmb3IgdHlwZSAnIiArIGVudGl0eUNsYXNzLmdldFNpbXBsZU5hbWUoKSArICInIG5vdCBmb3VuZC4iKTsKKwkJfQorCisJCXJldHVybiBzZWFyY2hRdWVyeTsKKwl9CisKKwkvKioKKwkgKiBSZWdpc3RlcnMgYSB7QGxpbmsgU2VhcmNoUXVlcnl9IGZvciBnaXZlbiBlbnRpdHkgY2xhc3MuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVGhlIGVudGl0eSBjbGFzcyBwcm9kdWNlZCBieSB1c2luZyB0aGlzIHF1ZXJ5LgorCSAqIEBwYXJhbSBmYWN0b3J5ICAgICBUaGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBmYWN0b3J5LgorCSAqLworCXByaXZhdGUgdm9pZCByZWdpc3Rlck1lcmdlZFNlYXJjaFF1ZXJ5KENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzLAorCQkJRnVuY3Rpb248Q29udGV4dFN0YXRlLCBCYXNlRW50aXR5U2VhcmNoUXVlcnk+IGZhY3RvcnkpIHsKKwkJc2VhcmNoUXVlcmllcy5wdXQoZW50aXR5Q2xhc3MsCisJCQkJbmV3IE1lcmdlZFNlYXJjaFF1ZXJ5KGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShlbnRpdHlDbGFzcyksIGZhY3RvcnkpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdEZyZWV0ZXh0U2VhcmNoKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMaXN0PEVudmlyb25tZW50PiBhbGwgPSBlbnRpdHlMb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oRW52aXJvbm1lbnQuY2xhc3MpLCAiKiIpOworCQlpZiAoYWxsLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIk5vIGVudmlyb25tZW50IGxvYWRlZC4gU28gdGhlIFNlYXJjaCBkb2VzIG5vdCBrbm93IHdoZXJlIHRvIHNlYXJjaCIpOworCQl9CisJCVN0cmluZyBzb3VyY2VOYW1lID0gYWxsLmdldCgwKS5nZXRTb3VyY2VOYW1lKCk7CisJCWZyZWVUZXh0U2VhcmNoID0gbmV3IE9EU0ZyZWVUZXh0U2VhcmNoKGVudGl0eUxvYWRlciwgc291cmNlTmFtZSwgZXNIb3N0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1Bvb2xTZWFyY2hRdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9Qb29sU2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2MxYjE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9Qb29sU2VhcmNoUXVlcnkuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWxHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2guSm9pblRyZWUuSm9pbkNvbmZpZzsKKworLyoqCisgKiB7QGxpbmsgU2VhcmNoUXVlcnl9IGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgUG9vbH0gYXMgc291cmNlIGVudGl0eSB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBqc3QsIFBlYWsgU29sdXRpb24gR21iSAorICovCitmaW5hbCBjbGFzcyBQb29sU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNlRW50aXR5U2VhcmNoUXVlcnkgeworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbW9kZWxNYW5hZ2VyIFVzZWQgdG8gbG9hZCB7QGxpbmsgRW50aXR5VHlwZX1zLgorCSAqIEBwYXJhbSBjb250ZXh0U3RhdGUgVGhlIHtAbGluayBDb250ZXh0U3RhdGV9LgorCSAqLworCVBvb2xTZWFyY2hRdWVyeShPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBDb250ZXh0U3RhdGUgY29udGV4dFN0YXRlKSB7CisJCXN1cGVyKG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlLCBQb29sLmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkvLyBsYXllcnMKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBvb2wuY2xhc3MsIFByb2plY3QuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oUG9vbC5jbGFzcywgVGVzdC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihUZXN0LmNsYXNzLCBUZXN0U3RlcC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihUZXN0U3RlcC5jbGFzcywgTWVhc3VyZW1lbnQuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWxHcm91cC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbC5jbGFzcykpOworCisJCS8vIGNvbnRleHQKKwkJYWRkSm9pbkNvbmZpZyhjb250ZXh0U3RhdGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9Qcm9qZWN0U2VhcmNoUXVlcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvUHJvamVjdFNlYXJjaFF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzYTcyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvUHJvamVjdFNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoLkpvaW5UcmVlLkpvaW5Db25maWc7CisKKy8qKgorICoge0BsaW5rIFNlYXJjaFF1ZXJ5fSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIFByb2plY3R9IGFzIHNvdXJjZSBlbnRpdHkgdHlwZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IganN0LCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqLworZmluYWwgY2xhc3MgUHJvamVjdFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gY29udGV4dFN0YXRlIFRoZSB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKi8KKwlQcm9qZWN0U2VhcmNoUXVlcnkoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSwgQ29udGV4dFN0YXRlIGNvbnRleHRTdGF0ZSkgeworCQlzdXBlcihtb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSwgUHJvamVjdC5jbGFzcywgUHJvamVjdC5jbGFzcyk7CisKKwkJLy8gbGF5ZXJzCisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKFByb2plY3QuY2xhc3MsIFBvb2wuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oUG9vbC5jbGFzcywgVGVzdC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihUZXN0LmNsYXNzLCBUZXN0U3RlcC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihUZXN0U3RlcC5jbGFzcywgTWVhc3VyZW1lbnQuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWxHcm91cC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbC5jbGFzcykpOworCisJCS8vIGNvbnRleHQKKwkJYWRkSm9pbkNvbmZpZyhjb250ZXh0U3RhdGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9TZWFyY2hhYmxlTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9TZWFyY2hhYmxlTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDk4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1NlYXJjaGFibGVOb2RlLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaGFibGU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTZWFyY2hhYmxlfSBpbnRlcmZhY2UgZm9yIHVzZSBpbiBzZWFyY2ggcXVlcmllcworICogZGVyaXZlZCBmcm9tIHtAbGluayBCYXNlRW50aXR5U2VhcmNoUXVlcnl9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitmaW5hbCBjbGFzcyBTZWFyY2hhYmxlTm9kZSBpbXBsZW1lbnRzIFNlYXJjaGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgTGlzdDxTZWFyY2hhYmxlPiByZWxhdGVkU2VhcmNoYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIEVudGl0eVR5cGUgZW50aXR5VHlwZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKi8KKwlTZWFyY2hhYmxlTm9kZShFbnRpdHlUeXBlIGVudGl0eVR5cGUpIHsKKwkJdGhpcy5lbnRpdHlUeXBlID0gZW50aXR5VHlwZTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8U2VhcmNoYWJsZT4gZ2V0UmVsYXRlZFNlYXJjaGFibGVzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZWxhdGVkU2VhcmNoYWJsZXMpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5VHlwZSBnZXRFbnRpdHlUeXBlKCkgeworCQlyZXR1cm4gZW50aXR5VHlwZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJTZWFyY2hhYmxlKCIpLmFwcGVuZCgiRW50aXR5VHlwZSA9ICIpLmFwcGVuZChlbnRpdHlUeXBlKTsKKworCQlpZiAoIWlzTGVhZigpKSB7CisJCQlzYi5hcHBlbmQoIiwgcmVsYXRlZFNlYXJjaGFibGVzID0gIikKKwkJCQkJLmFwcGVuZChyZWxhdGVkU2VhcmNoYWJsZXMuc3RyZWFtKCkubWFwKFNlYXJjaGFibGU6OmdldEVudGl0eVR5cGUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworCQl9CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFBhY2thZ2UgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIFNlYXJjaGFibGV9IGFzIGEgY2hpbGQgdG8gdGhpcyBzZWFyY2hhYmxlLgorCSAqCisJICogQHBhcmFtIHNlYXJjaGFibGUgV2lsbCBiZSBhZGRlZCBhIGNoaWxkLgorCSAqLworCXZvaWQgYWRkUmVsYXRlZChTZWFyY2hhYmxlIHNlYXJjaGFibGUpIHsKKwkJcmVsYXRlZFNlYXJjaGFibGVzLmFkZChzZWFyY2hhYmxlKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1Rlc3RTZWFyY2hRdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9UZXN0U2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDE0ODIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9UZXN0U2VhcmNoUXVlcnkuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWxHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2guSm9pblRyZWUuSm9pbkNvbmZpZzsKKworLyoqCisgKiB7QGxpbmsgU2VhcmNoUXVlcnl9IGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgVGVzdH0gYXMgc291cmNlIGVudGl0eSB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBqc3QsIFBlYWsgU29sdXRpb24gR21iSAorICovCitmaW5hbCBjbGFzcyBUZXN0U2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNlRW50aXR5U2VhcmNoUXVlcnkgeworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbW9kZWxNYW5hZ2VyIFVzZWQgdG8gbG9hZCB7QGxpbmsgRW50aXR5VHlwZX1zLgorCSAqIEBwYXJhbSBjb250ZXh0U3RhdGUgVGhlIHtAbGluayBDb250ZXh0U3RhdGV9LgorCSAqLworCVRlc3RTZWFyY2hRdWVyeShPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBDb250ZXh0U3RhdGUgY29udGV4dFN0YXRlKSB7CisJCXN1cGVyKG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlLCBUZXN0LmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkvLyBsYXllcnMKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBvb2wuY2xhc3MsIFByb2plY3QuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3QuY2xhc3MsIFBvb2wuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oVGVzdC5jbGFzcywgVGVzdFN0ZXAuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oVGVzdFN0ZXAuY2xhc3MsIE1lYXN1cmVtZW50LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKE1lYXN1cmVtZW50LmNsYXNzLCBDaGFubmVsR3JvdXAuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWwuY2xhc3MpKTsKKworCQkvLyBjb250ZXh0CisJCWFkZEpvaW5Db25maWcoY29udGV4dFN0YXRlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvVGVzdFN0ZXBTZWFyY2hRdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9UZXN0U3RlcFNlYXJjaFF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiNDdkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvVGVzdFN0ZXBTZWFyY2hRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5Kb2luVHJlZS5Kb2luQ29uZmlnOworCisvKioKKyAqIHtAbGluayBTZWFyY2hRdWVyeX0gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBUZXN0U3RlcH0gYXMgc291cmNlIGVudGl0eQorICogdHlwZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IganN0LCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqLworZmluYWwgY2xhc3MgVGVzdFN0ZXBTZWFyY2hRdWVyeSBleHRlbmRzIEJhc2VFbnRpdHlTZWFyY2hRdWVyeSB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBsb2FkIHtAbGluayBFbnRpdHlUeXBlfXMuCisJICogQHBhcmFtIGNvbnRleHRTdGF0ZSBUaGUge0BsaW5rIENvbnRleHRTdGF0ZX0uCisJICovCisJVGVzdFN0ZXBTZWFyY2hRdWVyeShPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBDb250ZXh0U3RhdGUgY29udGV4dFN0YXRlKSB7CisJCXN1cGVyKG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlLCBUZXN0U3RlcC5jbGFzcywgUHJvamVjdC5jbGFzcyk7CisKKwkJLy8gbGF5ZXJzCisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChQb29sLmNsYXNzLCBQcm9qZWN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChUZXN0LmNsYXNzLCBQb29sLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChUZXN0U3RlcC5jbGFzcywgVGVzdC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihUZXN0U3RlcC5jbGFzcywgTWVhc3VyZW1lbnQuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWxHcm91cC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbC5jbGFzcykpOworCisJCS8vIGNvbnRleHQKKwkJYWRkSm9pbkNvbmZpZyhjb250ZXh0U3RhdGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL0Jhc2VTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9CYXNlU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkNzRhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9CYXNlU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudHJhbnNhY3Rpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsRWxlbUFjY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNFbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CisKKy8qKgorICogQSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBleGVjdXRpb24gc3RhdGVtZW50cyAoQ1JFQVRFLCBVUERBVEUsIERFTEVURSkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2Fic3RyYWN0IGNsYXNzIEJhc2VTdGF0ZW1lbnQgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgT0RTVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb247CisJcHJpdmF0ZSBmaW5hbCBPRFNFbnRpdHlUeXBlIGVudGl0eVR5cGU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gdHJhbnNhY3Rpb24gVGhlIG93bmluZyB7QGxpbmsgT0RTVHJhbnNhY3Rpb259LgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlICBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgRW50aXR5VHlwZX0uCisJICovCisJcHJvdGVjdGVkIEJhc2VTdGF0ZW1lbnQoT0RTVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQl0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisJCXRoaXMuZW50aXR5VHlwZSA9IChPRFNFbnRpdHlUeXBlKSBlbnRpdHlUeXBlOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoaXMgc3RhdGVtZW50IGZvciBnaXZlbiB7QGxpbmsgRW50aXR5fXMuCisJICoKKwkgKiBAcGFyYW0gZW50aXRpZXMgVGhlIHByb2Nlc3NlZCB7QGNvZGUgRW50aXR5fXMuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiAgICAgICAgIFRocm93biBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdGhlIGV4ZWN1dGlvbiBmYWlscy4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgVGhyb3duIGlmIGEgZmlsZSB0cmFuc2ZlciBvcGVyYXRpb24gZmFpbHMuCisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZShDb2xsZWN0aW9uPEVudGl0eT4gZW50aXRpZXMpIHRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJvdGVjdGVkIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgT0RTVHJhbnNhY3Rpb259LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9EU1RyYW5zYWN0aW9ufSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgT0RTVHJhbnNhY3Rpb24gZ2V0VHJhbnNhY3Rpb24oKSB7CisJCXJldHVybiB0cmFuc2FjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgT0RTTW9kZWxNYW5hZ2VyfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBPRFNNb2RlbE1hbmFnZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBPRFNNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgeworCQlyZXR1cm4gdHJhbnNhY3Rpb24uZ2V0TW9kZWxNYW5hZ2VyKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFF1ZXJ5U2VydmljZX0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgUXVlcnlTZXJ2aWNlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgUXVlcnlTZXJ2aWNlIGdldFF1ZXJ5U2VydmljZSgpIHsKKwkJcmV0dXJuIHRyYW5zYWN0aW9uLmdldENvbnRleHQoKS5nZXRRdWVyeVNlcnZpY2UoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKFF1ZXJ5U2VydmljZS5jbGFzcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBBcHBsRWxlbUFjY2Vzc30uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQXBwbEVsZW1BY2Nlc3N9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqLworCXByb3RlY3RlZCBBcHBsRWxlbUFjY2VzcyBnZXRBcHBsRWxlbUFjY2VzcygpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCXJldHVybiB0cmFuc2FjdGlvbi5nZXRDb250ZXh0KCkuZ2V0T0RTTW9kZWxNYW5hZ2VyKCkuZ2V0QXBwbEVsZW1BY2Nlc3MoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQge0Bjb2RlIEVudGl0eVR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBPRFNFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoKSB7CisJCXJldHVybiBlbnRpdHlUeXBlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL0NhdGFsb2dNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vQ2F0YWxvZ01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDk3NTMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL0NhdGFsb2dNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw1NjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudHJhbnNhY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsaWNhdGlvbkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQXBwbGljYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsaWNhdGlvblJlbGF0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsaWNhdGlvblN0cnVjdHVyZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQmFzZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQmFzZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkJhc2VTdHJ1Y3R1cmU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkRhdGFUeXBlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5SZWxhdGlvblJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5TZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQ29tcGFyaXNvbk9wZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0NvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ1NlbnNvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNFbnVtZXJhdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU1V0aWxzOworCisvKioKKyAqIFVzZWQgdG8gY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSwKKyAqIHtAbGluayBDYXRhbG9nU2Vuc29yfSBhbmQge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IGVudGl0aWVzLiBNb2RpZmljYXRpb25zIG9mCisgKiB0aGUgbGlzdGVkIHR5cGVzIHJlc3VsdHMgaW4gbW9kaWZpY2F0aW9ucyBvZiB0aGUgYXBwbGljYXRpb24gbW9kZWwuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIENhdGFsb2dNYW5hZ2VyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE9EU1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uOworCisJcHJpdmF0ZSBBcHBsaWNhdGlvblN0cnVjdHVyZSBhcHBsaWNhdGlvblN0cnVjdHVyZTsKKwlwcml2YXRlIEJhc2VTdHJ1Y3R1cmUgYmFzZVN0cnVjdHVyZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB0cmFuc2FjdGlvbiBUaGUge0BsaW5rIE9EU1RyYW5zYWN0aW9ufS4KKwkgKi8KKwlDYXRhbG9nTWFuYWdlcihPRFNUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbikgeworCQl0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0gYSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uCisJICogZWxlbWVudCBpbmNsdWRpbmcgYWxsIHJlcXVpcmVkIGFwcGxpY2F0aW9uIHJlbGF0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSBjYXRhbG9nQ29tcG9uZW50cyBUaGUge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9cy4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVDYXRhbG9nQ29tcG9uZW50cyhDb2xsZWN0aW9uPENhdGFsb2dDb21wb25lbnQ+IGNhdGFsb2dDb21wb25lbnRzKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQlNYXA8Q29udGV4dFR5cGUsIExpc3Q8Q2F0YWxvZ0NvbXBvbmVudD4+IGNhdGFsb2dDb21wb25lbnRzQnlDb250ZXh0VHlwZSA9IGNhdGFsb2dDb21wb25lbnRzLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KENhdGFsb2dDb21wb25lbnQ6OmdldENvbnRleHRUeXBlKSk7CisKKwkJZm9yIChFbnRyeTxDb250ZXh0VHlwZSwgTGlzdDxDYXRhbG9nQ29tcG9uZW50Pj4gZW50cnkgOiBjYXRhbG9nQ29tcG9uZW50c0J5Q29udGV4dFR5cGUuZW50cnlTZXQoKSkgeworCQkJU3RyaW5nIG9kc0NvbnRleHRUeXBlTmFtZSA9IE9EU1V0aWxzLkNPTlRFWFRUWVBFUy5nZXQoZW50cnkuZ2V0S2V5KCkpOworCQkJQXBwbGljYXRpb25FbGVtZW50IGNvbnRleHRSb290QXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKQorCQkJCQkuZ2V0RWxlbWVudEJ5TmFtZShvZHNDb250ZXh0VHlwZU5hbWUpOworCQkJQmFzZUVsZW1lbnQgY29udGV4dFJvb3RCYXNlRWxlbWVudCA9IGNvbnRleHRSb290QXBwbGljYXRpb25FbGVtZW50LmdldEJhc2VFbGVtZW50KCk7CisJCQlBcHBsaWNhdGlvbkVsZW1lbnQgY29udGV4dFRlbXBsYXRlQ29tcG9uZW50QXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKQorCQkJCQkuZ2V0RWxlbWVudEJ5TmFtZSgiVHBsIiArIG9kc0NvbnRleHRUeXBlTmFtZSArICJDb21wIik7CisJCQlCYXNlRWxlbWVudCBiYXNlRWxlbWVudCA9IGdldEJhc2VTdHJ1Y3R1cmUoKS5nZXRFbGVtZW50QnlUeXBlKCJBbyIgKyBvZHNDb250ZXh0VHlwZU5hbWUgKyAiUGFydCIpOworCisJCQlmb3IgKENhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQlBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbGljYXRpb25FbGVtZW50ID0gY3JlYXRlQXBwbGljYXRpb25FbGVtZW50KGNhdGFsb2dDb21wb25lbnQuZ2V0TmFtZSgpLAorCQkJCQkJYmFzZUVsZW1lbnQpOworCisJCQkJLy8gcmVsYXRpb24gY29udGV4dCByb290IHRvIGNvbnRleHQgY29tcG9uZW50CisJCQkJQXBwbGljYXRpb25SZWxhdGlvbiBhcHBsaWNhdGlvblJlbGF0aW9uID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5jcmVhdGVSZWxhdGlvbigpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0RWxlbTEoY29udGV4dFJvb3RBcHBsaWNhdGlvbkVsZW1lbnQpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0RWxlbTIoYXBwbGljYXRpb25FbGVtZW50KTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldFJlbGF0aW9uTmFtZShjYXRhbG9nQ29tcG9uZW50LmdldE5hbWUoKSk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRJbnZlcnNlUmVsYXRpb25OYW1lKG9kc0NvbnRleHRUeXBlTmFtZSk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbgorCQkJCQkJLnNldEJhc2VSZWxhdGlvbihnZXRCYXNlU3RydWN0dXJlKCkuZ2V0UmVsYXRpb24oY29udGV4dFJvb3RCYXNlRWxlbWVudCwgYmFzZUVsZW1lbnQpKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLl9yZWxlYXNlKCk7CisKKwkJCQkvLyByZWxhdGlvbiB0ZW1wbGF0ZSBjb21wb25lbnQgdG8gY29udGV4dCBjb21wb25lbnQKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5jcmVhdGVSZWxhdGlvbigpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0RWxlbTEoY29udGV4dFRlbXBsYXRlQ29tcG9uZW50QXBwbGljYXRpb25FbGVtZW50KTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEVsZW0yKGFwcGxpY2F0aW9uRWxlbWVudCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRSZWxhdGlvbk5hbWUoY2F0YWxvZ0NvbXBvbmVudC5nZXROYW1lKCkpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0SW52ZXJzZVJlbGF0aW9uTmFtZSgiVHBsIiArIG9kc0NvbnRleHRUeXBlTmFtZSArICJDb21wIik7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRSZWxhdGlvblJhbmdlKG5ldyBSZWxhdGlvblJhbmdlKChzaG9ydCkgMCwgKHNob3J0KSAtMSkpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0SW52ZXJzZVJlbGF0aW9uUmFuZ2UobmV3IFJlbGF0aW9uUmFuZ2UoKHNob3J0KSAxLCAoc2hvcnQpIDEpKTsKKworCQkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQkJYXBwbGljYXRpb25FbGVtZW50Ll9yZWxlYXNlKCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5fcmVsZWFzZSgpOworCQkJfQorCisJCQkvLyByZWxlYXNlIHJlc291cmNlcworCQkJY29udGV4dFRlbXBsYXRlQ29tcG9uZW50QXBwbGljYXRpb25FbGVtZW50Ll9yZWxlYXNlKCk7CisJCQljb250ZXh0Um9vdEFwcGxpY2F0aW9uRWxlbWVudC5fcmVsZWFzZSgpOworCQkJY29udGV4dFJvb3RCYXNlRWxlbWVudC5fcmVsZWFzZSgpOworCQkJYmFzZUVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgZm9yIGVhY2ggZ2l2ZW4ge0BsaW5rIENhdGFsb2dTZW5zb3J9IGEgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbgorCSAqIGVsZW1lbnQgaW5jbHVkaW5nIGFsbCByZXF1aXJlZCBhcHBsaWNhdGlvbiByZWxhdGlvbnMuCisJICoKKwkgKiBAcGFyYW0gY2F0YWxvZ1NlbnNvcnMgVGhlIHtAY29kZSBDYXRhbG9nU2Vuc29yfXMuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQ2F0YWxvZ1NlbnNvcnMoQ29sbGVjdGlvbjxDYXRhbG9nU2Vuc29yPiBjYXRhbG9nU2Vuc29ycykgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXRhbG9nU2Vuc29yPj4gY2F0YWxvZ1NlbnNvcnNCeUNhdGFsb2dDb21wb25lbnQgPSBjYXRhbG9nU2Vuc29ycy5zdHJlYW0oKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShjcyAtPiBjcy5nZXRDYXRhbG9nQ29tcG9uZW50KCkuZ2V0TmFtZSgpKSk7CisKKwkJQXBwbGljYXRpb25FbGVtZW50IGNoYW5uZWxBcHBsaWNhdGlvbkVsZW1lbnQgPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmdldEVsZW1lbnRCeU5hbWUoIk1lYVF1YW50aXR5Iik7CisJCUJhc2VFbGVtZW50IGNoYW5uZWxCYXNlRWxlbWVudCA9IGNoYW5uZWxBcHBsaWNhdGlvbkVsZW1lbnQuZ2V0QmFzZUVsZW1lbnQoKTsKKworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxDYXRhbG9nU2Vuc29yPj4gZW50cnkgOiBjYXRhbG9nU2Vuc29yc0J5Q2F0YWxvZ0NvbXBvbmVudC5lbnRyeVNldCgpKSB7CisJCQlBcHBsaWNhdGlvbkVsZW1lbnQgY29udGV4dENvbXBvbmVudEFwcGxpY2F0aW9uRWxlbWVudCA9IGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkKKwkJCQkJLmdldEVsZW1lbnRCeU5hbWUoZW50cnkuZ2V0S2V5KCkpOworCQkJQmFzZUVsZW1lbnQgY29udGV4dENvbXBvbmVudEJhc2VFbGVtZW50ID0gY29udGV4dENvbXBvbmVudEFwcGxpY2F0aW9uRWxlbWVudC5nZXRCYXNlRWxlbWVudCgpOworCQkJQXBwbGljYXRpb25FbGVtZW50IGNvbnRleHRUZW1wbGF0ZVNlbnNvckFwcGxpY2F0aW9uRWxlbWVudCA9IGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkKKwkJCQkJLmdldEVsZW1lbnRCeU5hbWUoIlRwbFNlbnNvciIpOworCQkJQmFzZUVsZW1lbnQgYmFzZUVsZW1lbnQgPSBnZXRCYXNlU3RydWN0dXJlKCkuZ2V0RWxlbWVudEJ5VHlwZSgiQW9UZXN0RXF1aXBtZW50UGFydCIpOworCisJCQlmb3IgKENhdGFsb2dTZW5zb3IgY2F0YWxvZ1NlbnNvciA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQlBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbGljYXRpb25FbGVtZW50ID0gY3JlYXRlQXBwbGljYXRpb25FbGVtZW50KGNhdGFsb2dTZW5zb3IuZ2V0TmFtZSgpLCBiYXNlRWxlbWVudCk7CisKKwkJCQkvLyByZWxhdGlvbiBjb250ZXh0IGNvbXBvbmVudCB0byBjb250ZXh0IHNlbnNvcgorCQkJCUFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbGljYXRpb25SZWxhdGlvbiA9IGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkuY3JlYXRlUmVsYXRpb24oKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEVsZW0xKGNvbnRleHRDb21wb25lbnRBcHBsaWNhdGlvbkVsZW1lbnQpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0RWxlbTIoYXBwbGljYXRpb25FbGVtZW50KTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldFJlbGF0aW9uTmFtZShjYXRhbG9nU2Vuc29yLmdldE5hbWUoKSk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRJbnZlcnNlUmVsYXRpb25OYW1lKGVudHJ5LmdldEtleSgpKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uCisJCQkJCQkuc2V0QmFzZVJlbGF0aW9uKGdldEJhc2VTdHJ1Y3R1cmUoKS5nZXRSZWxhdGlvbihjb250ZXh0Q29tcG9uZW50QmFzZUVsZW1lbnQsIGJhc2VFbGVtZW50KSk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5fcmVsZWFzZSgpOworCisJCQkJLy8gcmVsYXRpb24gdGVtcGxhdGUgc2Vuc29yIHRvIGNvbnRleHQgc2Vuc29yCisJCQkJYXBwbGljYXRpb25SZWxhdGlvbiA9IGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkuY3JlYXRlUmVsYXRpb24oKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEVsZW0xKGNvbnRleHRUZW1wbGF0ZVNlbnNvckFwcGxpY2F0aW9uRWxlbWVudCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRFbGVtMihhcHBsaWNhdGlvbkVsZW1lbnQpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0UmVsYXRpb25OYW1lKGNhdGFsb2dTZW5zb3IuZ2V0TmFtZSgpKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEludmVyc2VSZWxhdGlvbk5hbWUoIlRwbFNlbnNvciIpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0UmVsYXRpb25SYW5nZShuZXcgUmVsYXRpb25SYW5nZSgoc2hvcnQpIDAsIChzaG9ydCkgLTEpKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEludmVyc2VSZWxhdGlvblJhbmdlKG5ldyBSZWxhdGlvblJhbmdlKChzaG9ydCkgMSwgKHNob3J0KSAxKSk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5fcmVsZWFzZSgpOworCisJCQkJLy8gcmVsYXRpb24gY2hhbm5lbCB0byBjb250ZXh0IHNlbnNvcgorCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24gPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmNyZWF0ZVJlbGF0aW9uKCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRFbGVtMShjaGFubmVsQXBwbGljYXRpb25FbGVtZW50KTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEVsZW0yKGFwcGxpY2F0aW9uRWxlbWVudCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRSZWxhdGlvbk5hbWUoY2F0YWxvZ1NlbnNvci5nZXROYW1lKCkpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0SW52ZXJzZVJlbGF0aW9uTmFtZSgiTWVhUXVhbnRpdHkiKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEJhc2VSZWxhdGlvbihnZXRCYXNlU3RydWN0dXJlKCkuZ2V0UmVsYXRpb24oY2hhbm5lbEJhc2VFbGVtZW50LCBiYXNlRWxlbWVudCkpOworCisJCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJCQlhcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLl9yZWxlYXNlKCk7CisJCQl9CisKKwkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQljb250ZXh0Q29tcG9uZW50QXBwbGljYXRpb25FbGVtZW50Ll9yZWxlYXNlKCk7CisJCQljb250ZXh0VGVtcGxhdGVTZW5zb3JBcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJCWNvbnRleHRDb21wb25lbnRCYXNlRWxlbWVudC5fcmVsZWFzZSgpOworCQkJYmFzZUVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJfQorCisJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCWNoYW5uZWxBcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJY2hhbm5lbEJhc2VFbGVtZW50Ll9yZWxlYXNlKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gYSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uCisJICogYXR0cmlidXRlLgorCSAqCisJICogQHBhcmFtIGNhdGFsb2dBdHRyaWJ1dGVzIFRoZSB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX1zLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUNhdGFsb2dBdHRyaWJ1dGVzKENvbGxlY3Rpb248Q2F0YWxvZ0F0dHJpYnV0ZT4gY2F0YWxvZ0F0dHJpYnV0ZXMpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4+IGNhdGFsb2dBdHRyaWJ1dGVzQnlDYXRhbG9nQ29tcG9uZW50ID0gY2F0YWxvZ0F0dHJpYnV0ZXMuc3RyZWFtKCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoQ2F0YWxvZ01hbmFnZXI6OmdldFBhcmVudE5hbWUpKTsKKworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxDYXRhbG9nQXR0cmlidXRlPj4gZW50cnkgOiBjYXRhbG9nQXR0cmlidXRlc0J5Q2F0YWxvZ0NvbXBvbmVudC5lbnRyeVNldCgpKSB7CisJCQlBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5nZXRFbGVtZW50QnlOYW1lKGVudHJ5LmdldEtleSgpKTsKKworCQkJZm9yIChDYXRhbG9nQXR0cmlidXRlIGNhdGFsb2dBdHRyaWJ1dGUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisKKwkJCQlBcHBsaWNhdGlvbkF0dHJpYnV0ZSBhcHBsaWNhdGlvbkF0dHJpYnV0ZSA9IGFwcGxpY2F0aW9uRWxlbWVudC5jcmVhdGVBdHRyaWJ1dGUoKTsKKwkJCQlEYXRhVHlwZSBkYXRhVHlwZSA9IE9EU1V0aWxzLlZBTFVFVFlQRVMuZ2V0KGNhdGFsb2dBdHRyaWJ1dGUuZ2V0VmFsdWVUeXBlKCkpOworCQkJCWFwcGxpY2F0aW9uQXR0cmlidXRlLnNldERhdGFUeXBlKGRhdGFUeXBlKTsKKwkJCQlhcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXROYW1lKGNhdGFsb2dBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJCQlpZiAoZGF0YVR5cGUgPT0gRGF0YVR5cGUuRFRfRU5VTSkgeworCQkJCQlhcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXRFbnVtZXJhdGlvbkRlZmluaXRpb24oZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5nZXRFbnVtZXJhdGlvbkRlZmluaXRpb24oCisJCQkJCQkJT0RTRW51bWVyYXRpb25zLmdldEVudW1OYW1lKGNhdGFsb2dBdHRyaWJ1dGUuZ2V0RW51bWVyYXRpb25PYmplY3QoKSkpKTsKKwkJCQl9CisJCQkJT3B0aW9uYWw8VW5pdD4gdW5pdCA9IGNhdGFsb2dBdHRyaWJ1dGUuZ2V0VW5pdCgpOworCQkJCWlmICh1bml0LmlzUHJlc2VudCgpKSB7CisJCQkJCWFwcGxpY2F0aW9uQXR0cmlidXRlLnNldFVuaXQoT0RTQ29udmVydGVyLnRvT0RTSUQodW5pdC5nZXQoKS5nZXRJRCgpKSk7CisJCQkJfQorCisJCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJCQlhcHBsaWNhdGlvbkF0dHJpYnV0ZS5fcmVsZWFzZSgpOworCQkJfQorCisJCQkvLyByZWxlYXNlIHJlc291cmNlcworCQkJYXBwbGljYXRpb25FbGVtZW50Ll9yZWxlYXNlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgZm9yIGVhY2ggZ2l2ZW4ge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9LgorCSAqCisJICogQHBhcmFtIGNhdGFsb2dBdHRyaWJ1dGVzIFRoZSB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX1zLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZUNhdGFsb2dBdHRyaWJ1dGVzKExpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4gY2F0YWxvZ0F0dHJpYnV0ZXMpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4+IGNhdGFsb2dBdHRyaWJ1dGVzQnlDYXRhbG9nQ29tcG9uZW50ID0gY2F0YWxvZ0F0dHJpYnV0ZXMuc3RyZWFtKCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoQ2F0YWxvZ01hbmFnZXI6OmdldFBhcmVudE5hbWUpKTsKKworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxDYXRhbG9nQXR0cmlidXRlPj4gZW50cnkgOiBjYXRhbG9nQXR0cmlidXRlc0J5Q2F0YWxvZ0NvbXBvbmVudC5lbnRyeVNldCgpKSB7CisJCQlBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5nZXRFbGVtZW50QnlOYW1lKGVudHJ5LmdldEtleSgpKTsKKworCQkJZm9yIChDYXRhbG9nQXR0cmlidXRlIGNhdGFsb2dBdHRyaWJ1dGUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisKKwkJCQlBcHBsaWNhdGlvbkF0dHJpYnV0ZSBhcHBsaWNhdGlvbkF0dHJpYnV0ZSA9IGFwcGxpY2F0aW9uRWxlbWVudAorCQkJCQkJLmdldEF0dHJpYnV0ZUJ5TmFtZShjYXRhbG9nQXR0cmlidXRlLmdldE5hbWUoKSk7CisKKwkJCQlPcHRpb25hbDxVbml0PiB1bml0ID0gY2F0YWxvZ0F0dHJpYnV0ZS5nZXRVbml0KCk7CisJCQkJaWYgKHVuaXQuaXNQcmVzZW50KCkpIHsKKwkJCQkJYXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0VW5pdChPRFNDb252ZXJ0ZXIudG9PRFNJRCh1bml0LmdldCgpLmdldElEKCkpKTsKKwkJCQl9CisKKwkJCQkvLyByZWxlYXNlIHJlc291cmNlcworCQkJCWFwcGxpY2F0aW9uQXR0cmlidXRlLl9yZWxlYXNlKCk7CisJCQl9CisKKwkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQlhcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIERlbGV0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gZWxlbWVudCBmb3IgZWFjaCBnaXZlbgorCSAqIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4gRGVsZXRpbmcgYSB7QGNvZGUgQ2F0YWxvZ0NvbXBvbmVudH0gaXMgb25seSBhbGxvd2VkCisJICogaWYgaXQgaXMgbm90IHVzZWQgaW4gdGVtcGxhdGVzIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuIGNvdWxkIGJlIGRlbGV0ZWQuIFNvCisJICogYXQgZmlyc3QgaXQgaXMgdHJpZWQgdG8gZGVsZXRlIGl0cyB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX1zIGFuZAorCSAqIHtAbGluayBDYXRhbG9nU2Vuc29yfXMuIE9uIHN1Y2Nlc3MgaXQgaXMgZW5zdXJlZCBub25lIG9mIHRoZSBnaXZlbiB7QGNvZGUKKwkgKiBDYXRhbG9nQ29tcG9uZW50fXMgaXMgdXNlZCBpbiB0ZW1wbGF0ZXMuIEZpbmFsbHkgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiBhcHBsaWNhdGlvbiBlbGVtZW50cyBhcmUgZGVsZXRlZC4KKwkgKgorCSAqIEBwYXJhbSBjYXRhbG9nQ29tcG9uZW50cyBUaGUge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9cy4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uICAgICAgICAgVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlQ2F0YWxvZ0NvbXBvbmVudHMoQ29sbGVjdGlvbjxDYXRhbG9nQ29tcG9uZW50PiBjYXRhbG9nQ29tcG9uZW50cykKKwkJCXRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlMaXN0PENhdGFsb2dTZW5zb3I+IHNlbnNvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChDYXRhbG9nQ29tcG9uZW50IGNhdGFsb2dDb21wb25lbnQgOiBjYXRhbG9nQ29tcG9uZW50cykgeworCQkJYXR0cmlidXRlcy5hZGRBbGwoY2F0YWxvZ0NvbXBvbmVudC5nZXRDYXRhbG9nQXR0cmlidXRlcygpKTsKKwkJCXNlbnNvcnMuYWRkQWxsKGNhdGFsb2dDb21wb25lbnQuZ2V0Q2F0YWxvZ1NlbnNvcnMoKSk7CisJCX0KKwkJdHJhbnNhY3Rpb24uZGVsZXRlKHNlbnNvcnMpOworCQl0cmFuc2FjdGlvbi5kZWxldGUoYXR0cmlidXRlcyk7CisKKwkJaWYgKGFyZVJlZmVyZW5jZWRJblRlbXBsYXRlcyhjYXRhbG9nQ29tcG9uZW50cykpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKAorCQkJCQkiVW5hYmxlIHRvIGRlbGV0ZSBnaXZlbiBjYXRhbG9nIGNvbXBvbmVudHMgc2luY2UgYXQgbGVhc3QgIiArICJvbmUgaXMgdXNlZCBpbiB0ZW1wbGF0ZXMuIik7CisJCX0KKworCQlmb3IgKENhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCA6IGNhdGFsb2dDb21wb25lbnRzKSB7CisJCQlBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKQorCQkJCQkuZ2V0RWxlbWVudEJ5TmFtZShjYXRhbG9nQ29tcG9uZW50LmdldE5hbWUoKSk7CisJCQlmb3IgKEFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbGljYXRpb25SZWxhdGlvbiA6IGFwcGxpY2F0aW9uRWxlbWVudC5nZXRBbGxSZWxhdGlvbnMoKSkgeworCQkJCWdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkucmVtb3ZlUmVsYXRpb24oYXBwbGljYXRpb25SZWxhdGlvbik7CisKKwkJCQkvLyByZWxlYXNlIHJlc291cmNlcworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uX3JlbGVhc2UoKTsKKwkJCX0KKwkJCWdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkucmVtb3ZlRWxlbWVudChhcHBsaWNhdGlvbkVsZW1lbnQpOworCisJCQkvLyByZWxlYXNlIHJlc291cmNlcworCQkJYXBwbGljYXRpb25FbGVtZW50Ll9yZWxlYXNlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBEZWxldGVzIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGVsZW1lbnQgZm9yIGVhY2ggZ2l2ZW4KKwkgKiB7QGxpbmsgQ2F0YWxvZ1NlbnNvcn0uIERlbGV0aW5nIGEge0Bjb2RlIENhdGFsb2dTZW5zb3J9IGlzIG9ubHkgYWxsb3dlZCBpZiBpdAorCSAqIGlzIG5vdCB1c2VkIGluIHRlbXBsYXRlcyBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiBjb3VsZCBiZSBkZWxldGVkLiBTbyBhdAorCSAqIGZpcnN0IGl0IGlzIHRyaWVkIHRvIGRlbGV0ZSBpdHMge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9cy4gT24gc3VjY2VzcyBpdCBpcworCSAqIGVuc3VyZWQgbm9uZSBvZiB0aGUgZ2l2ZW4ge0Bjb2RlIENhdGFsb2dTZW5zb3J9cyBpcyB1c2VkIGluIHRlbXBsYXRlcy4KKwkgKiBGaW5hbGx5IHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGVsZW1lbnRzIGFyZSBkZWxldGVkLgorCSAqCisJICogQHBhcmFtIGNhdGFsb2dTZW5zb3JzIFRoZSB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn1zLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxldGVDYXRhbG9nU2Vuc29ycyhDb2xsZWN0aW9uPENhdGFsb2dTZW5zb3I+IGNhdGFsb2dTZW5zb3JzKSB0aHJvd3MgQW9FeGNlcHRpb24sIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMaXN0PENhdGFsb2dBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChDYXRhbG9nU2Vuc29yIGNhdGFsb2dTZW5zb3IgOiBjYXRhbG9nU2Vuc29ycykgeworCQkJYXR0cmlidXRlcy5hZGRBbGwoY2F0YWxvZ1NlbnNvci5nZXRDYXRhbG9nQXR0cmlidXRlcygpKTsKKwkJfQorCQl0cmFuc2FjdGlvbi5kZWxldGUoYXR0cmlidXRlcyk7CisKKwkJaWYgKGFyZVJlZmVyZW5jZWRJblRlbXBsYXRlcyhjYXRhbG9nU2Vuc29ycykpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKAorCQkJCQkiVW5hYmxlIHRvIGRlbGV0ZSBnaXZlbiBjYXRhbG9nIHNlbnNvcnMgc2luY2UgYXQgIiArICJsZWFzdCBvbmUgaXMgdXNlZCBpbiB0ZW1wbGF0ZXMuIik7CisJCX0KKworCQlmb3IgKENhdGFsb2dTZW5zb3IgY2F0YWxvZ1NlbnNvciA6IGNhdGFsb2dTZW5zb3JzKSB7CisJCQlBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5nZXRFbGVtZW50QnlOYW1lKGNhdGFsb2dTZW5zb3IuZ2V0TmFtZSgpKTsKKwkJCWZvciAoQXBwbGljYXRpb25SZWxhdGlvbiBhcHBsaWNhdGlvblJlbGF0aW9uIDogYXBwbGljYXRpb25FbGVtZW50LmdldEFsbFJlbGF0aW9ucygpKSB7CisJCQkJZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5yZW1vdmVSZWxhdGlvbihhcHBsaWNhdGlvblJlbGF0aW9uKTsKKworCQkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5fcmVsZWFzZSgpOworCQkJfQorCQkJZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5yZW1vdmVFbGVtZW50KGFwcGxpY2F0aW9uRWxlbWVudCk7CisKKwkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQlhcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJfQorCisJfQorCisJLyoqCisJICogRGVsZXRlcyB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIGZvciBlYWNoIGdpdmVuCisJICoge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9LiBEZWxldGluZyBhIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSBpcyBvbmx5IGFsbG93ZWQKKwkgKiBpZiBpdCBpcyBub3QgdXNlZCBpbiB0ZW1wbGF0ZXMuIFNvIGF0IGZpcnN0IGl0IGlzIGVuc3VyZWQgbm9uZSBvZiB0aGUgZ2l2ZW4KKwkgKiB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX1zIGlzIHVzZWQgaW4gdGVtcGxhdGVzIGFuZCBmaW5hbGx5IHRoZSBjb3JyZXNwb25kaW5nCisJICogYXBwbGljYXRpb24gYXR0cmlidXRlcyBhcmUgZGVsZXRlZC4KKwkgKgorCSAqIEBwYXJhbSBjYXRhbG9nQXR0cmlidXRlcyBUaGUge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9cy4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uICAgICAgICAgVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlQ2F0YWxvZ0F0dHJpYnV0ZXMoQ29sbGVjdGlvbjxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlcykKKwkJCXRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmIChhcmVSZWZlcmVuY2VkSW5UZW1wbGF0ZXMoY2F0YWxvZ0F0dHJpYnV0ZXMpKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigKKwkJCQkJIlVuYWJsZSB0byBkZWxldGUgZ2l2ZW4gY2F0YWxvZyBhdHRyaWJ1dGVzIHNpbmNlIGF0IGxlYXN0ICIgKyAib25lIGlzIHVzZWQgaW4gdGVtcGxhdGVzLiIpOworCQl9CisKKwkJTWFwPFN0cmluZywgTGlzdDxDYXRhbG9nQXR0cmlidXRlPj4gY2F0YWxvZ0F0dHJpYnV0ZXNCeVBhcmVudCA9IGNhdGFsb2dBdHRyaWJ1dGVzLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KENhdGFsb2dNYW5hZ2VyOjpnZXRQYXJlbnROYW1lKSk7CisKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4+IGVudHJ5IDogY2F0YWxvZ0F0dHJpYnV0ZXNCeVBhcmVudC5lbnRyeVNldCgpKSB7CisJCQlBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5nZXRFbGVtZW50QnlOYW1lKGVudHJ5LmdldEtleSgpKTsKKworCQkJZm9yIChDYXRhbG9nQXR0cmlidXRlIGNhdGFsb2dBdHRyaWJ1dGUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJQXBwbGljYXRpb25BdHRyaWJ1dGUgYXBwbGljYXRpb25BdHRyaWJ1dGUgPSBhcHBsaWNhdGlvbkVsZW1lbnQKKwkJCQkJCS5nZXRBdHRyaWJ1dGVCeU5hbWUoY2F0YWxvZ0F0dHJpYnV0ZS5nZXROYW1lKCkpOworCQkJCWFwcGxpY2F0aW9uRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXBwbGljYXRpb25BdHRyaWJ1dGUpOworCisJCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJCQlhcHBsaWNhdGlvbkF0dHJpYnV0ZS5fcmVsZWFzZSgpOworCQkJfQorCisJCQkvLyByZWxlYXNlIHJlc291cmNlcworCQkJYXBwbGljYXRpb25FbGVtZW50Ll9yZWxlYXNlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZWxlYXNlcyBjYWNoZWQgcmVzb3VyY2VzLgorCSAqLworCXB1YmxpYyB2b2lkIGNsZWFyKCkgeworCQlpZiAoYXBwbGljYXRpb25TdHJ1Y3R1cmUgIT0gbnVsbCkgeworCQkJYXBwbGljYXRpb25TdHJ1Y3R1cmUuX3JlbGVhc2UoKTsKKwkJfQorCisJCWlmIChiYXNlU3RydWN0dXJlICE9IG51bGwpIHsKKwkJCWJhc2VTdHJ1Y3R1cmUuX3JlbGVhc2UoKTsKKwkJfQorCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBBcHBsaWNhdGlvbkVsZW1lbnR9IHdpdGggZ2l2ZW4gbmFtZSBhbmQKKwkgKiB7QGxpbmsgQmFzZUVsZW1lbnR9LiBUaGUgcmV0dXJuZWQge0Bjb2RlIEFwcGxpY2F0aW9uRWxlbWVudH0gd2lsbCBiZSBjcmVhdGVkCisJICogd2l0aCB0aGUgdGhyZWUgbWFuZGF0b3J5IHtAbGluayBBcHBsaWNhdGlvbkF0dHJpYnV0ZX1zIGZvciAnSWQnLCAnTmFtZScgYW5kCisJICogJ01pbWVUeXBlJy4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKwkgKiBAcGFyYW0gYmFzZUVsZW1lbnQgVGhlIHtAY29kZSBCYXNlRWxlbWVudH0gdGhlIGNyZWF0ZWQge0Bjb2RlCisJICogCQlBcHBsaWNhdGlvbkVsZW1lbnR9IHdpbGwgYmUgZGVyaXZlZCBmcm9tLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIEFwcGxpY2F0aW9uRWxlbWVudH0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICovCisJcHJpdmF0ZSBBcHBsaWNhdGlvbkVsZW1lbnQgY3JlYXRlQXBwbGljYXRpb25FbGVtZW50KFN0cmluZyBuYW1lLCBCYXNlRWxlbWVudCBiYXNlRWxlbWVudCkgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJQXBwbGljYXRpb25FbGVtZW50IGFwcGxpY2F0aW9uRWxlbWVudCA9IGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkuY3JlYXRlRWxlbWVudChiYXNlRWxlbWVudCk7CisJCWFwcGxpY2F0aW9uRWxlbWVudC5zZXROYW1lKG5hbWUpOworCisJCS8vIElkCisJCUFwcGxpY2F0aW9uQXR0cmlidXRlIGlkQXBwbGljYXRpb25BdHRyaWJ1dGUgPSBhcHBsaWNhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlQnlCYXNlTmFtZSgiaWQiKTsKKwkJaWRBcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXROYW1lKCJJZCIpOworCQlpZEFwcGxpY2F0aW9uQXR0cmlidXRlLnNldERhdGFUeXBlKERhdGFUeXBlLkRUX0xPTkdMT05HKTsKKwkJaWRBcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXRJc0F1dG9nZW5lcmF0ZWQodHJ1ZSk7CisKKwkJLy8gTmFtZQorCQlBcHBsaWNhdGlvbkF0dHJpYnV0ZSBuYW1lQXBwbGljYXRpb25BdHRyaWJ1dGUgPSBhcHBsaWNhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlQnlCYXNlTmFtZSgibmFtZSIpOworCQluYW1lQXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0TmFtZSgiTmFtZSIpOworCQluYW1lQXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0TGVuZ3RoKDUwKTsKKworCQkvLyBNaW1lVHlwZQorCQlCYXNlQXR0cmlidXRlIG1pbWVUeXBlQmFzZUF0dHJpYnV0ZSA9IGJhc2VFbGVtZW50LmdldEF0dHJpYnV0ZXMoIm1pbWVfdHlwZSIpWzBdOworCQlBcHBsaWNhdGlvbkF0dHJpYnV0ZSBtaW1lVHlwZUFwcGxpY2F0aW9uQXR0cmlidXRlID0gYXBwbGljYXRpb25FbGVtZW50LmNyZWF0ZUF0dHJpYnV0ZSgpOworCQltaW1lVHlwZUFwcGxpY2F0aW9uQXR0cmlidXRlLnNldEJhc2VBdHRyaWJ1dGUobWltZVR5cGVCYXNlQXR0cmlidXRlKTsKKwkJbWltZVR5cGVBcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXROYW1lKCJNaW1lVHlwZSIpOworCQltaW1lVHlwZUFwcGxpY2F0aW9uQXR0cmlidXRlLnNldERhdGFUeXBlKERhdGFUeXBlLkRUX1NUUklORyk7CisJCW1pbWVUeXBlQXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0TGVuZ3RoKDI1Nik7CisJCW1pbWVUeXBlQXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0SXNPYmxpZ2F0b3J5KHRydWUpOworCisJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCWlkQXBwbGljYXRpb25BdHRyaWJ1dGUuX3JlbGVhc2UoKTsKKwkJbmFtZUFwcGxpY2F0aW9uQXR0cmlidXRlLl9yZWxlYXNlKCk7CisJCW1pbWVUeXBlQXBwbGljYXRpb25BdHRyaWJ1dGUuX3JlbGVhc2UoKTsKKwkJbWltZVR5cGVCYXNlQXR0cmlidXRlLl9yZWxlYXNlKCk7CisKKwkJcmV0dXJuIGFwcGxpY2F0aW9uRWxlbWVudDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjYWNoZWQge0BsaW5rIEFwcGxpY2F0aW9uU3RydWN0dXJlfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBBcHBsaWNhdGlvblN0cnVjdHVyZX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGFjY2VzcyB0aGUge0Bjb2RlCisJICogCQlBcHBsaWNhdGlvblN0cnVjdHVyZX0uCisJICovCisJcHJpdmF0ZSBBcHBsaWNhdGlvblN0cnVjdHVyZSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCWlmIChhcHBsaWNhdGlvblN0cnVjdHVyZSA9PSBudWxsKSB7CisJCQlhcHBsaWNhdGlvblN0cnVjdHVyZSA9IHRyYW5zYWN0aW9uLmdldE1vZGVsTWFuYWdlcigpLmdldEFvU2Vzc2lvbigpLmdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCk7CisJCX0KKworCQlyZXR1cm4gYXBwbGljYXRpb25TdHJ1Y3R1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY2FjaGVkIHtAbGluayBCYXNlU3RydWN0dXJlfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBCYXNlU3RydWN0dXJlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gYWNjZXNzIHRoZSB7QGNvZGUKKwkgKiAJCUJhc2VTdHJ1Y3R1cmV9LgorCSAqLworCXByaXZhdGUgQmFzZVN0cnVjdHVyZSBnZXRCYXNlU3RydWN0dXJlKCkgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJaWYgKGJhc2VTdHJ1Y3R1cmUgPT0gbnVsbCkgeworCQkJYmFzZVN0cnVjdHVyZSA9IHRyYW5zYWN0aW9uLmdldE1vZGVsTWFuYWdlcigpLmdldEFvU2Vzc2lvbigpLmdldEJhc2VTdHJ1Y3R1cmUoKTsKKwkJfQorCisJCXJldHVybiBiYXNlU3RydWN0dXJlOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHtAbGluayBFbnRpdHl9cyBhcmUgcmVmZXJlbmNlZCBpbiB0ZW1wbGF0ZXMuCisJICoKKwkgKiBAcGFyYW0gZW50aXRpZXMgVGhlIGNoZWNrZWQgZW50aXRpZXMgKHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSwKKwkgKiAgICAgICAgICAgICAgICAge0BsaW5rIENhdGFsb2dTZW5zb3J9IG9yIHtAbGluayBDYXRhbG9nQXR0cmlidXRlfSkuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBhdCBsZWFzdCBvbmUgZW50aXR5IGlzIHJlZmVyZW5jZWQgaW4gYQorCSAqICAgICAgICAgdGVtcGxhdGUuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiAgICAgICAgIFRocm93biBvbiBlcnJvcnMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBvbiBlcnJvcnMuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGFyZVJlZmVyZW5jZWRJblRlbXBsYXRlcyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0aWVzKQorCQkJdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTWFwPEVudGl0eVR5cGUsIExpc3Q8RW50aXR5Pj4gZW50aXRpZXNCeUVudGl0eVR5cGUgPSBlbnRpdGllcy5zdHJlYW0oKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeSh0cmFuc2FjdGlvbi5nZXRNb2RlbE1hbmFnZXIoKTo6Z2V0RW50aXR5VHlwZSkpOworCisJCWZvciAoRW50cnk8RW50aXR5VHlwZSwgTGlzdDxFbnRpdHk+PiBlbnRyeSA6IGVudGl0aWVzQnlFbnRpdHlUeXBlLmVudHJ5U2V0KCkpIHsKKwkJCUVudGl0eVR5cGUgc291cmNlID0gZW50cnkuZ2V0S2V5KCk7CisJCQlFbnRpdHlUeXBlIHRhcmdldCA9IHRyYW5zYWN0aW9uLmdldE1vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoc291cmNlLmdldE5hbWUoKS5yZXBsYWNlKCJDYXQiLCAiVHBsIikpOworCisJCQlRdWVyeSBxdWVyeSA9IHRyYW5zYWN0aW9uLmdldENvbnRleHQoKS5nZXRRdWVyeVNlcnZpY2UoKQorCQkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbihRdWVyeVNlcnZpY2UuY2xhc3MpKS5jcmVhdGVRdWVyeSgpCisJCQkJCS5zZWxlY3RJRCh0YXJnZXQpLmpvaW4oc291cmNlLCB0YXJnZXQpOworCisJCQlMaXN0PFJlc3VsdD4gcmVzdWx0cyA9IHF1ZXJ5LmZldGNoKEZpbHRlci5hbmQoKS5hZGQoCisJCQkJCUNvbXBhcmlzb25PcGVyYXRvci5JTl9TRVQuY3JlYXRlKHNvdXJjZS5nZXRJREF0dHJpYnV0ZSgpLCBjb2xsZWN0SW5zdGFuY2VJRHMoZW50cnkuZ2V0VmFsdWUoKSkpKSk7CisJCQlpZiAocmVzdWx0cy5zaXplKCkgPiAwKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQ29sbGVjdCB0aGUgaW5zdGFuY2UgSURzIG9mIGFsbCBnaXZlbiB7QGxpbmsgRW50aXR5fXMuCisJICoKKwkgKiBAcGFyYW0gZW50aXRpZXMgVGhlIHtAbGluayBFbnRpdHl9cy4KKwkgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBJRHMgYSB7QGNvZGUgU3RyaW5nW119IGFyZSB0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gY29sbGVjdEluc3RhbmNlSURzKExpc3Q8RW50aXR5PiBlbnRpdGllcykgeworCQlTdHJpbmdbXSBpZHMgPSBuZXcgU3RyaW5nW2VudGl0aWVzLnNpemUoKV07CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKKwkJCWlkc1tpXSA9IGVudGl0aWVzLmdldChpKS5nZXRJRCgpOworCQl9CisKKwkJcmV0dXJuIGlkczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgbmFtZSBmb3IgZ2l2ZW4ge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9LgorCSAqCisJICogQHBhcmFtIGNhdGFsb2dBdHRyaWJ1dGUgVGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfS4KKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQgbmFtZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZShDYXRhbG9nQXR0cmlidXRlIGNhdGFsb2dBdHRyaWJ1dGUpIHsKKwkJT3B0aW9uYWw8Q2F0YWxvZ0NvbXBvbmVudD4gY2F0YWxvZ0NvbXBvbmVudCA9IGNhdGFsb2dBdHRyaWJ1dGUuZ2V0Q2F0YWxvZ0NvbXBvbmVudCgpOworCQlpZiAoY2F0YWxvZ0NvbXBvbmVudC5pc1ByZXNlbnQoKSkgeworCQkJcmV0dXJuIGNhdGFsb2dDb21wb25lbnQuZ2V0KCkuZ2V0TmFtZSgpOworCQl9CisKKwkJcmV0dXJuIGNhdGFsb2dBdHRyaWJ1dGUuZ2V0Q2F0YWxvZ1NlbnNvcigpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBhcmVudCBlbnRpdHkgaXMgdW5rbm93bi4iKSkuZ2V0TmFtZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL0RlbGV0ZVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL0RlbGV0ZVN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjM2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vRGVsZXRlU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudHJhbnNhY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmlsZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVzQXR0YWNoYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlBhcmFtZXRlclNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkpvaW5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogRGVsZXRlIHN0YXRlbWVudCBpcyB1c2VkIHRvIGRlbGV0ZSBlbnRpdGllcyB3aXRoIHRoZWlyIGNoaWxkcmVuLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitmaW5hbCBjbGFzcyBEZWxldGVTdGF0ZW1lbnQgZXh0ZW5kcyBCYXNlU3RhdGVtZW50IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gQVVUT19ERUxFVEFCTEUgPSBBcnJheXMuYXNMaXN0KCJNZWFRdWFudGl0eSIsICJTdWJNYXRyaXgiLCAiTG9jYWxDb2x1bW4iLAorCQkJIkV4dGVybmFsQ29tcG9uZW50Iik7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERlbGV0ZVN0YXRlbWVudC5jbGFzcyk7CisKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlQXV0b0RlbGV0ZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB0cmFuc2FjdGlvbiAgIFRoZSBvd25pbmcge0BsaW5rIE9EU1RyYW5zYWN0aW9ufS4KKwkgKiBAcGFyYW0gZW50aXR5VHlwZSAgICBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIHVzZUF1dG9EZWxldGUgSWYge0Bjb2RlIHRydWV9IGNoaWxkIHJlbGF0aW9ucyBvZiB7QGxpbmsgTWVhc3VyZW1lbnR9CisJICogICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMgYXJlIG5vdCBmb2xsb3dlZC4KKwkgKi8KKwlEZWxldGVTdGF0ZW1lbnQoT0RTVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIEVudGl0eVR5cGUgZW50aXR5VHlwZSwgYm9vbGVhbiB1c2VBdXRvRGVsZXRlKSB7CisJCXN1cGVyKHRyYW5zYWN0aW9uLCBlbnRpdHlUeXBlKTsKKwkJdGhpcy51c2VBdXRvRGVsZXRlID0gdXNlQXV0b0RlbGV0ZTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZXhlY3V0ZShDb2xsZWN0aW9uPEVudGl0eT4gZW50aXRpZXMpIHRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmIChlbnRpdGllcy5zdHJlYW0oKS5maWx0ZXIoZSAtPiAhZS5nZXRUeXBlTmFtZSgpLmVxdWFscyhnZXRFbnRpdHlUeXBlKCkuZ2V0TmFtZSgpKSkuZmluZEFueSgpLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdCBsZWFzdCBvbmUgZ2l2ZW4gZW50aXR5IGlzIG9mIGluY29tcGF0aWJsZSB0eXBlLiIpOworCQl9CisKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlpbnQgYW1vdW50ID0gZGVsZXRlKGdldEVudGl0eVR5cGUoKSwgZW50aXRpZXMuc3RyZWFtKCkubWFwKEVudGl0eTo6Z2V0SUQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSwgZmFsc2UpOworCQlMT0dHRVIuZGVidWcoInt9IGluc3RhbmNlcyBkZWxldGVkIGluIHt9IG1zLiIsIGFtb3VudCwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJlY3Vyc2l2ZWx5IGZvbGxvd3MgY2hpbGQgcmVsYXRpb25zIG9mIGdpdmVuIGVudGl0aWVzIGFuZCBkZWxldGVzIGFsbCBjaGlsZAorCSAqIGVudGl0aWVzIGJlZm9yZSBkZWxldGluZyBwYXJlbnQgZW50aXRpZXMuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSAgICAge0BsaW5rIEVudGl0eVR5cGV9IG9mIHRoZSBkZWxldGVkIGVudGl0aWVzLgorCSAqIEBwYXJhbSBpbnN0YW5jZUlEcyAgICBJbnN0YW5jZSBJRHMgb2YgZW50aXRpZXMgd2hpY2ggaGF2ZSB0byBiZSBkZWxldGVkLgorCSAqIEBwYXJhbSBpZ25vcmVTaWJsaW5ncyBJcyBpdCByZXF1aXJlZCB0byBjaGVjayB3aGV0aGVyIHtAbGluayBNZWFzdXJlbWVudH0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ3Mgc2hhcmUgYSBjb21tb24ge0BsaW5rIENvbnRleHRSb290fXMuCisJICogQHJldHVybiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZGVsZXRlZCBpbnN0YW5jZXMuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiAgICAgICAgIFRocm93biBpZiB1bmFibGUgdG8gZGVsZXRlIGVudGl0aWVzLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHF1ZXJ5IGNoaWxkIGVudGl0aWVzLgorCSAqLworCXByaXZhdGUgaW50IGRlbGV0ZShFbnRpdHlUeXBlIGVudGl0eVR5cGUsIENvbGxlY3Rpb248U3RyaW5nPiBpbnN0YW5jZUlEcywgYm9vbGVhbiBpZ25vcmVTaWJsaW5ncykKKwkJCXRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmIChpbnN0YW5jZUlEcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJUXVlcnkgcXVlcnkgPSBnZXRRdWVyeVNlcnZpY2UoKS5jcmVhdGVRdWVyeSgpLnNlbGVjdElEKGVudGl0eVR5cGUpOworCQlmb3IgKFJlbGF0aW9uIHJlbGF0aW9uIDogZW50aXR5VHlwZS5nZXRDaGlsZFJlbGF0aW9ucygpKSB7CisJCQlpZiAodXNlQXV0b0RlbGV0ZSAmJiBBVVRPX0RFTEVUQUJMRS5jb250YWlucyhyZWxhdGlvbi5nZXRUYXJnZXQoKS5nZXROYW1lKCkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghcmVsYXRpb24uZ2V0VGFyZ2V0KCkuZXF1YWxzKHJlbGF0aW9uLmdldFNvdXJjZSgpKSkgeworCQkJCXF1ZXJ5LmpvaW4ocmVsYXRpb24sIEpvaW5UeXBlLk9VVEVSKS5zZWxlY3RJRChyZWxhdGlvbi5nZXRUYXJnZXQoKSk7CisJCQl9CisJCX0KKworCQkvLyBzZWxlY3QgYXR0cmlidXRlcyBjb250YWluaW5nIGZpbGUgbGlua3Mgb25seSBmb3IgZW50aXR5IHR5cGVzCisJCS8vIGltcGxlbWVudGluZyBGaWxlc0F0dGFjaGFibGUKKwkJRW50aXR5Q29uZmlnPD8+IGVudGl0eUNvbmZpZyA9IGdldE1vZGVsTWFuYWdlcigpLmdldEVudGl0eUNvbmZpZyhlbnRpdHlUeXBlKTsKKwkJaWYgKEZpbGVzQXR0YWNoYWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGVudGl0eUNvbmZpZy5nZXRFbnRpdHlDbGFzcygpKSkgeworCQkJZW50aXR5VHlwZS5nZXRBdHRyaWJ1dGVzKCkuc3RyZWFtKCkuZmlsdGVyKGEgLT4gYS5nZXRWYWx1ZVR5cGUoKS5pc0ZpbGVMaW5rVHlwZSgpKS5mb3JFYWNoKHF1ZXJ5OjpzZWxlY3QpOworCQl9CisKKwkJRW50aXR5VHlwZSB0ZXN0U3RlcCA9IGdldE1vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoVGVzdFN0ZXAuY2xhc3MpOworCQlFbnRpdHlUeXBlIG1lYXN1cmVtZW50ID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShNZWFzdXJlbWVudC5jbGFzcyk7CisJCUVudGl0eVR5cGUgY2hhbm5lbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoQ2hhbm5lbC5jbGFzcyk7CisKKwkJRW50aXR5VHlwZSB1bml0VW5kZXJUZXN0ID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShDb250ZXh0Um9vdC5jbGFzcywgQ29udGV4dFR5cGUuVU5JVFVOREVSVEVTVCk7CisJCUVudGl0eVR5cGUgdGVzdFNlcXVlbmNlID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShDb250ZXh0Um9vdC5jbGFzcywgQ29udGV4dFR5cGUuVEVTVFNFUVVFTkNFKTsKKwkJRW50aXR5VHlwZSB0ZXN0RXF1aXBtZW50ID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShDb250ZXh0Um9vdC5jbGFzcywgQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCk7CisKKwkJLy8gdHlwZSBpbiB0aGlzIGxpc3QgbXVzdCBiZSBkZWxldGVkIEFGVEVSIHRoaXMgdGhpcyBpbnN0YW5jZXMgaGF2ZSBiZWVuCisJCS8vIGRlbGV0ZWQKKwkJLy8gaW5mb3JtYXRpdmUgcmVsYXRpb24gaXMgY29uc2lkZXJlZCBhcyBhIGNoaWxkIHJlbGF0aW9uCisJCUxpc3Q8RW50aXR5VHlwZT4gZGVsYXllZERlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCS8vIGpvaW4gY29udGV4dCByb290cworCQlpZiAobWVhc3VyZW1lbnQuZXF1YWxzKGVudGl0eVR5cGUpIHx8IHRlc3RTdGVwLmVxdWFscyhlbnRpdHlUeXBlKSkgeworCQkJcXVlcnkuam9pbihlbnRpdHlUeXBlLmdldFJlbGF0aW9uKHVuaXRVbmRlclRlc3QpLCBKb2luVHlwZS5PVVRFUikuc2VsZWN0SUQodW5pdFVuZGVyVGVzdCk7CisJCQlxdWVyeS5qb2luKGVudGl0eVR5cGUuZ2V0UmVsYXRpb24odGVzdFNlcXVlbmNlKSwgSm9pblR5cGUuT1VURVIpLnNlbGVjdElEKHRlc3RTZXF1ZW5jZSk7CisJCQlxdWVyeS5qb2luKGVudGl0eVR5cGUuZ2V0UmVsYXRpb24odGVzdEVxdWlwbWVudCksIEpvaW5UeXBlLk9VVEVSKS5zZWxlY3RJRCh0ZXN0RXF1aXBtZW50KTsKKwkJCWRlbGF5ZWREZWxldGUuYWRkQWxsKEFycmF5cy5hc0xpc3QodW5pdFVuZGVyVGVzdCwgdGVzdFNlcXVlbmNlLCB0ZXN0RXF1aXBtZW50KSk7CisJCX0KKworCQkvLyBqb2luIHBhcmFtZXRlciBzZXRzCisJCWlmIChtZWFzdXJlbWVudC5lcXVhbHMoZW50aXR5VHlwZSkgfHwgY2hhbm5lbC5lcXVhbHMoZW50aXR5VHlwZSkpIHsKKwkJCUVudGl0eVR5cGUgcGFyYW1ldGVyU2V0ID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShQYXJhbWV0ZXJTZXQuY2xhc3MpOworCQkJcXVlcnkuam9pbihlbnRpdHlUeXBlLmdldFJlbGF0aW9uKHBhcmFtZXRlclNldCksIEpvaW5UeXBlLk9VVEVSKS5zZWxlY3RJRChwYXJhbWV0ZXJTZXQpOworCQl9CisKKwkJRmlsdGVyIGZpbHRlciA9IEZpbHRlci5vcigpLmlkcyhlbnRpdHlUeXBlLCBpbnN0YW5jZUlEcyk7CisJCWVudGl0eVR5cGUuZ2V0UGFyZW50UmVsYXRpb25zKCkuc3RyZWFtKCkuZmlsdGVyKHIgLT4gci5nZXRUYXJnZXQoKS5lcXVhbHMoZW50aXR5VHlwZSkpCisJCQkJLmZvckVhY2gocmVsYXRpb24gLT4gZmlsdGVyLmlkcyhyZWxhdGlvbiwgaW5zdGFuY2VJRHMpKTsKKworCQkvLyBxdWVyeSBjaGlsZCBJRHMKKwkJTWFwPEVudGl0eVR5cGUsIFNldDxTdHJpbmc+PiBjaGlsZHJlbiA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChSZXN1bHQgcmVzdWx0IDogcXVlcnkuZmV0Y2goZmlsdGVyKSkgeworCQkJLy8gbG9hZCBjaGlsZHJlbiBvZiBvdGhlciB0eXBlcworCQkJcmVzdWx0LnN0cmVhbSgpLmZpbHRlcihyIC0+IHIuZ2V0SUQoKSAhPSBudWxsICYmIHIuZ2V0SUQoKS5sZW5ndGgoKSA+IDApLmZvckVhY2gociAtPiB7CisJCQkJY2hpbGRyZW4uY29tcHV0ZUlmQWJzZW50KHIuZ2V0RW50aXR5VHlwZSgpLCBrIC0+IG5ldyBIYXNoU2V0PD4oKSkuYWRkKHIuZ2V0SUQoKSk7CisJCQl9KTsKKworCQkJLy8gY29sbGVjdCBmaWxlIGxpbmtzIHRvIHJlbW92ZQorCQkJTGlzdDxGaWxlTGluaz4gZmlsZUxpbmtzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKFZhbHVlIHZhbHVlIDogcmVzdWx0LmdldFJlY29yZChlbnRpdHlUeXBlKS5nZXRWYWx1ZXMoKS52YWx1ZXMoKSkgeworCQkJCWlmICh2YWx1ZS5nZXRWYWx1ZVR5cGUoKS5pc0ZpbGVMaW5rKCkpIHsKKwkJCQkJZmlsZUxpbmtzLmFkZCh2YWx1ZS5leHRyYWN0KCkpOworCQkJCX0gZWxzZSBpZiAodmFsdWUuZ2V0VmFsdWVUeXBlKCkuaXNGaWxlTGlua1NlcXVlbmNlKCkpIHsKKwkJCQkJZmlsZUxpbmtzLmFkZEFsbChBcnJheXMuYXNMaXN0KChGaWxlTGlua1tdKSB2YWx1ZS5leHRyYWN0KCkpKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghZmlsZUxpbmtzLmlzRW1wdHkoKSkgeworCQkJCWdldFRyYW5zYWN0aW9uKCkuZ2V0VXBsb2FkU2VydmljZSgpLmFkZFRvUmVtb3ZlKGZpbGVMaW5rcyk7CisJCQl9CisJCX0KKworCQkvLyBvbWl0IGNvbnRleHQgcm9vdHMgd2l0aCByZWZlcmVuY2VzIHRvIG5vdCByZW1vdmVkIG1lYXN1cmVtZW50cworCQlpZiAoIWlnbm9yZVNpYmxpbmdzICYmIG1lYXN1cmVtZW50LmVxdWFscyhlbnRpdHlUeXBlKSkgeworCQkJZm9yIChFbnRpdHlUeXBlIGNvbnRleHRSb290IDogQXJyYXlzLmFzTGlzdCh1bml0VW5kZXJUZXN0LCB0ZXN0U2VxdWVuY2UsIHRlc3RFcXVpcG1lbnQpKSB7CisJCQkJU2V0PFN0cmluZz4gY29udGV4dFJvb3RJRHMgPSBjaGlsZHJlbi5nZXRPckRlZmF1bHQoY29udGV4dFJvb3QsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworCQkJCWlmIChjb250ZXh0Um9vdElEcy5pc0VtcHR5KCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJUXVlcnkgY29udGV4dFF1ZXJ5ID0gZ2V0UXVlcnlTZXJ2aWNlKCkuY3JlYXRlUXVlcnkoKTsKKwkJCQljb250ZXh0UXVlcnkuc2VsZWN0SUQoY29udGV4dFJvb3QsIG1lYXN1cmVtZW50KTsKKwkJCQljb250ZXh0UXVlcnkuam9pbihjb250ZXh0Um9vdCwgbWVhc3VyZW1lbnQpOworCisJCQkJZm9yIChSZXN1bHQgcmVzdWx0IDogY29udGV4dFF1ZXJ5LmZldGNoKEZpbHRlci5pZHNPbmx5KGNvbnRleHRSb290LCBjb250ZXh0Um9vdElEcykpKSB7CisJCQkJCWlmIChpbnN0YW5jZUlEcy5jb250YWlucyhyZXN1bHQuZ2V0UmVjb3JkKG1lYXN1cmVtZW50KS5nZXRJRCgpKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQkvLyBjb250ZXh0IHJvb3QgcmVmZXJlbmNlcyBhIG5vdCByZW1vdmVkIG1lYXN1cmVtZW50CisJCQkJCWNvbnRleHRSb290SURzLnJlbW92ZShyZXN1bHQuZ2V0UmVjb3JkKGNvbnRleHRSb290KS5nZXRJRCgpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpbnQgYW1vdW50ID0gMDsKKwkJLy8gZGVsZXRlIHJlYWwgY2hpbGRyZW4KKwkJTGlzdDxFbnRyeTxFbnRpdHlUeXBlLCBTZXQ8U3RyaW5nPj4+IGNvbnNpZGVyZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKEVudHJ5PEVudGl0eVR5cGUsIFNldDxTdHJpbmc+PiBlbnRyeSA6IGNoaWxkcmVuLmVudHJ5U2V0KCkpIHsKKwkJCUVudGl0eVR5cGUgY2hpbGRUeXBlID0gZW50cnkuZ2V0S2V5KCk7CisJCQlTZXQ8U3RyaW5nPiBjaGlsZEluc3RhbmNlSURzID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCWlmIChlbnRpdHlUeXBlLmVxdWFscyhjaGlsZFR5cGUpKSB7CisJCQkJY2hpbGRJbnN0YW5jZUlEcy5yZW1vdmVBbGwoaW5zdGFuY2VJRHMpOworCQkJfSBlbHNlIGlmIChkZWxheWVkRGVsZXRlLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgeworCQkJCWNvbnNpZGVyZWRDaGlsZHJlbi5hZGQoZW50cnkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYW1vdW50ICs9IGRlbGV0ZShlbnRyeS5nZXRLZXkoKSwgY2hpbGRJbnN0YW5jZUlEcywgdHJ1ZSk7CisJCX0KKworCQlnZXRBcHBsRWxlbUFjY2VzcygpLmRlbGV0ZUluc3RhbmNlcygoKE9EU0VudGl0eVR5cGUpIGVudGl0eVR5cGUpLmdldE9EU0lEKCksIHRvT0RTSURzKGluc3RhbmNlSURzKSk7CisKKwkJLy8gZGVsZXRlIGNvbnNpZGVyZWQgY2hpbGRyZW4gKGluZm9ybWF0aXZlIHJlbGF0aW9uKQorCQlmb3IgKEVudHJ5PEVudGl0eVR5cGUsIFNldDxTdHJpbmc+PiBlbnRyeSA6IGNvbnNpZGVyZWRDaGlsZHJlbikgeworCQkJYW1vdW50ICs9IGRlbGV0ZShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgdHJ1ZSk7CisJCX0KKworCQlyZXR1cm4gYW1vdW50ICsgaW5zdGFuY2VJRHMuc2l6ZSgpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAY29kZSBDb2xsZWN0aW9ufSBvZiBpbnN0YW5jZSBJRHMgdG8gT0RTIGEge0BsaW5rIFRfTE9OR0xPTkd9CisJICogYXJyYXkuCisJICoKKwkgKiBAcGFyYW0gaW5zdGFuY2VJRHMgVGhlIGluc3RhbmNlIElEcy4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIE9EUyB7QGNvZGUgVF9MT05HTE9OR1tdfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIFRfTE9OR0xPTkdbXSB0b09EU0lEcyhDb2xsZWN0aW9uPFN0cmluZz4gaW5zdGFuY2VJRHMpIHsKKwkJcmV0dXJuIGluc3RhbmNlSURzLnN0cmVhbSgpLm1hcChPRFNDb252ZXJ0ZXI6OnRvT0RTSUQpLnRvQXJyYXkoVF9MT05HTE9OR1tdOjpuZXcpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL0luc2VydFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL0luc2VydFN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjkzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vSW5zZXJ0U3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwzMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudHJhbnNhY3Rpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFJRE5hbWU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFJRE5hbWVWYWx1ZVNlcVVuaXRJZDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkVsZW1JZDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmlsZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNvcnRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkFnZ3JlZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZWNvcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTRW50aXR5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIEluc2VydCBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cml0ZSBuZXcgZW50aXRpZXMgYW5kIHRoZWlyIGNoaWxkcmVuLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitmaW5hbCBjbGFzcyBJbnNlcnRTdGF0ZW1lbnQgZXh0ZW5kcyBCYXNlU3RhdGVtZW50IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5zZXJ0U3RhdGVtZW50LmNsYXNzKTsKKworCXByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PEVudGl0eT4+IGNoaWxkcmVuTWFwID0gbmV3IEhhc2hNYXA8PigpOworCXByaXZhdGUgZmluYWwgTGlzdDxDb3JlPiBjb3JlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDxWYWx1ZT4+IGluc2VydE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworCXByaXZhdGUgZmluYWwgTGlzdDxGaWxlTGluaz4gZmlsZUxpbmtUb1VwbG9hZCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTb3J0SW5kZXhUZXN0U3RlcHM+IHNvcnRJbmRleFRlc3RTdGVwcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGJvb2xlYW4gbG9hZFNvcnRJbmRleDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB0cmFuc2FjdGlvbiBUaGUgb3duaW5nIHtAbGluayBPRFNUcmFuc2FjdGlvbn0uCisJICogQHBhcmFtIGVudGl0eVR5cGUgIFRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKi8KKwlJbnNlcnRTdGF0ZW1lbnQoT0RTVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQlzdXBlcih0cmFuc2FjdGlvbiwgZW50aXR5VHlwZSk7CisKKwkJbG9hZFNvcnRJbmRleCA9IGdldE1vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoVGVzdFN0ZXAuY2xhc3MpLmVxdWFscyhnZXRFbnRpdHlUeXBlKCkpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBleGVjdXRlKENvbGxlY3Rpb248RW50aXR5PiBlbnRpdGllcykgdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWVudGl0aWVzLnN0cmVhbSgpLm1hcChPRFNFbnRpdHlGYWN0b3J5OjpleHRyYWN0KS5mb3JFYWNoKHRoaXM6OnJlYWRFbnRpdHlDb3JlKTsKKwkJZXhlY3V0ZSgpOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoaXMgc3RhdGVtZW50IGZvciBnaXZlbiB7QGxpbmsgQ29yZX1zLgorCSAqCisJICogQHBhcmFtIGNvcmVzIFRoZSBwcm9jZXNzZWQge0Bjb2RlIENvcmV9cy4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uICAgICAgICAgVGhyb3duIGlmIHRoZSBleGVjdXRpb24gZmFpbHMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaWYgYSBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbiBmYWlscy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlV2l0aENvcmVzKENvbGxlY3Rpb248Q29yZT4gY29yZXMpIHRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQljb3Jlcy5mb3JFYWNoKHRoaXM6OnJlYWRFbnRpdHlDb3JlKTsKKwkJZXhlY3V0ZSgpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBVcGxvYWRzIG5ldyB7QGxpbmsgRmlsZUxpbmt9cywgYWRqdXN0cyBzb3J0IGluZGljZXMgZm9yIG5ldyB7QGxpbmsgVGVzdFN0ZXB9CisJICogZW50aXRpZXMgYW5kIHdyaXRlcyBjb2xsZWN0ZWQgaW5zZXJ0aW9uIGRhdGEgYXQgb25jZS4gT25jZSBuZXcgZW50aXRpZXMgYXJlCisJICogd3JpdHRlbiB0aGVpciBjaGlsZHJlbiBhcmUgY3JlYXRlZCBieSBkZWxlZ2F0aW9uIHRvIHRoZQorCSAqIHtAbGluayBPRFNUcmFuc2FjdGlvbn0uCisJICoKKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uICAgICAgICAgVGhyb3duIGlmIHRoZSBleGVjdXRpb24gZmFpbHMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaWYgYSBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbiBmYWlscy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlMaXN0PEFJRE5hbWVWYWx1ZVNlcVVuaXRJZD4gYW52c3VMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVRfTE9OR0xPTkcgYUlEID0gZ2V0RW50aXR5VHlwZSgpLmdldE9EU0lEKCk7CisKKwkJLy8gVE9ETyB0cmFjaW5nIHByb2dyZXNzIGluIHRoaXMgbWV0aG9kLi4uCisKKwkJaWYgKGxvYWRTb3J0SW5kZXggJiYgIXNvcnRJbmRleFRlc3RTdGVwcy5pc0VtcHR5KCkpIHsKKwkJCWFkanVzdE1pc3NpbmdTb3J0SW5kaWNlcygpOworCQl9CisKKwkJaWYgKCFmaWxlTGlua1RvVXBsb2FkLmlzRW1wdHkoKSkgeworCQkJZ2V0VHJhbnNhY3Rpb24oKS5nZXRVcGxvYWRTZXJ2aWNlKCkudXBsb2FkUGFyYWxsZWwoZmlsZUxpbmtUb1VwbG9hZCwgbnVsbCk7CisJCX0KKworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxWYWx1ZT4+IGVudHJ5IDogaW5zZXJ0TWFwLmVudHJ5U2V0KCkpIHsKKwkJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRFbnRpdHlUeXBlKCkuZ2V0QXR0cmlidXRlKGVudHJ5LmdldEtleSgpKTsKKworCQkJQUlETmFtZVZhbHVlU2VxVW5pdElkIGFudnN1ID0gbmV3IEFJRE5hbWVWYWx1ZVNlcVVuaXRJZCgpOworCQkJYW52c3UuYXR0ciA9IG5ldyBBSUROYW1lKGFJRCwgZW50cnkuZ2V0S2V5KCkpOworCQkJYW52c3UudW5pdElkID0gT0RTQ29udmVydGVyLnRvT0RTTG9uZygwKTsKKwkJCWFudnN1LnZhbHVlcyA9IE9EU0NvbnZlcnRlci50b09EU1ZhbHVlU2VxKGF0dHJpYnV0ZSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQlhbnZzdUxpc3QuYWRkKGFudnN1KTsKKwkJfQorCisJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJRWxlbUlkW10gZWxlbUlkcyA9IGdldEFwcGxFbGVtQWNjZXNzKCkKKwkJCQkuaW5zZXJ0SW5zdGFuY2VzKGFudnN1TGlzdC50b0FycmF5KG5ldyBBSUROYW1lVmFsdWVTZXFVbml0SWRbYW52c3VMaXN0LnNpemUoKV0pKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtSWRzLmxlbmd0aDsgaSsrKSB7CisJCQljb3Jlcy5nZXQoaSkuc2V0SUQoTG9uZy50b1N0cmluZyhPRFNDb252ZXJ0ZXIuZnJvbU9EU0xvbmcoZWxlbUlkc1tpXS5paWQpKSk7CisJCX0KKwkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJTE9HR0VSLmRlYnVnKCJ7fSAiICsgZ2V0RW50aXR5VHlwZSgpICsgIiBpbnN0YW5jZXMgY3JlYXRlZCBpbiB7fSBtcy4iLCBlbGVtSWRzLmxlbmd0aCwgc3RvcCAtIHN0YXJ0KTsKKworCQlmb3IgKExpc3Q8RW50aXR5PiBjaGlsZHJlbiA6IGNoaWxkcmVuTWFwLnZhbHVlcygpKSB7CisJCQlnZXRUcmFuc2FjdGlvbigpLmNyZWF0ZShjaGlsZHJlbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZWFkcyBnaXZlbiB7QGxpbmsgQ29yZX0gYW5kIHByZXBhcmVzIGl0cyBkYXRhIHRvIGJlIHdyaXR0ZW46CisJICoKKwkgKiA8dWw+CisJICogPGxpPmNvbGxlY3QgbmV3IHtAbGluayBGaWxlTGlua31zPC9saT4KKwkgKiA8bGk+dHJhY2UgbWlzc2luZyBzb3J0IGluZGljZXMgb2YgVGVzdFN0ZXBzPC9saT4KKwkgKiA8bGk+Y29sbGVjdCBwcm9wZXJ0eSB7QGxpbmsgVmFsdWV9czwvbGk+CisJICogPGxpPmNvbGxlY3QgZm9yZWlnbiBrZXkge0Bjb2RlIFZhbHVlfXM8L2xpPgorCSAqIDxsaT5jb2xsZWN0IGNoaWxkIGVudGl0aWVzIGZvciByZWN1cnNpdmUgY3JlYXRpb248L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0Bjb2RlIENvcmV9LgorCSAqLworCXByaXZhdGUgdm9pZCByZWFkRW50aXR5Q29yZShDb3JlIGNvcmUpIHsKKwkJaWYgKCFjb3JlLmdldFR5cGVOYW1lKCkuZXF1YWxzKGdldEVudGl0eVR5cGUoKS5nZXROYW1lKCkpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnRpdHkgY29yZSAnIiArIGNvcmUuZ2V0VHlwZU5hbWUoKQorCQkJCQkrICInIGlzIGluY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgaW5zZXJ0IHN0YXRlbWVudCBmb3IgZW50aXR5IHR5cGUgJyIgKyBnZXRFbnRpdHlUeXBlKCkgKyAiJy4iKTsKKwkJfQorCisJCWNvcmVzLmFkZChjb3JlKTsKKworCQlpZiAobG9hZFNvcnRJbmRleCkgeworCQkJaWYgKChJbnRlZ2VyKSBjb3JlLmdldFZhbHVlcygpLmdldChTb3J0YWJsZS5BVFRSX1NPUlRfSU5ERVgpLmV4dHJhY3QoKSA8IDApIHsKKwkJCQlzb3J0SW5kZXhUZXN0U3RlcHMuY29tcHV0ZUlmQWJzZW50KGNvcmUuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoVGVzdC5jbGFzcykuZ2V0SUQoKSwKKwkJCQkJCWsgLT4gbmV3IFNvcnRJbmRleFRlc3RTdGVwcygpKS50ZXN0U3RlcENvcmVzLmFkZChjb3JlKTsKKwkJCX0KKwkJfQorCisJCS8vIGFkZCBhbGwgZW50aXR5IHZhbHVlcworCQlmb3IgKFZhbHVlIHZhbHVlIDogY29yZS5nZXRBbGxWYWx1ZXMoKS52YWx1ZXMoKSkgeworCQkJaW5zZXJ0TWFwLmNvbXB1dGVJZkFic2VudCh2YWx1ZS5nZXROYW1lKCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZCh2YWx1ZSk7CisJCX0KKworCQkvLyBjb2xsZWN0IGZpbGUgbGlua3MKKwkJZmlsZUxpbmtUb1VwbG9hZC5hZGRBbGwoY29yZS5nZXRBZGRlZEZpbGVMaW5rcygpKTsKKworCQkvLyBkZWZpbmUgImVtcHR5IiB2YWx1ZXMgZm9yIGluZm9ybWF0aXZlIHJlbGF0aW9ucworCQlmb3IgKFJlbGF0aW9uIHJlbGF0aW9uIDogZ2V0RW50aXR5VHlwZSgpLmdldEluZm9SZWxhdGlvbnMoKSkgeworCQkJaW5zZXJ0TWFwLmNvbXB1dGVJZkFic2VudChyZWxhdGlvbi5nZXROYW1lKCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZChyZWxhdGlvbi5jcmVhdGVWYWx1ZSgpKTsKKwkJfQorCisJCS8vIGRlZmluZSAiZW1wdHkiIHZhbHVlcyBmb3IgcGFyZW50IHJlbGF0aW9ucworCQlmb3IgKFJlbGF0aW9uIHJlbGF0aW9uIDogZ2V0RW50aXR5VHlwZSgpLmdldFBhcmVudFJlbGF0aW9ucygpKSB7CisJCQlpbnNlcnRNYXAuY29tcHV0ZUlmQWJzZW50KHJlbGF0aW9uLmdldE5hbWUoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkuYWRkKHJlbGF0aW9uLmNyZWF0ZVZhbHVlKCkpOworCQl9CisKKwkJLy8gcmVwbGFjZSAiZW1wdHkiIHJlbGF0aW9uIHZhbHVlcyB3aXRoIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2UgSURzCisJCXNldFJlbGF0aW9uSURzKGNvcmUuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0Q3VycmVudCgpKTsKKwkJc2V0UmVsYXRpb25JRHMoY29yZS5nZXRQZXJtYW5lbnRTdG9yZSgpLmdldEN1cnJlbnQoKSk7CisKKwkJZm9yIChFbnRyeTxDbGFzczw/IGV4dGVuZHMgRGVsZXRhYmxlPiwgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gZW50cnkgOiBjb3JlLmdldENoaWxkcmVuU3RvcmUoKS5nZXRDdXJyZW50KCkKKwkJCQkuZW50cnlTZXQoKSkgeworCQkJY2hpbGRyZW5NYXAuY29tcHV0ZUlmQWJzZW50KGVudHJ5LmdldEtleSgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7CisJCX0KKworCQlnZXRUcmFuc2FjdGlvbigpLmFkZE1vZGlmaWVkKGNvcmUpOworCQlnZXRUcmFuc2FjdGlvbigpLmFkZENyZWF0ZWQoY29yZSk7CisJfQorCisJLyoqCisJICogT3ZlcndyaXRlcyBlbXB0eSBmb3JlaWduIGtleSB7QGxpbmsgVmFsdWV9IGNvbnRhaW5lcnMuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRlZEVudGl0aWVzIFRoZSByZWxhdGVkIHtAbGluayBFbnRpdHl9cy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0UmVsYXRpb25JRHMoQ29sbGVjdGlvbjxFbnRpdHk+IHJlbGF0ZWRFbnRpdGllcykgeworCQlmb3IgKEVudGl0eSByZWxhdGVkRW50aXR5IDogcmVsYXRlZEVudGl0aWVzKSB7CisJCQlpZiAoIU9EU1V0aWxzLmlzVmFsaWRJRChyZWxhdGVkRW50aXR5LmdldElEKCkpKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRlZCBlbnRpdHkgbXVzdCBiZSBhIHBlcnNpdGVkIGVudGl0eS4iKTsKKwkJCX0KKworCQkJUmVsYXRpb24gcmVsYXRpb24gPSBnZXRFbnRpdHlUeXBlKCkuZ2V0UmVsYXRpb24oZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShyZWxhdGVkRW50aXR5KSk7CisJCQlMaXN0PFZhbHVlPiByZWxhdGlvblZhbHVlcyA9IGluc2VydE1hcC5nZXQocmVsYXRpb24uZ2V0TmFtZSgpKTsKKwkJCWlmIChyZWxhdGlvblZhbHVlcyA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVsYXRpb24gJyIgKyByZWxhdGlvbiArICInIGlzIGluY29tcGF0aWJsZSB3aXRoIGluc2VydCBzdGF0ZW1lbnQgIgorCQkJCQkJKyAiZm9yIGVudGl0eSB0eXBlICciICsgZ2V0RW50aXR5VHlwZSgpICsgIiciKTsKKwkJCX0KKwkJCXJlbGF0aW9uVmFsdWVzLmdldChyZWxhdGlvblZhbHVlcy5zaXplKCkgLSAxKS5zZXQocmVsYXRlZEVudGl0eS5nZXRJRCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEFkanVzdHMgbWlzc2luZyBzb3J0IGluZGljZXMgZm9yIHtAbGluayBUZXN0U3RlcH1zIGJ5IHF1ZXJ5aW5nIGxhc3QgdXNlZCBtYXgKKwkgKiBzb3J0IGluZGV4LgorCSAqCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcXVlcnkgdXNlZCBzb3J0IGluZGljZXMuCisJICovCisJcHJpdmF0ZSB2b2lkIGFkanVzdE1pc3NpbmdTb3J0SW5kaWNlcygpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJRW50aXR5VHlwZSB0ZXN0U3RlcCA9IGdldEVudGl0eVR5cGUoKTsKKwkJRW50aXR5VHlwZSB0ZXN0ID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShUZXN0LmNsYXNzKTsKKwkJUmVsYXRpb24gcGFyZW50UmVsYXRpb24gPSB0ZXN0U3RlcC5nZXRSZWxhdGlvbih0ZXN0KTsKKworCQlBdHRyaWJ1dGUgYXR0clNvcnRJbmRleCA9IHRlc3RTdGVwLmdldEF0dHJpYnV0ZShTb3J0YWJsZS5BVFRSX1NPUlRfSU5ERVgpOworCQlRdWVyeSBxdWVyeSA9IGdldFF1ZXJ5U2VydmljZSgpLmNyZWF0ZVF1ZXJ5KCkuc2VsZWN0KHBhcmVudFJlbGF0aW9uLmdldEF0dHJpYnV0ZSgpKQorCQkJCS5zZWxlY3QoYXR0clNvcnRJbmRleCwgQWdncmVnYXRpb24uTUFYSU1VTSkuZ3JvdXAocGFyZW50UmVsYXRpb24uZ2V0QXR0cmlidXRlKCkpOworCisJCUZpbHRlciBmaWx0ZXIgPSBGaWx0ZXIuaWRzT25seShwYXJlbnRSZWxhdGlvbiwgc29ydEluZGV4VGVzdFN0ZXBzLmtleVNldCgpKTsKKwkJZm9yIChSZXN1bHQgcmVzdWx0IDogcXVlcnkuZmV0Y2goZmlsdGVyKSkgeworCQkJUmVjb3JkIHJlY29yZCA9IHJlc3VsdC5nZXRSZWNvcmQodGVzdFN0ZXApOworCQkJaW50IHNvcnRJbmRleCA9IChJbnRlZ2VyKSByZWNvcmQuZ2V0VmFsdWVzKCkKKwkJCQkJLmdldChPRFNDb252ZXJ0ZXIuZ2V0Q29sdW1uTmFtZShhdHRyU29ydEluZGV4LCBBZ2dyZWdhdGlvbi5NQVhJTVVNKSkuZXh0cmFjdCgpOworCQkJc29ydEluZGV4VGVzdFN0ZXBzLnJlbW92ZShyZWNvcmQuZ2V0SUQocGFyZW50UmVsYXRpb24pLmdldCgpKS5zZXRJbmRpY2VzKHNvcnRJbmRleCArIDEpOworCQl9CisKKwkJLy8gc3RhcnQgYXQgMSBmb3IgYWxsIHJlbWFpbmluZworCQlzb3J0SW5kZXhUZXN0U3RlcHMudmFsdWVzKCkuZm9yRWFjaCh0c3MgLT4gdHNzLnNldEluZGljZXMoMCkpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbm5lciBjbGFzc2VzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVXRpbGl0eSBjbGFzcyB0byB3cml0ZSBtaXNzaW5nIHNvcnQgaW5kZXggb2YgbmV3IHtAbGluayBUZXN0U3RlcH1zLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNvcnRJbmRleFRlc3RTdGVwcyB7CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCXByaXZhdGUgTGlzdDxDb3JlPiB0ZXN0U3RlcENvcmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBQcml2YXRlIG1ldGhvZHMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCS8qKgorCQkgKiBBc3NpZ25zIHNvcnQgaW5kaWNlcyB0byB7QGxpbmsgQ29yZX1zIHN0YXJ0aW5nIGF0IGdpdmVuIGluZGV4LgorCQkgKgorCQkgKiBAcGFyYW0gc3RhcnRJbmRleCBUaGUgc3RhcnQgaW5kZXguCisJCSAqLworCQlwcml2YXRlIHZvaWQgc2V0SW5kaWNlcyhpbnQgc3RhcnRJbmRleCkgeworCQkJaW50IGluZGV4ID0gc3RhcnRJbmRleDsKKwkJCWZvciAoQ29yZSBjb3JlIDogdGVzdFN0ZXBDb3JlcykgeworCQkJCWNvcmUuZ2V0VmFsdWVzKCkuZ2V0KFNvcnRhYmxlLkFUVFJfU09SVF9JTkRFWCkuc2V0KGluZGV4KyspOworCQkJfQorCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9PRFNUcmFuc2FjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL09EU1RyYW5zYWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxMzEwMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9PRFNUcmFuc2FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnRyYW5zYWN0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtSWQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNldFR5cGU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGEuV3JpdGVSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dTZW5zb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXIuVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFRyYW5zYWN0aW9ufSBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPRFNUcmFuc2FjdGlvbiBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uIHsKKworCS8vIFRPRE86IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhIGF0dGFjaCBhIHByb2dyZXNzIGxpc3RlbmVyCisJLy8gLT4gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uIHVwZGF0ZXMgd2hpbGUgdXBsb2FkaW5nIGZpbGVzCisJLy8gLT4gYW55IG90aGVyIHVzZWZ1bCBpbmZvcm1hdGlvbnM/IQorCS8vIC0+IHNwbGl0dGluZyBvZiB0YXNrcyBpbnRvIHN1YnRhc2tzIG1heSBiZSByZXF1aXJlZC4uLgorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9EU1RyYW5zYWN0aW9uLmNsYXNzKTsKKworCS8vIHRoaXMgb25lIGlzIHN0b3JlZCBpbiBjYXNlIG9mIGFwcGxpY2F0aW9uIG1vZGVsIG1vZGlmaWNhdGlvbnMKKwlwcml2YXRlIGZpbmFsIE9EU0NvbnRleHQgcGFyZW50Q29udGV4dDsKKworCS8vIHRoaXMgb25lIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBhcHBsaWNhdGlvbiBtb2RlbCBhbmQgZXhlY3V0ZSBxdWVyaWVzCisJLy8gaW5zdGFuY2UgaXMgZGVjb3VwbGVkIGZyb20gaXRzIHBhcmVudAorCXByaXZhdGUgZmluYWwgT0RTQ29udGV4dCBjb250ZXh0OworCisJLy8gb25seSBmb3IgbG9nZ2luZworCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKworCS8vIG5lZWQgdG8gd3JpdGUgdmVyc2lvbiA9PSBpbnN0YW5jZUlEIC0+IHVwZGF0ZSBhZnRlciBjcmVhdGUKKwlwcml2YXRlIGZpbmFsIExpc3Q8Q29udGV4dFJvb3Q+IGNvbnRleHRSb290cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJLy8gcmVzZXQgaW5zdGFuY2UgSURzIG9uIGFib3J0CisJcHJpdmF0ZSBmaW5hbCBMaXN0PENvcmU+IGNyZWF0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCS8vIGFwcGx5IGNoYW5nZXMKKwlwcml2YXRlIGZpbmFsIExpc3Q8Q29yZT4gbW9kaWZpZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCXByaXZhdGUgZmluYWwgRW50aXR5IGVudGl0eTsKKwlwcml2YXRlIGZpbmFsIFRyYW5zZmVyIHRyYW5zZmVyOworCisJcHJpdmF0ZSBVcGxvYWRTZXJ2aWNlIHVwbG9hZFNlcnZpY2U7CisKKwlwcml2YXRlIENhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50TW9kZWxNYW5hZ2VyIFVzZWQgdG8gYWNjZXNzIHRoZSBwZXJzaXN0ZW5jZS4KKwkgKiBAcGFyYW0gZW50aXR5ICAgICAgICAgICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcworCSAqIEBwYXJhbSB0cmFuc2ZlciAgICAgICAgICAgVGhlIGZpbGUgdHJhbnNmZXIgdHlwZS4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gc3RhcnQgYSBjby1zZXNzaW9uLgorCSAqLworCXB1YmxpYyBPRFNUcmFuc2FjdGlvbihPRFNDb250ZXh0IHBhcmVudENvbnRleHQsIEVudGl0eSBlbnRpdHksIFRyYW5zZmVyIHRyYW5zZmVyKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQl0aGlzLnBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0OworCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKKwkJdGhpcy50cmFuc2ZlciA9IHRyYW5zZmVyOworCQljb250ZXh0ID0gcGFyZW50Q29udGV4dC5uZXdDb250ZXh0KCk7CisJCWNvbnRleHQuZ2V0QW9TZXNzaW9uKCkuc3RhcnRUcmFuc2FjdGlvbigpOworCQlMT0dHRVIuZGVidWcoIlRyYW5zYWN0aW9uICd7fScgc3RhcnRlZC4iLCBpZCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gdm9pZCBjcmVhdGUoQ29sbGVjdGlvbjxUPiBlbnRpdGllcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlpZiAoZW50aXRpZXMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoZW50aXRpZXMuc3RyZWFtKCkuZmlsdGVyKGUgLT4gT0RTVXRpbHMuaXNWYWxpZElEKGUuZ2V0SUQoKSkpLmZpbmRBbnkoKS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIGdpdmVuIGVudGl0eSBpcyBhbHJlYWR5IHBlcnNpc3RlZC4iKTsKKwkJfQorCisJCXRyeSB7CisJCQlNYXA8Q2xhc3M8Pz4sIExpc3Q8VD4+IGVudGl0aWVzQnlDbGFzc1R5cGUgPSBlbnRpdGllcy5zdHJlYW0oKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoZSAtPiBlLmdldENsYXNzKCkpKTsKKworCQkJTGlzdDxDYXRhbG9nQ29tcG9uZW50PiBjYXRhbG9nQ29tcG9uZW50cyA9IChMaXN0PENhdGFsb2dDb21wb25lbnQ+KSBlbnRpdGllc0J5Q2xhc3NUeXBlCisJCQkJCS5nZXQoQ2F0YWxvZ0NvbXBvbmVudC5jbGFzcyk7CisJCQlpZiAoY2F0YWxvZ0NvbXBvbmVudHMgIT0gbnVsbCkgeworCQkJCWdldENhdGFsb2dNYW5hZ2VyKCkuY3JlYXRlQ2F0YWxvZ0NvbXBvbmVudHMoY2F0YWxvZ0NvbXBvbmVudHMpOworCQkJfQorCisJCQlMaXN0PENhdGFsb2dTZW5zb3I+IGNhdGFsb2dTZW5zb3JzID0gKExpc3Q8Q2F0YWxvZ1NlbnNvcj4pIGVudGl0aWVzQnlDbGFzc1R5cGUuZ2V0KENhdGFsb2dTZW5zb3IuY2xhc3MpOworCQkJaWYgKGNhdGFsb2dTZW5zb3JzICE9IG51bGwpIHsKKwkJCQkvLyBUT0RPIGFuZWhtZXIgb24gMjAxNy0xMS0xNjogYXZhbG9uIDQuM2IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbgorCQkJCS8vIEFvU2Vzc2lvbi5jb21taXRUcmFuc2FjdGlvbigpIGlmIG11bHRpcGxlCisJCQkJLy8gY2F0YWxvZyBzZW5zb3JzIGhhdmUgYmVlbiBkZWxldGVkIGFuZCBsZWF2ZXMgdGhlIGFwcGxpY2F0aW9uCisJCQkJLy8gbW9kZWwgaW4gYSBicm9rZW4gc3RhdGUuIFRoaXMgaXMgYWxzbyBzdGF0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoaXMKKwkJCQkvLyBjb21tZW50IHNob3VsZCBiZSByZW1vdmVkIGxhdGVyLgorCQkJCWdldENhdGFsb2dNYW5hZ2VyKCkuY3JlYXRlQ2F0YWxvZ1NlbnNvcnMoY2F0YWxvZ1NlbnNvcnMpOworCQkJfQorCisJCQlMaXN0PENhdGFsb2dBdHRyaWJ1dGU+IGNhdGFsb2dBdHRyaWJ1dGVzID0gKExpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4pIGVudGl0aWVzQnlDbGFzc1R5cGUKKwkJCQkJLmdldChDYXRhbG9nQXR0cmlidXRlLmNsYXNzKTsKKwkJCWlmIChjYXRhbG9nQXR0cmlidXRlcyAhPSBudWxsKSB7CisJCQkJZ2V0Q2F0YWxvZ01hbmFnZXIoKS5jcmVhdGVDYXRhbG9nQXR0cmlidXRlcyhjYXRhbG9nQXR0cmlidXRlcyk7CisJCQl9CisKKwkJCUxpc3Q8VGVtcGxhdGVBdHRyaWJ1dGU+IHRlbXBsYXRlQXR0cmlidXRlcyA9IChMaXN0PFRlbXBsYXRlQXR0cmlidXRlPikgZW50aXRpZXNCeUNsYXNzVHlwZQorCQkJCQkuZ2V0KFRlbXBsYXRlQXR0cmlidXRlLmNsYXNzKTsKKwkJCWlmICh0ZW1wbGF0ZUF0dHJpYnV0ZXMgIT0gbnVsbCkgeworCQkJCUxpc3Q8VGVtcGxhdGVBdHRyaWJ1dGU+IGZpbHRlcmVkID0gZ2V0RmlsZUxpbmtUZW1wbGF0ZUF0dHJpYnV0ZXModGVtcGxhdGVBdHRyaWJ1dGVzKTsKKwkJCQlpZiAoIWZpbHRlcmVkLmlzRW1wdHkoKSkgeworCQkJCQlnZXRVcGxvYWRTZXJ2aWNlKCkudXBsb2FkKGZpbHRlcmVkLCBudWxsKTsKKwkJCQl9CisJCQl9CisKKwkJCUxpc3Q8VGVzdFN0ZXA+IHRlc3RTdGVwcyA9IChMaXN0PFRlc3RTdGVwPikgZW50aXRpZXNCeUNsYXNzVHlwZS5nZXQoVGVzdFN0ZXAuY2xhc3MpOworCQkJaWYgKHRlc3RTdGVwcyAhPSBudWxsKSB7CisJCQkJY3JlYXRlKHRlc3RTdGVwcy5zdHJlYW0oKS5tYXAoQ29udGV4dFJvb3Q6Om9mKS5jb2xsZWN0KEFycmF5TGlzdDo6bmV3LCBMaXN0OjphZGRBbGwsIExpc3Q6OmFkZEFsbCkpOworCQkJfQorCisJCQlMaXN0PE1lYXN1cmVtZW50PiBtZWFzdXJlbWVudHMgPSAoTGlzdDxNZWFzdXJlbWVudD4pIGVudGl0aWVzQnlDbGFzc1R5cGUuZ2V0KE1lYXN1cmVtZW50LmNsYXNzKTsKKwkJCWlmIChtZWFzdXJlbWVudHMgIT0gbnVsbCkgeworCQkJCS8vIFVzZSBzZXQgaGVyZSwgc2luY2UgbWVhc3VyZW1lbnQgc2libGluZ3MgcG9pbnQgdG8gdGhlIHNhbWUKKwkJCQkvLyBjb250ZXh0IHJvb3RzLiBPbmx5IGNyZWF0ZSB0aG9zZSBDb250ZXh0Um9vdHMgdGhhdCBoYXZlbid0IGJlZW4gY3JlYXRlZCB5ZXQ6CisJCQkJY3JlYXRlKG1lYXN1cmVtZW50cy5zdHJlYW0oKS5tYXAoQ29udGV4dFJvb3Q6Om9mKQorCQkJCQkJLmNvbGxlY3QoSGFzaFNldDxDb250ZXh0Um9vdD46Om5ldywgU2V0PENvbnRleHRSb290Pjo6YWRkQWxsLCBTZXQ8Q29udGV4dFJvb3Q+OjphZGRBbGwpLnN0cmVhbSgpCisJCQkJCQkuZmlsdGVyKGNyIC0+ICFPRFNVdGlscy5pc1ZhbGlkSUQoY3IuZ2V0SUQoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisJCQl9CisKKwkJCWV4ZWN1dGVTdGF0ZW1lbnRzKGV0IC0+IG5ldyBJbnNlcnRTdGF0ZW1lbnQodGhpcywgZXQpLCBlbnRpdGllcyk7CisJCQlwcm9jZXNzTnRvTVJlbGF0aW9ucyhlbnRpdGllcyk7CisKKwkJCUxpc3Q8Q29udGV4dFJvb3Q+IHJvb3RzID0gKExpc3Q8Q29udGV4dFJvb3Q+KSBlbnRpdGllc0J5Q2xhc3NUeXBlLmdldChDb250ZXh0Um9vdC5jbGFzcyk7CisJCQlpZiAocm9vdHMgIT0gbnVsbCkgeworCQkJCXJvb3RzLmZvckVhY2goY29udGV4dFJvb3QgLT4geworCQkJCQljb250ZXh0Um9vdC5zZXRWZXJzaW9uKGNvbnRleHRSb290LmdldElEKCkudG9TdHJpbmcoKSk7CisJCQkJfSk7CisKKwkJCQkvLyB0aGlzIHdpbGwgcmVzdG9yZSB0aGUgQVNBTSBwYXRoIG9mIGVhY2ggY29udGV4dCByb290CisJCQkJZXhlY3V0ZVN0YXRlbWVudHMoZXQgLT4gbmV3IFVwZGF0ZVN0YXRlbWVudCh0aGlzLCBldCwgdHJ1ZSksIHJvb3RzKTsKKwkJCQljb250ZXh0Um9vdHMuYWRkQWxsKHJvb3RzKTsKKwkJCX0KKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBuZXcgZW50aXRpZXMgZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIG5ldyBlbnRpdGllcyBkdWUgdG86ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiB2b2lkIHVwZGF0ZShDb2xsZWN0aW9uPFQ+IGVudGl0aWVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmIChlbnRpdGllcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChlbnRpdGllcy5zdHJlYW0oKS5maWx0ZXIoZSAtPiAhT0RTVXRpbHMuaXNWYWxpZElEKGUuZ2V0SUQoKSkpLmZpbmRBbnkoKS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIGdpdmVuIGVudGl0eSBpcyBub3QgeWV0IHBlcnNpc3RlZC4iKTsKKwkJfQorCisJCXRyeSB7CisJCQlNYXA8Q2xhc3M8Pz4sIExpc3Q8VD4+IGVudGl0aWVzQnlDbGFzc1R5cGUgPSBlbnRpdGllcy5zdHJlYW0oKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoZSAtPiBlLmdldENsYXNzKCkpKTsKKwkJCUxpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4gY2F0YWxvZ0F0dHJpYnV0ZXMgPSAoTGlzdDxDYXRhbG9nQXR0cmlidXRlPikgZW50aXRpZXNCeUNsYXNzVHlwZQorCQkJCQkuZ2V0KENhdGFsb2dBdHRyaWJ1dGUuY2xhc3MpOworCQkJaWYgKGNhdGFsb2dBdHRyaWJ1dGVzICE9IG51bGwpIHsKKwkJCQlnZXRDYXRhbG9nTWFuYWdlcigpLnVwZGF0ZUNhdGFsb2dBdHRyaWJ1dGVzKGNhdGFsb2dBdHRyaWJ1dGVzKTsKKwkJCX0KKworCQkJTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gdGVtcGxhdGVBdHRyaWJ1dGVzID0gKExpc3Q8VGVtcGxhdGVBdHRyaWJ1dGU+KSBlbnRpdGllc0J5Q2xhc3NUeXBlCisJCQkJCS5nZXQoVGVtcGxhdGVBdHRyaWJ1dGUuY2xhc3MpOworCQkJaWYgKHRlbXBsYXRlQXR0cmlidXRlcyAhPSBudWxsKSB7CisJCQkJTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gZmlsdGVyZWQgPSBnZXRGaWxlTGlua1RlbXBsYXRlQXR0cmlidXRlcyh0ZW1wbGF0ZUF0dHJpYnV0ZXMpOworCQkJCWlmICghZmlsdGVyZWQuaXNFbXB0eSgpKSB7CisJCQkJCWdldFVwbG9hZFNlcnZpY2UoKS51cGxvYWQoZmlsdGVyZWQsIG51bGwpOworCQkJCX0KKwkJCX0KKwkJCWV4ZWN1dGVTdGF0ZW1lbnRzKGV0IC0+IG5ldyBVcGRhdGVTdGF0ZW1lbnQodGhpcywgZXQsIGZhbHNlKSwgZW50aXRpZXMpOworCQkJcHJvY2Vzc050b01SZWxhdGlvbnMoZW50aXRpZXMpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIHVwZGF0ZSBlbnRpdGllcyBkdWUgdG86ICIgKyBlLnJlYXNvbiwgZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gdXBkYXRlIGVudGl0aWVzIGR1ZSB0bzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQgZXh0ZW5kcyBEZWxldGFibGU+IHZvaWQgZGVsZXRlKENvbGxlY3Rpb248VD4gZW50aXRpZXMpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJaWYgKGVudGl0aWVzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJTGlzdDxUPiBmaWx0ZXJlZEVudGl0aWVzID0gZW50aXRpZXMuc3RyZWFtKCkuZmlsdGVyKGUgLT4gT0RTVXRpbHMuaXNWYWxpZElEKGUuZ2V0SUQoKSkpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJdHJ5IHsKKwkJCU1hcDxDbGFzczw/PiwgTGlzdDxUPj4gZW50aXRpZXNCeUNsYXNzVHlwZSA9IGZpbHRlcmVkRW50aXRpZXMuc3RyZWFtKCkKKwkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KGUgLT4gZS5nZXRDbGFzcygpKSk7CisKKwkJCUxpc3Q8Q2F0YWxvZ0NvbXBvbmVudD4gY2F0YWxvZ0NvbXBvbmVudHMgPSAoTGlzdDxDYXRhbG9nQ29tcG9uZW50PikgZW50aXRpZXNCeUNsYXNzVHlwZQorCQkJCQkuZ2V0KENhdGFsb2dDb21wb25lbnQuY2xhc3MpOworCQkJaWYgKGNhdGFsb2dDb21wb25lbnRzICE9IG51bGwpIHsKKwkJCQlnZXRDYXRhbG9nTWFuYWdlcigpLmRlbGV0ZUNhdGFsb2dDb21wb25lbnRzKGNhdGFsb2dDb21wb25lbnRzKTsKKwkJCX0KKworCQkJTGlzdDxDYXRhbG9nU2Vuc29yPiBjYXRhbG9nU2Vuc29ycyA9IChMaXN0PENhdGFsb2dTZW5zb3I+KSBlbnRpdGllc0J5Q2xhc3NUeXBlLmdldChDYXRhbG9nU2Vuc29yLmNsYXNzKTsKKwkJCWlmIChjYXRhbG9nU2Vuc29ycyAhPSBudWxsKSB7CisJCQkJLy8gVE9ETyBhbmVobWVyIG9uIDIwMTctMTEtMTY6IGF2YWxvbiA0LjNiIHRocm93cyBhbiBleGNlcHRpb24gaW4KKwkJCQkvLyBBb1Nlc3Npb24uY29tbWl0VHJhbnNhY3Rpb24oKSBpZiBtdWx0aXBsZQorCQkJCS8vIGNhdGFsb2cgc2Vuc29ycyBoYXZlIGJlZW4gZGVsZXRlZCBhbmQgbGVhdmVzIHRoZSBhcHBsaWNhdGlvbgorCQkJCS8vIG1vZGVsIGluIGEgYnJva2VuIHN0YXRlLiBUaGlzIGlzIGFsc28gc3RhdGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGlzCisJCQkJLy8gY29tbWVudCBzaG91bGQgYmUgcmVtb3ZlZCBsYXRlci4KKwkJCQlnZXRDYXRhbG9nTWFuYWdlcigpLmRlbGV0ZUNhdGFsb2dTZW5zb3JzKGNhdGFsb2dTZW5zb3JzKTsKKwkJCX0KKworCQkJTGlzdDxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlcyA9IChMaXN0PENhdGFsb2dBdHRyaWJ1dGU+KSBlbnRpdGllc0J5Q2xhc3NUeXBlCisJCQkJCS5nZXQoQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcyk7CisJCQlpZiAoY2F0YWxvZ0F0dHJpYnV0ZXMgIT0gbnVsbCkgeworCQkJCWdldENhdGFsb2dNYW5hZ2VyKCkuZGVsZXRlQ2F0YWxvZ0F0dHJpYnV0ZXMoY2F0YWxvZ0F0dHJpYnV0ZXMpOworCQkJfQorCisJCQkvKgorCQkJICogVE9ETzogZm9yIGFueSB0ZW1wbGF0ZSB0aGF0IGhhcyB0byBiZSBkZWxldGVkIGl0IGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGVyZQorCQkJICogYXJlIG5vIGxpbmtzIHRvIGl0Li4uCisJCQkgKi8KKworCQkJZXhlY3V0ZVN0YXRlbWVudHMoZXQgLT4gbmV3IERlbGV0ZVN0YXRlbWVudCh0aGlzLCBldCwgdHJ1ZSksIGZpbHRlcmVkRW50aXRpZXMpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIGRlbGV0ZSBlbnRpdGllcyBkdWUgdG86ICIgKyBlLnJlYXNvbiwgZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIGVudGl0aWVzIGR1ZSB0bzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB3cml0ZU1lYXN1cmVkVmFsdWVzKENvbGxlY3Rpb248V3JpdGVSZXF1ZXN0PiB3cml0ZVJlcXVlc3RzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmICh3cml0ZVJlcXVlc3RzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5IHsKKwkJCU1hcDxTY2FsYXJUeXBlLCBMaXN0PFdyaXRlUmVxdWVzdD4+IHdyaXRlUmVxdWVzdHNCeVJhd1R5cGUgPSB3cml0ZVJlcXVlc3RzLnN0cmVhbSgpCisJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShXcml0ZVJlcXVlc3Q6OmdldFJhd1NjYWxhclR5cGUpKTsKKworCQkJZm9yIChMaXN0PFdyaXRlUmVxdWVzdD4gd3JpdGVSZXF1ZXN0R3JvdXAgOiB3cml0ZVJlcXVlc3RzQnlSYXdUeXBlLnZhbHVlcygpKSB7CisJCQkJV3JpdGVSZXF1ZXN0SGFuZGxlciB3cml0ZVJlcXVlc3RIYW5kbGVyID0gbmV3IFdyaXRlUmVxdWVzdEhhbmRsZXIodGhpcyk7CisJCQkJTGlzdDxDaGFubmVsPiBjaGFubmVscyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCQkJZm9yIChXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0IDogd3JpdGVSZXF1ZXN0R3JvdXApIHsKKwkJCQkJQ2hhbm5lbCBjaGFubmVsID0gd3JpdGVSZXF1ZXN0LmdldENoYW5uZWwoKTsKKwkJCQkJY2hhbm5lbC5zZXRTY2FsYXJUeXBlKHdyaXRlUmVxdWVzdC5nZXRDYWxjdWxhdGVkU2NhbGFyVHlwZSgpKTsKKwkJCQkJLy8gVE9ETyBpdCBtaWdodCBiZSByZXF1aXJlZCB0byBjaGFuZ2UgcmVsYXRpb24gdG8gYW5vdGhlcgorCQkJCQkvLyB1bml0PyE/PworCQkJCQljaGFubmVscy5hZGQoY2hhbm5lbCk7CisJCQkJCXdyaXRlUmVxdWVzdEhhbmRsZXIuYWRkUmVxdWVzdCh3cml0ZVJlcXVlc3QpOworCQkJCX0KKworCQkJCXVwZGF0ZShjaGFubmVscyk7CisJCQkJd3JpdGVSZXF1ZXN0SGFuZGxlci5leGVjdXRlKCk7CisJCQl9CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgbWVhc3VyZWQgdmFsdWVzIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBtZWFzdXJlZCB2YWx1ZXMgZHVlIHRvOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWNvbnRleHQuZ2V0QW9TZXNzaW9uKCkuY29tbWl0VHJhbnNhY3Rpb24oKTsKKworCQkJLy8gY29tbWl0IHN1Y2NlZWQgLT4gYXBwbHkgY2hhbmdlcyBpbiBlbnRpdHkgY29yZXMKKwkJCW1vZGlmaWVkLmZvckVhY2goQ29yZTo6YXBwbHkpOworCisJCQkvLyByZW1vdmUgZGVsZXRlZCByZW1vdGUgZmlsZXMKKwkJCWlmICh1cGxvYWRTZXJ2aWNlICE9IG51bGwpIHsKKwkJCQl1cGxvYWRTZXJ2aWNlLmNvbW1pdCgpOworCQkJfQorCisJCQlpZiAoY2F0YWxvZ01hbmFnZXIgIT0gbnVsbCkgeworCQkJCS8vIGFwcGxpY2F0aW9uIG1vZGVsIGhhcyBiZWVuIG1vZGlmaWVkIC0+IHJlbG9hZAorCQkJCXBhcmVudENvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCkucmVsb2FkQXBwbGljYXRpb25Nb2RlbCgpOworCQkJfQorCisJCQlMT0dHRVIuZGVidWcoIlRyYW5zYWN0aW9uICd7fScgY29tbWl0dGVkLiIsIGlkKTsKKwkJCWNsb3NlU2Vzc2lvbigpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNvbW1pdCB0cmFuc2FjdGlvbiAnIiArIGlkICsgIicgZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFib3J0KCkgeworCQl0cnkgeworCQkJaWYgKHVwbG9hZFNlcnZpY2UgIT0gbnVsbCkgeworCQkJCXVwbG9hZFNlcnZpY2UuYWJvcnQoKTsKKwkJCX0KKworCQkJLy8gcmVzZXQgdmVyc2lvbiwgc2luY2UgY3JlYXRpb24gZmFpbGVkIG9yIHdhcyBhYm9ydGVkCisJCQljb250ZXh0Um9vdHMuZm9yRWFjaChjciAtPiBjci5zZXRWZXJzaW9uKG51bGwpKTsKKworCQkJLy8gcmVzZXQgaW5zdGFuY2UgSURzCisJCQlTdHJpbmcgdmlydHVhbElEID0gIjAiOworCQkJY3JlYXRlZC5mb3JFYWNoKGMgLT4gYy5zZXRJRCh2aXJ0dWFsSUQpKTsKKworCQkJY29udGV4dC5nZXRBb1Nlc3Npb24oKS5hYm9ydFRyYW5zYWN0aW9uKCk7CisKKwkJCUxPR0dFUi5kZWJ1ZygiVHJhbnNhY3Rpb24gJ3t9JyBhYm9ydGVkLiIsIGlkKTsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJTE9HR0VSLmVycm9yKCJVbmFibGUgdG8gYWJvcnQgdHJhbnNhY3Rpb24gJyIgKyBpZCArICInIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWNsb3NlU2Vzc2lvbigpOworCQl9CisJfQorCisJLyoqCisJICogT25jZSB7QGxpbmsgI2Fib3J0KCl9IGlzIGNhbGxlZCBpbnN0YW5jZSBJRCBvZiBnaXZlbiB7QGxpbmsgQ29yZX0gd2lsbCBiZQorCSAqIHJlc2V0IHRvIHtAY29kZSAwfSB3aGljaCBpbmRpY2F0ZXMgYSB2aXJ0dWFsIHtAbGluayBFbnRpdHl9LCBub3QgeWV0CisJICogcGVyc2lzdGVkLCBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0Bjb2RlIENvcmV9IG9mIGEgbmV3bHkgd3JpdHRlbiB7QGNvZGUgRW50aXR5fS4KKwkgKi8KKwl2b2lkIGFkZENyZWF0ZWQoQ29yZSBjb3JlKSB7CisJCWNyZWF0ZWQuYWRkKGNvcmUpOworCX0KKworCS8qKgorCSAqIE9uY2Uge0BsaW5rICNjb21taXQoKX0gaXMge0BsaW5rIENvcmUjYXBwbHkoKX0gd2lsbCBiZSBjYWxsZWQgdG8gYXBwbHkKKwkgKiBtb2RpZmllZCB7QGxpbmsgVmFsdWV9IGNvbnRlbnRzIGFuZCByZW1vdmVkIHJlbGF0ZWQgZW50aXRpZXMuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0Bjb2RlIENvcmV9IG9mIGFuIHVwZGF0ZWQge0Bjb2RlIEVudGl0eX0uCisJICovCisJdm9pZCBhZGRNb2RpZmllZChDb3JlIGNvcmUpIHsKKwkJbW9kaWZpZWQuYWRkKGNvcmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBPRFNDb250ZXh0fS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBPRFNDb250ZXh0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlPRFNDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBjb250ZXh0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBPRFNNb2RlbE1hbmFnZXJ9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9EU01vZGVsTWFuYWdlcn0gaXMgcmV0dXJuZWQuCisJICovCisJT0RTTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKKwkJcmV0dXJuIGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFVwbG9hZFNlcnZpY2V9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFVwbG9hZFNlcnZpY2V9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgZmlsZSB0cmFuc2ZlciBpcyBub3QgcG9zc2libGUuCisJICovCisJVXBsb2FkU2VydmljZSBnZXRVcGxvYWRTZXJ2aWNlKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlpZiAodXBsb2FkU2VydmljZSA9PSBudWxsKSB7CisJCQlpZiAoY29udGV4dC5nZXRGaWxlU2VydmVyKCkgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJDT1JCQSBmaWxlIHNlcnZlciBpcyBub3QgYXZhaWxhYmxlLiIpOworCQkJfQorCisJCQkvLyB1cGxvYWQgc2VydmljZSBzdGFydHMgYSBwZXJpb2RpYyBzZXNzaW9uIHJlZnJlc2ggdGFzayAtPiBsYXp5CisJCQkvLyBpbnN0YW50aWF0aW9uCisJCQl1cGxvYWRTZXJ2aWNlID0gbmV3IFVwbG9hZFNlcnZpY2UoY29udGV4dCwgZW50aXR5LCB0cmFuc2Zlcik7CisJCX0KKworCQlyZXR1cm4gdXBsb2FkU2VydmljZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2F0YWxvZ01hbmFnZXJ9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENhdGFsb2dNYW5hZ2VyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIENhdGFsb2dNYW5hZ2VyIGdldENhdGFsb2dNYW5hZ2VyKCkgeworCQlpZiAoY2F0YWxvZ01hbmFnZXIgPT0gbnVsbCkgeworCQkJY2F0YWxvZ01hbmFnZXIgPSBuZXcgQ2F0YWxvZ01hbmFnZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gY2F0YWxvZ01hbmFnZXI7CisJfQorCisJLyoqCisJICogQ29sbGVjdHMge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMgd2l0aCBhIHZhbGlkIGRlZmF1bHQge0BsaW5rIFZhbHVlfSBvZgorCSAqIHR5cGUge0BsaW5rIFZhbHVlVHlwZSNGSUxFX0xJTkt9IG9yIHtAbGluayBWYWx1ZVR5cGUjRklMRV9MSU5LX1NFUVVFTkNFfS4KKwkgKgorCSAqIEBwYXJhbSB0ZW1wbGF0ZUF0dHJpYnV0ZXMgVGhlIHByb2Nlc3NlZCB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9cy4KKwkgKiBAcmV0dXJuIFJldHVybnMge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfSB3aGljaCBoYXZlIHtAbGluayBGaWxlTGlua31zIHN0b3JlZAorCSAqICAgICAgICAgYXMgZGVmYXVsdCB7QGNvZGUgVmFsdWV9LgorCSAqLworCXByaXZhdGUgTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gZ2V0RmlsZUxpbmtUZW1wbGF0ZUF0dHJpYnV0ZXMoTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gdGVtcGxhdGVBdHRyaWJ1dGVzKSB7CisJCXJldHVybiB0ZW1wbGF0ZUF0dHJpYnV0ZXMuc3RyZWFtKCkuZmlsdGVyKHRhIC0+IHsKKwkJCVZhbHVlIHZhbHVlID0gdGEuZ2V0RGVmYXVsdFZhbHVlKCk7CisJCQlyZXR1cm4gdmFsdWUuZ2V0VmFsdWVUeXBlKCkuaXNGaWxlTGlua1R5cGUoKSAmJiB2YWx1ZS5pc1ZhbGlkKCk7CisJCX0pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZXMgc3RhdGVtZW50cyBmb3IgZ2l2ZW4gZW50aXRpZXMgYnkgdXNpbmcgZ2l2ZW4gc3RhdGVtZW50IGZhY3RvcnkuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICBUaGUgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIHN0YXRlbWVudEZhY3RvcnkgVXNlZCB0byBjcmVhdGUgYSBuZXcgc3RhdGVtZW50IGZvciBhIGdpdmVuCisJICogICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBlbnRpdGllcyAgICAgICAgIFRoZSBwcm9jZXNzZWQge0Bjb2RlIEVudGl0eX1zLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaWYgdGhlIGV4ZWN1dGlvbiBmYWlscy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBleGVjdXRpb24gZmFpbHMuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgIFRocm93biBpZiBhIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uIGZhaWxzLgorCSAqLworCXByaXZhdGUgPFQgZXh0ZW5kcyBFbnRpdHk+IHZvaWQgZXhlY3V0ZVN0YXRlbWVudHMoRnVuY3Rpb248RW50aXR5VHlwZSwgQmFzZVN0YXRlbWVudD4gc3RhdGVtZW50RmFjdG9yeSwKKwkJCUNvbGxlY3Rpb248VD4gZW50aXRpZXMpIHRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlNYXA8RW50aXR5VHlwZSwgTGlzdDxFbnRpdHk+PiBlbnRpdGllc0J5VHlwZSA9IGVudGl0aWVzLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCk6OmdldEVudGl0eVR5cGUpKTsKKwkJZm9yIChFbnRyeTxFbnRpdHlUeXBlLCBMaXN0PEVudGl0eT4+IGVudHJ5IDogZW50aXRpZXNCeVR5cGUuZW50cnlTZXQoKSkgeworCQkJc3RhdGVtZW50RmFjdG9yeS5hcHBseShlbnRyeS5nZXRLZXkoKSkuZXhlY3V0ZShlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFByb2Nlc3NlcyBOLXRvLU0gcmVsYXRpb25zIGZvciB0aGUgZ2l2ZW4gZW50aXRpZXMKKwkgKiAKKwkgKiBAcGFyYW0gZW50aXRpZXMgVGhlIHByb2Nlc3NlZCB7QGNvZGUgRW50aXR5fXMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzLgorCSAqLworCXByaXZhdGUgPFQgZXh0ZW5kcyBFbnRpdHk+IHZvaWQgcHJvY2Vzc050b01SZWxhdGlvbnMoQ29sbGVjdGlvbjxUPiBlbnRpdGllcykgeworCQlmb3IgKEVudGl0eSBlIDogZW50aXRpZXMpIHsKKwkJCWNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShlKS5nZXRSZWxhdGlvbnMoKS5zdHJlYW0oKS5maWx0ZXIoUmVsYXRpb246OmlzTnRvTSkKKwkJCQkJLmZvckVhY2gociAtPiBwcm9jZXNzTXRvTVJlbGF0aW9uKGUsIHIpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcm9jZXNzTXRvTVJlbGF0aW9uKEVudGl0eSBlbnRpdHksIFJlbGF0aW9uIHJlbGF0aW9uKSB7CisKKwkJTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPiByZW1vdmVkUmVsYXRlZEVudGl0aWVzID0gT0RTRW50aXR5RmFjdG9yeS5leHRyYWN0KGVudGl0eSkuZ2V0TnRvTVN0b3JlKCkuZ2V0UmVtb3ZlZCgpCisJCQkJLmdldE9yRGVmYXVsdChyZWxhdGlvbi5nZXROYW1lKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKwkJTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPiBhZGRlZFJlbGF0ZWRFbnRpdGllcyA9IE9EU0VudGl0eUZhY3RvcnkuZXh0cmFjdChlbnRpdHkpLmdldE50b01TdG9yZSgpLmdldEFkZGVkKCkKKwkJCQkuZ2V0T3JEZWZhdWx0KHJlbGF0aW9uLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworCisJCVRfTE9OR0xPTkdbXSByZW1vdmVkSW5zdElkcyA9IHJlbW92ZWRSZWxhdGVkRW50aXRpZXMuc3RyZWFtKCkubWFwKEVudGl0eTo6Z2V0SUQpLm1hcChPRFNDb252ZXJ0ZXI6OnRvT0RTSUQpCisJCQkJLnRvQXJyYXkoVF9MT05HTE9OR1tdOjpuZXcpOworCisJCVRfTE9OR0xPTkdbXSBhZGRlZEluc3RJZHMgPSBhZGRlZFJlbGF0ZWRFbnRpdGllcy5zdHJlYW0oKS5tYXAoRW50aXR5OjpnZXRJRCkubWFwKE9EU0NvbnZlcnRlcjo6dG9PRFNJRCkKKwkJCQkudG9BcnJheShUX0xPTkdMT05HW106Om5ldyk7CisKKwkJdHJ5IHsKKwkJCWlmIChyZW1vdmVkSW5zdElkcy5sZW5ndGggPiAwKSB7CisJCQkJT0RTRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gKChPRFNFbnRpdHlUeXBlKSBjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoZW50aXR5KSk7CisJCQkJRWxlbUlkIGVsZW1JZCA9IG5ldyBFbGVtSWQoZW50aXR5VHlwZS5nZXRPRFNJRCgpLCBPRFNDb252ZXJ0ZXIudG9PRFNJRChlbnRpdHkuZ2V0SUQoKSkpOworCQkJCWNvbnRleHQuZ2V0QW9TZXNzaW9uKCkuZ2V0QXBwbEVsZW1BY2Nlc3MoKS5zZXRSZWxJbnN0KGVsZW1JZCwgcmVsYXRpb24uZ2V0TmFtZSgpLCByZW1vdmVkSW5zdElkcywKKwkJCQkJCVNldFR5cGUuUkVNT1ZFKTsKKwkJCX0KKworCQkJaWYgKGFkZGVkSW5zdElkcy5sZW5ndGggPiAwKSB7CisJCQkJT0RTRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gKChPRFNFbnRpdHlUeXBlKSBjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoZW50aXR5KSk7CisJCQkJRWxlbUlkIGVsZW1JZCA9IG5ldyBFbGVtSWQoZW50aXR5VHlwZS5nZXRPRFNJRCgpLCBPRFNDb252ZXJ0ZXIudG9PRFNJRChlbnRpdHkuZ2V0SUQoKSkpOworCQkJCWNvbnRleHQuZ2V0QW9TZXNzaW9uKCkuZ2V0QXBwbEVsZW1BY2Nlc3MoKS5zZXRSZWxJbnN0KGVsZW1JZCwgcmVsYXRpb24uZ2V0TmFtZSgpLCBhZGRlZEluc3RJZHMsCisJCQkJCQlTZXRUeXBlLkFQUEVORCk7CisJCQl9CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCIiICsgZS5yZWFzb24sIGUpOyAvLyBUT0RPCisJCX0KKwl9CisKKwkvKioKKwkgKiBDbG9zZXMgdGhlIGNvLXNlc3Npb24gb2YgdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgY2xvc2VTZXNzaW9uKCkgeworCQlpZiAoY2F0YWxvZ01hbmFnZXIgIT0gbnVsbCkgeworCQkJY2F0YWxvZ01hbmFnZXIuY2xlYXIoKTsKKwkJfQorCisJCWNvbnRleHQuY2xvc2UoKTsKKwkJTE9HR0VSLmRlYnVnKCJUcmFuc2FjdGlvbiAne30nIGNsb3NlZC4iLCBpZCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vVXBkYXRlU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vVXBkYXRlU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkMzBmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9VcGRhdGVTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci50cmFuc2FjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFJRE5hbWU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFJRE5hbWVWYWx1ZVNlcVVuaXRJZDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5U3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GaWxlc0F0dGFjaGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Sb2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTRW50aXR5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIEluc2VydCBzdGF0ZW1lbnQgaXMgdXNlZCB0byB1cGRhdGUgZW50aXRpZXMgYW5kIHRoZWlyIGNoaWxkcmVuLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitmaW5hbCBjbGFzcyBVcGRhdGVTdGF0ZW1lbnQgZXh0ZW5kcyBCYXNlU3RhdGVtZW50IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVXBkYXRlU3RhdGVtZW50LmNsYXNzKTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxFbnRpdHk+PiBjaGlsZHJlblRvQ3JlYXRlID0gbmV3IEhhc2hNYXA8PigpOworCXByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PEVudGl0eT4+IGNoaWxkcmVuVG9VcGRhdGUgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIERlbGV0YWJsZT4sIExpc3Q8RGVsZXRhYmxlPj4gY2hpbGRyZW5Ub1JlbW92ZSA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8VmFsdWU+PiB1cGRhdGVNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIExpc3Q8RmlsZUxpbms+IGZpbGVMaW5rVG9VcGxvYWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBub25VcGRhdGFibGVSZWxhdGlvbk5hbWVzOworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpZ25vcmVDaGlsZHJlbjsKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNGaWxlc0F0dGFjaGFibGU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gdHJhbnNhY3Rpb24gICAgVGhlIG93bmluZyB7QGxpbmsgT0RTVHJhbnNhY3Rpb259LgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlICAgICBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIGlnbm9yZUNoaWxkcmVuIElmIHtAY29kZSB0cnVlfSwgdGhlbiBjaGlsZCBlbnRpdGllcyB3b24ndCBiZQorCSAqICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuCisJICovCisJVXBkYXRlU3RhdGVtZW50KE9EU1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLCBFbnRpdHlUeXBlIGVudGl0eVR5cGUsIGJvb2xlYW4gaWdub3JlQ2hpbGRyZW4pIHsKKwkJc3VwZXIodHJhbnNhY3Rpb24sIGVudGl0eVR5cGUpOworCisJCW5vblVwZGF0YWJsZVJlbGF0aW9uTmFtZXMgPSBlbnRpdHlUeXBlLmdldEluZm9SZWxhdGlvbnMoKS5zdHJlYW0oKS5tYXAoUmVsYXRpb246OmdldE5hbWUpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCXRoaXMuaWdub3JlQ2hpbGRyZW4gPSBpZ25vcmVDaGlsZHJlbjsKKworCQlFbnRpdHlDb25maWc8Pz4gZW50aXR5Q29uZmlnID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5Q29uZmlnKGdldEVudGl0eVR5cGUoKSk7CisJCWlzRmlsZXNBdHRhY2hhYmxlID0gRmlsZXNBdHRhY2hhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZW50aXR5Q29uZmlnLmdldEVudGl0eUNsYXNzKCkpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBleGVjdXRlKENvbGxlY3Rpb248RW50aXR5PiBlbnRpdGllcykgdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWZvciAoRW50aXR5IGVudGl0eSA6IGVudGl0aWVzKSB7CisJCQlyZWFkRW50aXR5Q29yZShPRFNFbnRpdHlGYWN0b3J5LmV4dHJhY3QoZW50aXR5KSk7CisJCX0KKworCQkvLyBUT0RPIHRyYWNpbmcgcHJvZ3Jlc3MgaW4gdGhpcyBtZXRob2QuLi4KKworCQlMaXN0PEFJRE5hbWVWYWx1ZVNlcVVuaXRJZD4gYW52c3VMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVRfTE9OR0xPTkcgYUlEID0gZ2V0RW50aXR5VHlwZSgpLmdldE9EU0lEKCk7CisKKwkJaWYgKCFmaWxlTGlua1RvVXBsb2FkLmlzRW1wdHkoKSkgeworCQkJZ2V0VHJhbnNhY3Rpb24oKS5nZXRVcGxvYWRTZXJ2aWNlKCkudXBsb2FkUGFyYWxsZWwoZmlsZUxpbmtUb1VwbG9hZCwgbnVsbCk7CisJCX0KKworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxWYWx1ZT4+IGVudHJ5IDogdXBkYXRlTWFwLmVudHJ5U2V0KCkpIHsKKwkJCWlmIChub25VcGRhdGFibGVSZWxhdGlvbk5hbWVzLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgeworCQkJCS8vIHNraXAgImVtcHR5IiBpbmZvcm1hdGl2ZSByZWxhdGlvbiBzZXF1ZW5jZQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGVudHJ5LmdldEtleSgpLmVxdWFsc0lnbm9yZUNhc2UoUm9sZS5BVFRSX1NVUEVSVVNFUl9GTEFHKSkgeworCQkJCS8vIHNraXAgc3VwZXJ1c2VyIGZsYWcgYXMgaXQgY2Fubm90IGJlIHdyaXR0ZW4gdGhyb3VnaCB0aGUgT0RTIEFQSQorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0RW50aXR5VHlwZSgpLmdldEF0dHJpYnV0ZShlbnRyeS5nZXRLZXkoKSk7CisKKwkJCUFJRE5hbWVWYWx1ZVNlcVVuaXRJZCBhbnZzdSA9IG5ldyBBSUROYW1lVmFsdWVTZXFVbml0SWQoKTsKKwkJCWFudnN1LmF0dHIgPSBuZXcgQUlETmFtZShhSUQsIGVudHJ5LmdldEtleSgpKTsKKwkJCWFudnN1LnVuaXRJZCA9IE9EU0NvbnZlcnRlci50b09EU0xvbmcoMCk7CisJCQlhbnZzdS52YWx1ZXMgPSBPRFNDb252ZXJ0ZXIudG9PRFNWYWx1ZVNlcShhdHRyaWJ1dGUsIGVudHJ5LmdldFZhbHVlKCkpOworCQkJYW52c3VMaXN0LmFkZChhbnZzdSk7CisJCX0KKworCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWdldEFwcGxFbGVtQWNjZXNzKCkudXBkYXRlSW5zdGFuY2VzKGFudnN1TGlzdC50b0FycmF5KG5ldyBBSUROYW1lVmFsdWVTZXFVbml0SWRbYW52c3VMaXN0LnNpemUoKV0pKTsKKwkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJTE9HR0VSLmRlYnVnKCJ7fSAiICsgZ2V0RW50aXR5VHlwZSgpICsgIiBpbnN0YW5jZXMgdXBkYXRlZCBpbiB7fSBtcy4iLCBlbnRpdGllcy5zaXplKCksIHN0b3AgLSBzdGFydCk7CisKKwkJLy8gZGVsZXRlIGZpcnN0IHRvIG1ha2Ugc3VyZSBuYW1pbmcgY29sbGlzaW9ucyBkbyBub3Qgb2NjdXIhCisJCWZvciAoTGlzdDxEZWxldGFibGU+IGNoaWxkcmVuIDogY2hpbGRyZW5Ub1JlbW92ZS52YWx1ZXMoKSkgeworCQkJZ2V0VHJhbnNhY3Rpb24oKS5kZWxldGUoY2hpbGRyZW4pOworCQl9CisJCWZvciAoTGlzdDxFbnRpdHk+IGNoaWxkcmVuIDogY2hpbGRyZW5Ub0NyZWF0ZS52YWx1ZXMoKSkgeworCQkJZ2V0VHJhbnNhY3Rpb24oKS5jcmVhdGUoY2hpbGRyZW4pOworCQl9CisJCWZvciAoTGlzdDxFbnRpdHk+IGNoaWxkcmVuIDogY2hpbGRyZW5Ub1VwZGF0ZS52YWx1ZXMoKSkgeworCQkJZ2V0VHJhbnNhY3Rpb24oKS51cGRhdGUoY2hpbGRyZW4pOworCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJlYWRzIGdpdmVuIHtAbGluayBDb3JlfSBhbmQgcHJlcGFyZXMgaXRzIGRhdGEgdG8gYmUgd3JpdHRlbjoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+Y29sbGVjdCBuZXcgYW5kIHJlbW92ZWQge0BsaW5rIEZpbGVMaW5rfXM8L2xpPgorCSAqIDxsaT5jb2xsZWN0IHByb3BlcnR5IHtAbGluayBWYWx1ZX1zPC9saT4KKwkgKiA8bGk+Y29sbGVjdCBmb3JlaWduIGtleSB7QGNvZGUgVmFsdWV9czwvbGk+CisJICogPGxpPmNvbGxlY3QgY2hpbGQgZW50aXRpZXMgZm9yIHJlY3Vyc2l2ZSBjcmVhdGUvdXBkYXRlL2RlbGV0ZTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGNvZGUgQ29yZX0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVhZEVudGl0eUNvcmUoQ29yZSBjb3JlKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmICghY29yZS5nZXRUeXBlTmFtZSgpLmVxdWFscyhnZXRFbnRpdHlUeXBlKCkuZ2V0TmFtZSgpKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW50aXR5IGNvcmUgJyIgKyBjb3JlLmdldFR5cGVOYW1lKCkKKwkJCQkJKyAiJyBpcyBpbmNvbXBhdGlibGUgd2l0aCBjdXJyZW50IHVwZGF0ZSBzdGF0ZW1lbnQgZm9yIGVudGl0eSB0eXBlICciICsgZ2V0RW50aXR5VHlwZSgpICsgIicuIik7CisJCX0KKworCQkvLyBhZGQgYWxsIGVudGl0eSB2YWx1ZXMKKwkJZm9yIChWYWx1ZSB2YWx1ZSA6IGNvcmUuZ2V0QWxsVmFsdWVzKCkudmFsdWVzKCkpIHsKKwkJCXVwZGF0ZU1hcC5jb21wdXRlSWZBYnNlbnQodmFsdWUuZ2V0TmFtZSgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQodmFsdWUpOworCQl9CisKKwkJLy8gY29sbGVjdCBmaWxlIGxpbmtzCisJCWZpbGVMaW5rVG9VcGxvYWQuYWRkQWxsKGNvcmUuZ2V0QWRkZWRGaWxlTGlua3MoKSk7CisJCUxpc3Q8RmlsZUxpbms+IGZpbGVMaW5rc1RvUmVtb3ZlID0gY29yZS5nZXRSZW1vdmVkRmlsZUxpbmtzKCk7CisJCWlmIChpc0ZpbGVzQXR0YWNoYWJsZSAmJiAhZmlsZUxpbmtzVG9SZW1vdmUuaXNFbXB0eSgpKSB7CisJCQlnZXRUcmFuc2FjdGlvbigpLmdldFVwbG9hZFNlcnZpY2UoKS5hZGRUb1JlbW92ZShmaWxlTGlua3NUb1JlbW92ZSk7CisJCX0KKworCQl1cGRhdGVNYXAuY29tcHV0ZUlmQWJzZW50KGdldEVudGl0eVR5cGUoKS5nZXRJREF0dHJpYnV0ZSgpLmdldE5hbWUoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkKKwkJCQkuYWRkKGdldEVudGl0eVR5cGUoKS5nZXRJREF0dHJpYnV0ZSgpLmNyZWF0ZVZhbHVlKGNvcmUuZ2V0SUQoKSkpOworCisJCS8vIGRlZmluZSAiZW1wdHkiIHZhbHVlcyBmb3IgQUxMIGluZm9ybWF0aXZlIHJlbGF0aW9ucworCQlmb3IgKFJlbGF0aW9uIHJlbGF0aW9uIDogZ2V0RW50aXR5VHlwZSgpLmdldEluZm9SZWxhdGlvbnMoKSkgeworCQkJdXBkYXRlTWFwLmNvbXB1dGVJZkFic2VudChyZWxhdGlvbi5nZXROYW1lKCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZChyZWxhdGlvbi5jcmVhdGVWYWx1ZSgpKTsKKwkJfQorCisJCS8vIHByZXNlcnZlICJlbXB0eSIgcmVsYXRpb24gdmFsdWVzIGZvciByZW1vdmVkIHJlbGF0ZWQgZW50aXRpZXMKKwkJRW50aXR5U3RvcmUgbXV0YWJsZVN0b3JlID0gY29yZS5nZXRNdXRhYmxlU3RvcmUoKTsKKwkJbXV0YWJsZVN0b3JlLmdldFJlbW92ZWQoKS5zdHJlYW0oKS5tYXAoZSAtPiBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKGUpKQorCQkJCS5tYXAoZ2V0RW50aXR5VHlwZSgpOjpnZXRSZWxhdGlvbikubWFwKFJlbGF0aW9uOjpnZXROYW1lKS5mb3JFYWNoKG5vblVwZGF0YWJsZVJlbGF0aW9uTmFtZXM6OnJlbW92ZSk7CisKKwkJLy8gcmVwbGFjZSAiZW1wdHkiIHJlbGF0aW9uIHZhbHVlcyB3aXRoIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2UgSURzCisJCXNldFJlbGF0aW9uSURzKG11dGFibGVTdG9yZS5nZXRDdXJyZW50KCkpOworCisJCWNvbGxlY3RDaGlsZEVudGl0aWVzKGNvcmUpOworCisJCWdldFRyYW5zYWN0aW9uKCkuYWRkTW9kaWZpZWQoY29yZSk7CisJfQorCisJLyoqCisJICogQ29sbGVjdHMgY2hpbGQgZW50aXRpZXMgZm9yIHJlY3Vyc2l2ZSBwcm9jZXNzaW5nLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgY29sbGVjdENoaWxkRW50aXRpZXMoQ29yZSBjb3JlKSB7CisJCWlmIChpZ25vcmVDaGlsZHJlbikgeworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChFbnRyeTxDbGFzczw/IGV4dGVuZHMgRGVsZXRhYmxlPiwgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gZW50cnkgOiBjb3JlLmdldENoaWxkcmVuU3RvcmUoKS5nZXRDdXJyZW50KCkKKwkJCQkuZW50cnlTZXQoKSkgeworCQkJTWFwPEJvb2xlYW4sIExpc3Q8RW50aXR5Pj4gcGFydGl0aW9uID0gZW50cnkuZ2V0VmFsdWUoKS5zdHJlYW0oKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnBhcnRpdGlvbmluZ0J5KGUgLT4gT0RTVXRpbHMuaXNWYWxpZElEKGUuZ2V0SUQoKSkpKTsKKwkJCUxpc3Q8RW50aXR5PiB2aXJ0dWFsRW50aXRpZXMgPSBwYXJ0aXRpb24uZ2V0KEJvb2xlYW4uRkFMU0UpOworCQkJaWYgKHZpcnR1YWxFbnRpdGllcyAhPSBudWxsICYmICF2aXJ0dWFsRW50aXRpZXMuaXNFbXB0eSgpKSB7CisJCQkJY2hpbGRyZW5Ub0NyZWF0ZS5jb21wdXRlSWZBYnNlbnQoZW50cnkuZ2V0S2V5KCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZEFsbCh2aXJ0dWFsRW50aXRpZXMpOworCQkJfQorCQkJTGlzdDxFbnRpdHk+IGV4aXN0aW5nRW50aXRpZXMgPSBwYXJ0aXRpb24uZ2V0KEJvb2xlYW4uVFJVRSk7CisJCQlpZiAoZXhpc3RpbmdFbnRpdGllcyAhPSBudWxsICYmICFleGlzdGluZ0VudGl0aWVzLmlzRW1wdHkoKSkgeworCQkJCWNoaWxkcmVuVG9VcGRhdGUuY29tcHV0ZUlmQWJzZW50KGVudHJ5LmdldEtleSgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGRBbGwoZXhpc3RpbmdFbnRpdGllcyk7CisJCQl9CisJCX0KKworCQlmb3IgKEVudHJ5PENsYXNzPD8gZXh0ZW5kcyBEZWxldGFibGU+LCBMaXN0PD8gZXh0ZW5kcyBEZWxldGFibGU+PiBlbnRyeSA6IGNvcmUuZ2V0Q2hpbGRyZW5TdG9yZSgpLmdldFJlbW92ZWQoKQorCQkJCS5lbnRyeVNldCgpKSB7CisJCQlMaXN0PERlbGV0YWJsZT4gdG9EZWxldGUgPSBlbnRyeS5nZXRWYWx1ZSgpLnN0cmVhbSgpLmZpbHRlcihlIC0+IE9EU1V0aWxzLmlzVmFsaWRJRChlLmdldElEKCkpKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCWNoaWxkcmVuVG9SZW1vdmUuY29tcHV0ZUlmQWJzZW50KGVudHJ5LmdldEtleSgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGRBbGwodG9EZWxldGUpOworCQl9CisJfQorCisJLyoqCisJICogT3ZlcndyaXRlcyBlbXB0eSBmb3JlaWduIGtleSB7QGxpbmsgVmFsdWV9IGNvbnRhaW5lcnMuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRlZEVudGl0aWVzIFRoZSByZWxhdGVkIHtAbGluayBFbnRpdHl9cy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0UmVsYXRpb25JRHMoQ29sbGVjdGlvbjxFbnRpdHk+IHJlbGF0ZWRFbnRpdGllcykgeworCQlmb3IgKEVudGl0eSByZWxhdGVkRW50aXR5IDogcmVsYXRlZEVudGl0aWVzKSB7CisJCQlpZiAoIU9EU1V0aWxzLmlzVmFsaWRJRChyZWxhdGVkRW50aXR5LmdldElEKCkpKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRlZCBlbnRpdHkgbXVzdCBiZSBhIHBlcnNpdGVkIGVudGl0eS4iKTsKKwkJCX0KKworCQkJUmVsYXRpb24gcmVsYXRpb24gPSBnZXRFbnRpdHlUeXBlKCkuZ2V0UmVsYXRpb24oZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShyZWxhdGVkRW50aXR5KSk7CisJCQlMaXN0PFZhbHVlPiByZWxhdGlvblZhbHVlcyA9IHVwZGF0ZU1hcC5nZXQocmVsYXRpb24uZ2V0TmFtZSgpKTsKKwkJCWlmIChyZWxhdGlvblZhbHVlcyA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVsYXRpb24gJyIgKyByZWxhdGlvbgorCQkJCQkJKyAiJyBpcyBpbmNvbXBhdGlibGUgd2l0aCB1cGRhdGUgc3RhdGVtZW50IGZvciBlbnRpdHkgdHlwZSAnIiArIGdldEVudGl0eVR5cGUoKSArICInIik7CisJCQl9CisJCQlyZWxhdGlvblZhbHVlcy5nZXQocmVsYXRpb25WYWx1ZXMuc2l6ZSgpIC0gMSkuc2V0KHJlbGF0ZWRFbnRpdHkuZ2V0SUQoKSk7CisJCQlub25VcGRhdGFibGVSZWxhdGlvbk5hbWVzLnJlbW92ZShyZWxhdGlvbi5nZXROYW1lKCkpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vVXBsb2FkU2VydmljZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL1VwbG9hZFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjRmODNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL1VwbG9hZFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci50cmFuc2FjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmZpbGUuRmlsZVNlcnZpY2UuUHJvZ3Jlc3NMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GaWxlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXIuQ09SQkFGaWxlU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuZmlsZXRyYW5zZmVyLlRyYW5zZmVyOworCisvKioKKyAqIE1hbmFnZXMgbmV3IG9yIHJlbW92ZWQgZXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIFVwbG9hZFNlcnZpY2UgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNjaGVkdWxlciA9IEV4ZWN1dG9ycy5uZXdTY2hlZHVsZWRUaHJlYWRQb29sKDEpOworCisJcHJpdmF0ZSBmaW5hbCBNYXA8VGVtcGxhdGVBdHRyaWJ1dGUsIFZhbHVlPiB0ZW1wbGF0ZUF0dHJpYnV0ZUZpbGVMaW5rcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8RmlsZUxpbms+IHVwbG9hZGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBNYXA8UGF0aCwgU3RyaW5nPiByZW1vdGVQYXRocyA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8RmlsZUxpbms+IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIENPUkJBRmlsZVNlcnZpY2UgZmlsZVNlcnZpY2U7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHkgZW50aXR5OworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvbnRleHQgIFVzZWQgZm9yIHNldHVwLgorCSAqIEBwYXJhbSBlbnRpdHkgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHBhcmFtIHRyYW5zZmVyIFRoZSB0cmFuc2ZlciB0eXBlLgorCSAqLworCVVwbG9hZFNlcnZpY2UoT0RTQ29udGV4dCBjb250ZXh0LCBFbnRpdHkgZW50aXR5LCBUcmFuc2ZlciB0cmFuc2ZlcikgeworCQlmaWxlU2VydmljZSA9IG5ldyBDT1JCQUZpbGVTZXJ2aWNlKGNvbnRleHQsIHRyYW5zZmVyKTsKKwkJdGhpcy5lbnRpdHkgPSBlbnRpdHk7CisKKwkJc2NoZWR1bGVyLnNjaGVkdWxlQXRGaXhlZFJhdGUoKCkgLT4geworCQkJdHJ5IHsKKwkJCQljb250ZXh0LmdldEFvU2Vzc2lvbigpLmdldE5hbWUoKTsKKwkJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCQkvKgorCQkJCSAqIE5PVEU6IFRoaXMgaXMgZG9uZSB0byBrZWVwIHRoZSBwYXJlbnQgdHJhbnNhY3Rpb24ncyBzZXNzaW9uIGFsaXZlIHRpbGwgaXRzCisJCQkJICogY29tbWl0IG9yIGFib3J0IG1ldGhvZCBpcyBjYWxsZWQuIElmIHRoaXMgc2Vzc2lvbiByZWZyZXNoIHJlc3VsdHMgaW4gYW4KKwkJCQkgKiBlcnJvciwgdGhlbiBhbnkgcnVubmluZyBmaWxlIHRyYW5zZmVyIHdpbGwgYWJvcnQgd2l0aCBhIHByb3BlciBlcnJvciwKKwkJCQkgKiB0aGVyZWZvcmUgYW55IGV4Y2VwdGlvbiBoZXJlIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBhbmQgZXhwbGljaXRseSBOT1QgbG9nZ2VkIQorCQkJCSAqLworCQkJfQorCQl9LCA1LCA1LCBUaW1lVW5pdC5NSU5VVEVTKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBVcGxvYWRzIG5ldyBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcyBzdG9yZWQgaW4gZ2l2ZW4KKwkgKiB7QGxpbmsgVGVtcGxhdGVBdHRyaWJ1dGV9cy4gVGhlIHVwbG9hZCBwcm9ncmVzcyBtYXkgYmUgdHJhY2VkIHdpdGggYSBwcm9ncmVzcworCSAqIGxpc3RlbmVyLgorCSAqCisJICogQHBhcmFtIHRlbXBsYXRlQXR0cmlidXRlcyBUaGUge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMuCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgICBUaGUgcHJvZ3Jlc3MgbGlzdGVuZXIuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHVwbG9hZCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGxvYWQoQ29sbGVjdGlvbjxUZW1wbGF0ZUF0dHJpYnV0ZT4gdGVtcGxhdGVBdHRyaWJ1dGVzLCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlMaXN0PEZpbGVMaW5rPiBmaWxlTGlua3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChUZW1wbGF0ZUF0dHJpYnV0ZSB0ZW1wbGF0ZUF0dHJpYnV0ZSA6IHRlbXBsYXRlQXR0cmlidXRlcykgeworCQkJVmFsdWUgZGVmYXVsdFZhbHVlID0gdGVtcGxhdGVBdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlKCk7CisJCQlpZiAoIWRlZmF1bHRWYWx1ZS5pc1ZhbGlkKCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGRlZmF1bHRWYWx1ZS5nZXRWYWx1ZVR5cGUoKS5pc0ZpbGVMaW5rKCkpIHsKKwkJCQlmaWxlTGlua3MuYWRkKGRlZmF1bHRWYWx1ZS5leHRyYWN0KCkpOworCQkJfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUuZ2V0VmFsdWVUeXBlKCkuaXNGaWxlTGlua1NlcXVlbmNlKCkpIHsKKwkJCQlmaWxlTGlua3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoKEZpbGVMaW5rW10pIGRlZmF1bHRWYWx1ZS5leHRyYWN0KCkpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVtcGxhdGUgYXR0cmlidXRlJ3MgdmFsdWUgdHlwZSBpcyBub3Qgb2YgdHlwZSBmaWxlIGxpbmsuIik7CisJCQl9CisKKwkJCXRlbXBsYXRlQXR0cmlidXRlRmlsZUxpbmtzLnB1dCh0ZW1wbGF0ZUF0dHJpYnV0ZSwgZGVmYXVsdFZhbHVlKTsKKwkJfQorCisJCWlmICghZmlsZUxpbmtzLmlzRW1wdHkoKSkgeworCQkJdXBsb2FkUGFyYWxsZWwoZmlsZUxpbmtzLCBwcm9ncmVzc0xpc3RlbmVyKTsKKwkJCS8vIHJlbW90ZSBwYXRocyBhdmFpbGFibGUgLT4gdXBkYXRlIHRlbXBsYXRlIGF0dHJpYnV0ZQorCQkJdGVtcGxhdGVBdHRyaWJ1dGVGaWxlTGlua3MuZm9yRWFjaCgodGEsIHYpIC0+IHRhLnNldERlZmF1bHRWYWx1ZSh2LmV4dHJhY3QoKSkpOworCQl9CisJfQorCisJLyoqCisJICogUGFyYWxsZWwgdXBsb2FkIG9mIGdpdmVuIHtAbGluayBGaWxlTGlua31zLiBMb2NhbCB7QGxpbmsgUGF0aH1zIGxpbmtlZAorCSAqIG11bHRpcGxlIHRpbWVzIGFyZSB1cGxvYWRlZCBvbmx5IG9uY2UuIFRoZSB1cGxvYWQgcHJvZ3Jlc3MgbWF5IGJlIHRyYWNlZCB3aXRoCisJICogYSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKgorCSAqIEBwYXJhbSBmaWxlTGlua3MgICAgICAgIENvbGxlY3Rpb24gb2Yge0Bjb2RlIEZpbGVMaW5rfXMgdG8gdXBsb2FkLgorCSAqIEBwYXJhbSBwcm9ncmVzc0xpc3RlbmVyIFRoZSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gdXBsb2FkIGZpbGVzLgorCSAqLworCXB1YmxpYyB2b2lkIHVwbG9hZFBhcmFsbGVsKENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcywgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlMaXN0PEZpbGVMaW5rPiBmaWx0ZXJlZCA9IHJldGFpbkZvclVwbG9hZChmaWxlTGlua3MpOworCQl0cnkgeworCQkJZmlsZVNlcnZpY2UudXBsb2FkUGFyYWxsZWwoZW50aXR5LCBmaWx0ZXJlZCwgcHJvZ3Jlc3NMaXN0ZW5lcik7CisJCX0gZmluYWxseSB7CisJCQlmaWx0ZXJlZC5zdHJlYW0oKS5maWx0ZXIoRmlsZUxpbms6OmlzUmVtb3RlKS5mb3JFYWNoKGZsIC0+IHsKKwkJCQlyZW1vdGVQYXRocy5wdXQoZmwuZ2V0TG9jYWxQYXRoKCksIGZsLmdldFJlbW90ZVBhdGgoKSk7CisJCQkJdXBsb2FkZWQuYWRkKGZsKTsKKwkJCX0pOworCQl9CisJfQorCisJLyoqCisJICogT25jZSB7QGxpbmsgI2NvbW1pdCgpfSBpcyBjYWxsZWQgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfXMgd2lsbCBiZSBkZWxldGVkIGZyb20KKwkgKiB0aGUgcmVtb3RlIHN0b3JhZ2UuCisJICoKKwkgKiBAcGFyYW0gZmlsZUxpbmtzIENvbGxlY3Rpb24gb2Yge0Bjb2RlIEZpbGVMaW5rfXMgdG8gZGVsZXRlLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFRvUmVtb3ZlKENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcykgeworCQl0b1JlbW92ZS5hZGRBbGwoZmlsZUxpbmtzKTsKKwl9CisKKwkvKioKKwkgKiBDb21taXRzIG1vZGlmaWNhdGlvbnMgb2YgZXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMuCisJICovCisJcHVibGljIHZvaWQgY29tbWl0KCkgeworCQlmaWxlU2VydmljZS5kZWxldGUoZW50aXR5LCB0b1JlbW92ZSk7CisJCXNjaGVkdWxlci5zaHV0ZG93bigpOworCX0KKworCS8qKgorCSAqIEFib3J0cyBtb2RpZmljYXRpb25zIG9mIGV4dGVybmFsbHkgbGlua2VkIGZpbGVzLgorCSAqLworCXB1YmxpYyB2b2lkIGFib3J0KCkgeworCQlmaWxlU2VydmljZS5kZWxldGUoZW50aXR5LCB1cGxvYWRlZCk7CisJCXVwbG9hZGVkLmZvckVhY2goZmwgLT4gZmwuc2V0UmVtb3RlUGF0aChudWxsKSk7CisJCXRlbXBsYXRlQXR0cmlidXRlRmlsZUxpbmtzLmZvckVhY2goKHRhLCB2KSAtPiB0YS5zZXREZWZhdWx0VmFsdWUodi5leHRyYWN0KCkpKTsKKwkJc2NoZWR1bGVyLnNodXRkb3duKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEZpbHRlcnMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfXMgYnkgcmVtb3ZpbmcgYWxyZWFkeSB1cGxvYWRlZCBvbmVzLgorCSAqCisJICogQHBhcmFtIGZpbGVMaW5rcyBXaWxsIGJlIGZpbHRlcmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgRmlsZUxpbmt9cyB3aGljaCBoYXZlIHRvIGJlIHVwbG9hZGVkLgorCSAqLworCXByaXZhdGUgTGlzdDxGaWxlTGluaz4gcmV0YWluRm9yVXBsb2FkKENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcykgeworCQlMaXN0PEZpbGVMaW5rPiBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3Q8PihmaWxlTGlua3MpOworCQlmb3IgKEZpbGVMaW5rIGZpbGVMaW5rIDogZmlsZUxpbmtzKSB7CisJCQlTdHJpbmcgcmVtb3RlUGF0aCA9IHJlbW90ZVBhdGhzLmdldChmaWxlTGluay5nZXRMb2NhbFBhdGgoKSk7CisJCQlpZiAocmVtb3RlUGF0aCAhPSBudWxsICYmICFyZW1vdGVQYXRoLmlzRW1wdHkoKSkgeworCQkJCWZpbGVMaW5rLnNldFJlbW90ZVBhdGgocmVtb3RlUGF0aCk7CisJCQkJZmlsdGVyZWQucmVtb3ZlKGZpbGVMaW5rKTsKKwkJCQl1cGxvYWRlZC5hZGQoZmlsZUxpbmspOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGZpbHRlcmVkOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL1dyaXRlUmVxdWVzdEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9Xcml0ZVJlcXVlc3RIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1YmY4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9Xcml0ZVJlcXVlc3RIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudHJhbnNhY3Rpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkRlZmF1bHRDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhLldyaXRlUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNDb252ZXJ0ZXI7CisKKy8qKgorICogV3JpdGVzIG1hc3MgZGF0YSBzcGVjaWZpZWQgaW4ge0BsaW5rIFdyaXRlUmVxdWVzdH1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV3JpdGVSZXF1ZXN0SGFuZGxlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFFX0xDX0FUVFJfSU5ERVBFTkRFTlQgPSAiSW5kZXBlbmRlbnRGbGFnIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUVfTENfQVRUUl9SRVBSRVNFTlRBVElPTiA9ICJTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUVfTENfQVRUUl9QQVJBTUVURVJTID0gIkdlbmVyYXRpb25QYXJhbWV0ZXJzIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUVfTENfQVRUUl9SQVdEQVRBVFlQRSA9ICJSYXdEYXRhdHlwZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFFX0xDX0FUVFJfQVhJU1RZUEUgPSAiYXhpc3R5cGUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRV9MQ19BVFRSX1ZBTFVFUyA9ICJWYWx1ZXMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRV9MQ19BVFRSX0ZMQUdTID0gIkZsYWdzIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUVfTENfQVRUUl9HTE9CQUxfRkxBRyA9ICJHbG9iYWxGbGFnIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIExpc3Q8Q29yZT4gY29yZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIEVudGl0eVR5cGUgbG9jYWxDb2x1bW5FbnRpdHlUeXBlOworCXByaXZhdGUgZmluYWwgSW5zZXJ0U3RhdGVtZW50IGluc2VydFN0YXRlbWVudDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB0cmFuc2FjdGlvbiBUaGUgb3duaW5nIHtAbGluayBPRFNUcmFuc2FjdGlvbn0uCisJICovCisJcHVibGljIFdyaXRlUmVxdWVzdEhhbmRsZXIoT0RTVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24pIHsKKwkJbG9jYWxDb2x1bW5FbnRpdHlUeXBlID0gdHJhbnNhY3Rpb24uZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZSgiTG9jYWxDb2x1bW4iKTsKKwkJaW5zZXJ0U3RhdGVtZW50ID0gbmV3IEluc2VydFN0YXRlbWVudCh0cmFuc2FjdGlvbiwgbG9jYWxDb2x1bW5FbnRpdHlUeXBlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBXcml0ZVJlcXVlc3R9IHRvIGJlIHByb2Nlc3NlZC4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAY29kZSBXcml0ZVJlcXVlc3R9LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFJlcXVlc3QoV3JpdGVSZXF1ZXN0IHdyaXRlUmVxdWVzdCkgeworCQljb3Jlcy5hZGQoY3JlYXRlQ29yZSh3cml0ZVJlcXVlc3QpKTsKKwl9CisKKwkvKioKKwkgKiBJbXBvcnRzIGdpdmVuIG1hc3MgZGF0YSBjb25maWd1cmF0aW9ucy4KKwkgKgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaWYgdGhlIGV4ZWN1dGlvbiBmYWlscy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBleGVjdXRpb24gZmFpbHMuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgIFRocm93biBpZiBhIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uIGZhaWxzLgorCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQW9FeGNlcHRpb24sIERhdGFBY2Nlc3NFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJaW5zZXJ0U3RhdGVtZW50LmV4ZWN1dGVXaXRoQ29yZXMoY29yZXMpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZWFkcyBnaXZlbiB7QGxpbmsgV3JpdGVSZXF1ZXN0fSBhbmQgcHJlcGFyZXMgYSBjb3JyZXNwb25kaW5nIHtAbGluayBDb3JlfQorCSAqIGZvciBpbXBvcnQuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSBtYXNzIGRhdGEgY29uZmlndXJhdGlvbi4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb3JlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIENvcmUgY3JlYXRlQ29yZShXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCUNvcmUgY29yZSA9IG5ldyBEZWZhdWx0Q29yZShsb2NhbENvbHVtbkVudGl0eVR5cGUpOworCisJCWNvcmUuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQod3JpdGVSZXF1ZXN0LmdldENoYW5uZWxHcm91cCgpKTsKKwkJY29yZS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQod3JpdGVSZXF1ZXN0LmdldENoYW5uZWwoKSk7CisKKwkJTWFwPFN0cmluZywgVmFsdWU+IHZhbHVlcyA9IGNvcmUuZ2V0VmFsdWVzKCk7CisJCXZhbHVlcy5nZXQoRW50aXR5LkFUVFJfTkFNRSkuc2V0KHdyaXRlUmVxdWVzdC5nZXRDaGFubmVsKCkuZ2V0TmFtZSgpKTsKKwkJdmFsdWVzLmdldChFbnRpdHkuQVRUUl9NSU1FVFlQRSkuc2V0KCJhcHBsaWNhdGlvbi94LWFzYW0uYW9sb2NhbGNvbHVtbiIpOworCQl2YWx1ZXMuZ2V0KEFFX0xDX0FUVFJfSU5ERVBFTkRFTlQpLnNldCgoc2hvcnQpICh3cml0ZVJlcXVlc3QuaXNJbmRlcGVuZGVudCgpID8gMSA6IDApKTsKKwkJdmFsdWVzLmdldChBRV9MQ19BVFRSX1JBV0RBVEFUWVBFKS5zZXQod3JpdGVSZXF1ZXN0LmdldFJhd1NjYWxhclR5cGUoKSk7CisJCXZhbHVlcy5nZXQoQUVfTENfQVRUUl9SRVBSRVNFTlRBVElPTikuc2V0KHdyaXRlUmVxdWVzdC5nZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCkpOworCQl2YWx1ZXMuZ2V0KEFFX0xDX0FUVFJfQVhJU1RZUEUpLnNldCh3cml0ZVJlcXVlc3QuZ2V0QXhpc1R5cGUoKSk7CisJCXZhbHVlcy5nZXQoQUVfTENfQVRUUl9QQVJBTUVURVJTKS5zZXQod3JpdGVSZXF1ZXN0LmdldEdlbmVyYXRpb25QYXJhbWV0ZXJzKCkpOworCisJCWlmICh3cml0ZVJlcXVlc3QuaGFzVmFsdWVzKCkpIHsKKwkJCVZhbHVlVHlwZTw/PiB2YWx1ZVR5cGUgPSB3cml0ZVJlcXVlc3QuZ2V0UmF3U2NhbGFyVHlwZSgpLnRvVmFsdWVUeXBlKCk7CisJCQlTdHJpbmcgdW5pdE5hbWUgPSB3cml0ZVJlcXVlc3QuZ2V0Q2hhbm5lbCgpLmdldFVuaXQoKS5nZXROYW1lKCk7CisJCQl2YWx1ZXMucHV0KEFFX0xDX0FUVFJfVkFMVUVTLAorCQkJCQl2YWx1ZVR5cGUuY3JlYXRlKEFFX0xDX0FUVFJfVkFMVUVTLCB1bml0TmFtZSwgdHJ1ZSwgd3JpdGVSZXF1ZXN0LmdldFZhbHVlcygpKSk7CisKKwkJCS8vIE9wZW5BVEZYIGlzc3VlOiBGb3IgImltcGxpY2l0IiBjb2x1bW5zLCBpZiBubyB2YWx1ZSBmb3IgdGhlCisJCQkvLyBHZW5lcmF0aW9uUGFyYW1ldGVycyBhdHRyaWJ1dGUgaXMgcHJlc2VudCwKKwkJCS8vIGl0IGlzIGF0dGVtcHRlZCB0byB0cmFuc2ZlciB0aGUgbG9jYWwgY29sdW1uIHZhbHVlcyAodGhyb3VnaCB3aGljaCB0aGUKKwkJCS8vIGdlbmVyYXRpb24gcGFyYW1ldGVycyBhcmUKKwkJCS8vIGF2YWlsYWJsZSBpbiB0aGVzZSBjYXNlcykgdG8gdGhlIEdlbmVyYXRpb25QYXJhbWV0ZXJzIGF0dHJpYnV0ZSB3aXRob3V0CisJCQkvLyBjb252ZXJ0aW5nIHRoZW0gdG8gdGhlCisJCQkvLyBjb3JyZWN0IERTX0RPVUJMRSBkYXRhIHR5cGUgZmlyc3QgKHVubGVzcyBpdCBpcyBhIERPVUJMRSBvciBMT05HIGNvbHVtbiksCisJCQkvLyByZXN1bHRpbmcgaW4gYW4gZXhjZXB0aW9uLgorCQkJLy8gSGVuY2UsIHN1cHBseSBjb3JyZWN0bHkgY29udmVydGVkIGdlbmVyYXRpb24gcGFyYW1ldGVycyBhcyBhIHdvcmthcm91bmQ6CisJCQlpZiAod3JpdGVSZXF1ZXN0LmdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKS5pc0ltcGxpY2l0KCkpIHsKKwkJCQlPYmplY3QgZ2VuUGFyYW1WYWx1ZXMgPSB3cml0ZVJlcXVlc3QuZ2V0VmFsdWVzKCk7CisJCQkJZG91YmxlW10gZ2VuUGFyYW1EID0gbmV3IGRvdWJsZVtBcnJheS5nZXRMZW5ndGgoZ2VuUGFyYW1WYWx1ZXMpXTsKKwkJCQlJbnRTdHJlYW0ucmFuZ2UoMCwgZ2VuUGFyYW1ELmxlbmd0aCkKKwkJCQkJCS5mb3JFYWNoKGkgLT4gZ2VuUGFyYW1EW2ldID0gKChOdW1iZXIpIEFycmF5LmdldChnZW5QYXJhbVZhbHVlcywgaSkpLmRvdWJsZVZhbHVlKCkpOworCQkJCXZhbHVlcy5nZXQoQUVfTENfQVRUUl9QQVJBTUVURVJTKS5zZXQoZ2VuUGFyYW1EKTsKKwkJCX0KKworCQkJLy8gZmxhZ3MKKwkJCWlmICh3cml0ZVJlcXVlc3QuYXJlQWxsVmFsaWQoKSkgeworCQkJCXZhbHVlcy5nZXQoQUVfTENfQVRUUl9HTE9CQUxfRkxBRykuc2V0KChzaG9ydCkgMTUpOworCQkJfSBlbHNlIHsKKwkJCQlzaG9ydFtdIGZsYWdzID0gT0RTQ29udmVydGVyLnRvT0RTVmFsaWRGbGFnU2VxKHdyaXRlUmVxdWVzdC5nZXRGbGFncygpKTsKKwkJCQl2YWx1ZXMuZ2V0KEFFX0xDX0FUVFJfRkxBR1MpLnNldChmbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAod3JpdGVSZXF1ZXN0Lmhhc0V4dGVybmFsQ29tcG9uZW50cygpKSB7CisJCQkvLyBUT0RPCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5PVCBZRVQgSU1QTEVNRU5URUQuIik7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJHaXZlbiB3cml0ZSByZXF1ZXN0IG5laXRoZXIgaGFzIG1lYXN1cmVkIHZhbHVlcyBub3IgZXh0ZXJuYWwgY29tcG9uZW50cyIpOworCQl9CisKKwkJcmV0dXJuIGNvcmU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdXRpbHMvT0RTQ29udmVydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdXRpbHMvT0RTQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlNDc4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDEyMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHM7CisKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlOworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXI7CitpbXBvcnQgamF2YS50aW1lLmZvcm1hdC5EYXRlVGltZUZvcm1hdHRlckJ1aWxkZXI7CitpbXBvcnQgamF2YS50aW1lLmZvcm1hdC5EYXRlVGltZVBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGltZS50ZW1wb3JhbC5DaHJvbm9GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5CbG9iOworaW1wb3J0IG9yZy5hc2FtLm9kcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuTmFtZVZhbHVlU2VxVW5pdDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVFNfVW5pb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRTX1VuaW9uU2VxOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UU19WYWx1ZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVFNfVmFsdWVTZXE7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfQ09NUExFWDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVF9EQ09NUExFWDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVF9FeHRlcm5hbFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRvdWJsZUNvbXBsZXg7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GbG9hdENvbXBsZXg7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVkVmFsdWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NaW1lVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLlJlYWRSZXF1ZXN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTQXR0cmlidXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHZhbHVlIGNvbnZlcnNpb25zIGZyb20vdG8gT0RTIHR5cGVzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgT0RTQ29udmVydGVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgRGF0ZVRpbWVGb3JtYXR0ZXI+IE9EU19EQVRFX0ZPUk1BVFRFUlMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlzdGF0aWMgeworCQlPRFNfREFURV9GT1JNQVRURVJTLnB1dCg0LAorCQkJCW5ldyBEYXRlVGltZUZvcm1hdHRlckJ1aWxkZXIoKS5hcHBlbmRQYXR0ZXJuKCJ5eXl5IikucGFyc2VEZWZhdWx0aW5nKENocm9ub0ZpZWxkLk1PTlRIX09GX1lFQVIsIDEpCisJCQkJCQkucGFyc2VEZWZhdWx0aW5nKENocm9ub0ZpZWxkLkRBWV9PRl9NT05USCwgMSkudG9Gb3JtYXR0ZXIoKSk7CisJCU9EU19EQVRFX0ZPUk1BVFRFUlMucHV0KDYsIG5ldyBEYXRlVGltZUZvcm1hdHRlckJ1aWxkZXIoKS5hcHBlbmRQYXR0ZXJuKCJ5eXl5TU0iKQorCQkJCS5wYXJzZURlZmF1bHRpbmcoQ2hyb25vRmllbGQuREFZX09GX01PTlRILCAxKS50b0Zvcm1hdHRlcigpKTsKKwkJT0RTX0RBVEVfRk9STUFUVEVSUy5wdXQoOCwgRGF0ZVRpbWVGb3JtYXR0ZXIub2ZQYXR0ZXJuKCJ5eXl5TU1kZCIpKTsKKwkJT0RTX0RBVEVfRk9STUFUVEVSUy5wdXQoMTAsIERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybigieXl5eU1NZGRISCIpKTsKKwkJT0RTX0RBVEVfRk9STUFUVEVSUy5wdXQoMTIsIERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybigieXl5eU1NZGRISG1tIikpOworCQlPRFNfREFURV9GT1JNQVRURVJTLnB1dCgxNCwgRGF0ZVRpbWVGb3JtYXR0ZXIub2ZQYXR0ZXJuKCJ5eXl5TU1kZEhIbW1zcyIpKTsKKwkJLyoKKwkJICogSkRLLTgwMzEwODU6IERhdGVUaW1lRm9ybWF0dGVyIHdvbid0IHBhcnNlIGRhdGVzIHdpdGggY3VzdG9tIGZvcm1hdAorCQkgKiAieXl5eU1NZGRISG1tc3NTU1MiCisJCSAqIAorCQkgKiBAc2VlIGh0dHA6Ly9idWdzLmphdmEuY29tL2J1Z2RhdGFiYXNlL3ZpZXdfYnVnLmRvP2J1Z19pZD04MDMxMDg1CisJCSAqLworCQlPRFNfREFURV9GT1JNQVRURVJTLnB1dCgxNywgbmV3IERhdGVUaW1lRm9ybWF0dGVyQnVpbGRlcigpLmFwcGVuZFBhdHRlcm4oInl5eXlNTWRkSEhtbXNzIikKKwkJCQkuYXBwZW5kVmFsdWUoQ2hyb25vRmllbGQuTUlMTElfT0ZfU0VDT05ELCAzKS50b0Zvcm1hdHRlcigpKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICovCisJcHJpdmF0ZSBPRFNDb252ZXJ0ZXIoKSB7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnZlcnNpb24gbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBUU19WYWx1ZVNlcX0gdG8ge0BsaW5rIFZhbHVlfXMuCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlICAgVGhlIHtAbGluayBBdHRyaWJ1dGV9LgorCSAqIEBwYXJhbSBhZ2dyZWdhdGlvbiBUaGUge0BsaW5rIEFnZ3JlZ2F0aW9ufSB1c2VkIHdoZW4gdGhlIHZhbHVlcyB3ZXJlCisJICogICAgICAgICAgICAgICAgICAgIG9idGFpbmVkLgorCSAqIEBwYXJhbSB1bml0ICAgICAgICBUaGUgdW5pdCBuYW1lLgorCSAqIEBwYXJhbSBvZHNWYWx1ZVNlcSBUaGUge0Bjb2RlIFRTX1ZhbHVlU2VxfS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFZhbHVlfXMgYXJlIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gb24gY29udmVyc2lvbiBlcnJvcnMuCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PFZhbHVlPiBmcm9tT0RTVmFsdWVTZXEoQXR0cmlidXRlIGF0dHJpYnV0ZSwgQWdncmVnYXRpb24gYWdncmVnYXRpb24sIFN0cmluZyB1bml0LAorCQkJVFNfVmFsdWVTZXEgb2RzVmFsdWVTZXEpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJRGF0YVR5cGUgZGF0YVR5cGUgPSBvZHNWYWx1ZVNlcS51LmRpc2NyaW1pbmF0b3IoKTsKKwkJc2hvcnRbXSBmbGFncyA9IG9kc1ZhbHVlU2VxLmZsYWc7CisJCUxpc3Q8VmFsdWU+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PihmbGFncy5sZW5ndGgpOworCisJCWlmICgoKE9EU0F0dHJpYnV0ZSkgYXR0cmlidXRlKS5pc0lkQXR0cmlidXRlKCkgJiYgU2V0cworCQkJCS5pbW11dGFibGVFbnVtU2V0KEFnZ3JlZ2F0aW9uLk1JTklNVU0sIEFnZ3JlZ2F0aW9uLk1BWElNVU0sIEFnZ3JlZ2F0aW9uLkRJU1RJTkNULCBBZ2dyZWdhdGlvbi5OT05FKQorCQkJCS5jb250YWlucyhhZ2dyZWdhdGlvbikpIHsKKwkJCWlmIChEYXRhVHlwZS5EVF9MT05HTE9ORyA9PSBkYXRhVHlwZSkgeworCQkJCVRfTE9OR0xPTkdbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51Lmxvbmdsb25nVmFsKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIERhdGFUeXBlLkRUX1NUUklORywgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQkJTG9uZy50b1N0cmluZyhmcm9tT0RTTG9uZyhvZHNWYWx1ZXNbaV0pKSkpOworCQkJCX0KKwkJCQlyZXR1cm4gdmFsdWVzOworCQkJfSBlbHNlIGlmIChEYXRhVHlwZS5EU19MT05HTE9ORyA9PSBkYXRhVHlwZSkgeworCQkJCVRfTE9OR0xPTkdbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUubG9uZ2xvbmdTZXEoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgRGF0YVR5cGUuRFNfU1RSSU5HLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCQl0b1N0cmluZyhvZHNWYWx1ZXNbaV0pKSk7CisJCQkJfQorCQkJCXJldHVybiB2YWx1ZXM7CisJCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0xPTkcgPT0gZGF0YVR5cGUpIHsKKwkJCQlpbnRbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmxvbmdWYWwoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgRGF0YVR5cGUuRFRfU1RSSU5HLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKG9kc1ZhbHVlc1tpXSkpKTsKKwkJCQl9CisJCQkJcmV0dXJuIHZhbHVlczsKKwkJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfTE9ORyA9PSBkYXRhVHlwZSkgeworCQkJCWludFtdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5sb25nU2VxKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIERhdGFUeXBlLkRTX1NUUklORywgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQkJdG9TdHJpbmcob2RzVmFsdWVzW2ldKSkpOworCQkJCX0KKwkJCQlyZXR1cm4gdmFsdWVzOworCQkJfQorCQl9CisKKwkJaWYgKERhdGFUeXBlLkRUX1NUUklORyA9PSBkYXRhVHlwZSkgeworCQkJU3RyaW5nW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5zdHJpbmdWYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfU1RSSU5HID09IGRhdGFUeXBlKSB7CisJCQlTdHJpbmdbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuc3RyaW5nU2VxKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0RBVEUgPT0gZGF0YVR5cGUpIHsKKwkJCVN0cmluZ1tdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuZGF0ZVZhbCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoCisJCQkJCQljcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIGZyb21PRFNEYXRlKG9kc1ZhbHVlc1tpXSkpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EU19EQVRFID09IGRhdGFUeXBlKSB7CisJCQlTdHJpbmdbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuZGF0ZVNlcSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LAorCQkJCQkJZnJvbU9EU0RhdGVTZXEob2RzVmFsdWVzW2ldKSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0JPT0xFQU4gPT0gZGF0YVR5cGUpIHsKKwkJCWJvb2xlYW5bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmJvb2xlYW5WYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfQk9PTEVBTiA9PSBkYXRhVHlwZSkgeworCQkJYm9vbGVhbltdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5ib29sZWFuU2VxKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0JZVEUgPT0gZGF0YVR5cGUpIHsKKwkJCWJ5dGVbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmJ5dGVWYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfQllURSA9PSBkYXRhVHlwZSkgeworCQkJYnl0ZVtdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5ieXRlU2VxKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX1NIT1JUID09IGRhdGFUeXBlKSB7CisJCQlzaG9ydFtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuc2hvcnRWYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfU0hPUlQgPT0gZGF0YVR5cGUpIHsKKwkJCXNob3J0W11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LnNob3J0U2VxKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0xPTkcgPT0gZGF0YVR5cGUpIHsKKwkJCWludFtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUubG9uZ1ZhbCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EU19MT05HID09IGRhdGFUeXBlKSB7CisJCQlpbnRbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUubG9uZ1NlcSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9MT05HTE9ORyA9PSBkYXRhVHlwZSkgeworCQkJVF9MT05HTE9OR1tdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUubG9uZ2xvbmdWYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKAorCQkJCQkJY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBmcm9tT0RTTG9uZyhvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfTE9OR0xPTkcgPT0gZGF0YVR5cGUpIHsKKwkJCVRfTE9OR0xPTkdbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUubG9uZ2xvbmdTZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCWZyb21PRFNMb25nU2VxKG9kc1ZhbHVlc1tpXSkpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9GTE9BVCA9PSBkYXRhVHlwZSkgeworCQkJZmxvYXRbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmZsb2F0VmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX0ZMT0FUID09IGRhdGFUeXBlKSB7CisJCQlmbG9hdFtdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5mbG9hdFNlcSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9ET1VCTEUgPT0gZGF0YVR5cGUpIHsKKwkJCWRvdWJsZVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuZG91YmxlVmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX0RPVUJMRSA9PSBkYXRhVHlwZSkgeworCQkJZG91YmxlW11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmRvdWJsZVNlcSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9CWVRFU1RSID09IGRhdGFUeXBlKSB7CisJCQlieXRlW11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmJ5dGVzdHJWYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfQllURVNUUiA9PSBkYXRhVHlwZSkgeworCQkJYnl0ZVtdW11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmJ5dGVzdHJTZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfQ09NUExFWCA9PSBkYXRhVHlwZSkgeworCQkJVF9DT01QTEVYW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5jb21wbGV4VmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQlmcm9tT0RTRmxvYXRDb21wbGV4KG9kc1ZhbHVlc1tpXSkpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EU19DT01QTEVYID09IGRhdGFUeXBlKSB7CisJCQlUX0NPTVBMRVhbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuY29tcGxleFNlcSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LAorCQkJCQkJZnJvbU9EU0Zsb2F0Q29tcGxleFNlcShvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfRENPTVBMRVggPT0gZGF0YVR5cGUpIHsKKwkJCVRfRENPTVBMRVhbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmRjb21wbGV4VmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQlmcm9tT0RTRG91YmxlQ29tcGxleChvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfRENPTVBMRVggPT0gZGF0YVR5cGUpIHsKKwkJCVRfRENPTVBMRVhbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuZGNvbXBsZXhTZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCWZyb21PRFNEb3VibGVDb21wbGV4U2VxKG9kc1ZhbHVlc1tpXSkpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9FTlVNID09IGRhdGFUeXBlKSB7CisJCQlpbnRbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmVudW1WYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCU9EU0VudW1lcmF0aW9ucy5mcm9tT0RTRW51bShhdHRyaWJ1dGUuZ2V0RW51bU9iaigpLCBvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfRU5VTSA9PSBkYXRhVHlwZSkgeworCQkJaW50W11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmVudW1TZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCU9EU0VudW1lcmF0aW9ucy5mcm9tT0RTRW51bVNlcShhdHRyaWJ1dGUuZ2V0RW51bU9iaigpLCBvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfRVhURVJOQUxSRUZFUkVOQ0UgPT0gZGF0YVR5cGUpIHsKKwkJCVRfRXh0ZXJuYWxSZWZlcmVuY2VbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmV4dFJlZlZhbCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LAorCQkJCQkJZnJvbU9EU0V4dGVybmFsUmVmZXJlbmNlKG9kc1ZhbHVlc1tpXSkpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EU19FWFRFUk5BTFJFRkVSRU5DRSA9PSBkYXRhVHlwZSkgeworCQkJVF9FeHRlcm5hbFJlZmVyZW5jZVtdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5leHRSZWZTZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCWZyb21PRFNFeHRlcm5hbFJlZmVyZW5jZVNlcShvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfQkxPQiA9PSBkYXRhVHlwZSkgeworCQkJQmxvYltdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuYmxvYlZhbCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoCisJCQkJCQljcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIGZyb21PRFNCbG9iKG9kc1ZhbHVlc1tpXSkpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJDb252ZXJzaW9uIGZvciBPRFMgZGF0YSB0eXBlICciICsgZGF0YVR5cGUudG9TdHJpbmcoKSArICInIGRvZXMgbm90IGV4aXN0LiIpOworCQl9CisKKwkJcmV0dXJuIHZhbHVlczsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEge0BsaW5rIFZhbHVlfSBmcm9tIHRoZSBpbnB1dC4KKwkgKiAKKwkgKiBAcGFyYW0gYXR0cmlidXRlICAgVGhlIHtAbGluayBBdHRyaWJ1dGV9CisJICogQHBhcmFtIGFnZ3JlZ2F0aW9uIFRoZSB7QGxpbmsgQWdncmVnYXRpb259IHVzZWQgd2hlbiB0aGUgaW5wdXQgdmFsdWVzIHdlcmUKKwkgKiAgICAgICAgICAgICAgICAgICAgb2J0YWluZWQKKwkgKiBAcGFyYW0gZGF0YVR5cGUgICAgVGhlIHtAbGluayBEYXRhVHlwZX0gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCB2YWx1ZSwKKwkgKiAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkIG9ubHkgaWYgYWdncmVnYXRpb24gIT0ge0Bjb2RlIEFnZ3JlZ2F0aW9uLk5PTkV9LAorCSAqICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgdGhhdCBvZiB0aGUgYXR0cmlidXRlIGlzIHVzZWQKKwkgKiBAcGFyYW0gdW5pdCAgICAgICAgVGhlIHVuaXQgb2YgdGhlIGlucHV0IHZhbHVlCisJICogQHBhcmFtIHZhbGlkICAgICAgIFRoZSB2YWxpZGl0eSBmbGFnIG9mIHRoZSBpbnB1dCB2YWx1ZQorCSAqIEBwYXJhbSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdmFsdWUKKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVmFsdWV9IGNyZWF0ZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVmFsdWUgY3JlYXRlVmFsdWUoQXR0cmlidXRlIGF0dHJpYnV0ZSwgQWdncmVnYXRpb24gYWdncmVnYXRpb24sIERhdGFUeXBlIGRhdGFUeXBlLCBTdHJpbmcgdW5pdCwKKwkJCWJvb2xlYW4gdmFsaWQsIE9iamVjdCBpbnB1dCkgeworCQlpZiAoQWdncmVnYXRpb24uTk9ORSA9PSBhZ2dyZWdhdGlvbikgeworCQkJcmV0dXJuIGF0dHJpYnV0ZS5jcmVhdGVWYWx1ZSh1bml0LCB2YWxpZCwgaW5wdXQpOworCQl9IGVsc2UgeworCQkJVmFsdWVUeXBlPD8+IHZhbHVlVHlwZSA9IE9EU1V0aWxzLlZBTFVFVFlQRVMuaW52ZXJzZSgpLmdldChkYXRhVHlwZSk7CisJCQlpZiAodmFsdWVUeXBlLmlzRW51bWVyYXRpb25UeXBlKCkgJiYgYXR0cmlidXRlLmdldFZhbHVlVHlwZSgpLmlzRW51bWVyYXRpb25UeXBlKCkKKwkJCQkJJiYgU2V0cy5pbW11dGFibGVFbnVtU2V0KEFnZ3JlZ2F0aW9uLk1JTklNVU0sIEFnZ3JlZ2F0aW9uLk1BWElNVU0sIEFnZ3JlZ2F0aW9uLkRJU1RJTkNUKQorCQkJCQkJCS5jb250YWlucyhhZ2dyZWdhdGlvbikpIHsKKwkJCQlyZXR1cm4gdmFsdWVUeXBlLmNyZWF0ZShnZXRDb2x1bW5OYW1lKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24pLCB1bml0LCB2YWxpZCwgaW5wdXQsCisJCQkJCQlhdHRyaWJ1dGUuZ2V0RW51bU9iaigpLmdldE5hbWUoKSk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB2YWx1ZVR5cGUuY3JlYXRlKGdldENvbHVtbk5hbWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiksIHVuaXQsIHZhbGlkLCBpbnB1dCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aCBpdHMgYXBwbGllZCBhZ2dyZWdhdGlvbiBhcyByZXR1cm5lZCBieQorCSAqIHRoZSBPRFMgU2VydmVyLCBmb3IgZXhhbXBsZTogTUFYSU1VTShzb3J0SW5kZXgpCisJICogCisJICogQHBhcmFtIGF0dHJpYnV0ZQorCSAqIEBwYXJhbSBhZ2dyZWdhdGlvbgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBhcHBsaWVkIGFnZ3JhZ2F0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShBdHRyaWJ1dGUgYXR0cmlidXRlLCBBZ2dyZWdhdGlvbiBhZ2dyZWdhdGlvbikgeworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMoJXMpIiwgYWdncmVnYXRpb24ubmFtZSgpLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0b1N0cmluZyhpbnRbXSBvZHNWYWx1ZXMpIHsKKwkJcmV0dXJuIEludFN0cmVhbS5vZihvZHNWYWx1ZXMpLm1hcFRvT2JqKEludGVnZXI6OnRvU3RyaW5nKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRvU3RyaW5nKFRfTE9OR0xPTkdbXSBvZHNWYWx1ZXMpIHsKKwkJcmV0dXJuIFN0cmVhbS5vZihvZHNWYWx1ZXMpLm1hcChsIC0+IExvbmcudG9TdHJpbmcoZnJvbU9EU0xvbmcobCkpKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBWYWx1ZX1zIHRvIHtAbGluayBUU19WYWx1ZVNlcX0uCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgVmFsdWV9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRTX1ZhbHVlU2VxfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIG9uIGNvbnZlcnNpb24gZXJyb3JzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVFNfVmFsdWVTZXEgdG9PRFNWYWx1ZVNlcShBdHRyaWJ1dGUgYXR0cmlidXRlLCBMaXN0PFZhbHVlPiB2YWx1ZXMpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJaW50IHNpemUgPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMuc2l6ZSgpOworCQlzaG9ydFtdIGZsYWdzID0gbmV3IHNob3J0W3NpemVdOworCisJCVRTX1ZhbHVlU2VxIG9kc1ZhbHVlU2VxID0gbmV3IFRTX1ZhbHVlU2VxKG5ldyBUU19VbmlvblNlcSgpLCBmbGFncyk7CisJCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCBzaXplIDwgMSkgeworCQkJb2RzVmFsdWVTZXEudS5fZGVmYXVsdCgpOworCQkJcmV0dXJuIG9kc1ZhbHVlU2VxOworCQl9CisKKwkJVmFsdWVUeXBlPD8+IHR5cGUgPSB2YWx1ZXMuZ2V0KDApLmdldFZhbHVlVHlwZSgpOworCQlpZiAoVmFsdWVUeXBlLlNUUklORyA9PSB0eXBlKSB7CisJCQlTdHJpbmdbXSBvZHNWYWx1ZXMgPSBuZXcgU3RyaW5nW3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCWlmICgoKE9EU0F0dHJpYnV0ZSkgYXR0cmlidXRlKS5pc0lkQXR0cmlidXRlKCkpIHsKKwkJCQlvZHNWYWx1ZVNlcS51Lmxvbmdsb25nVmFsKHRvTG9uZ0xvbmcob2RzVmFsdWVzKSk7CisJCQl9IGVsc2UgeworCQkJCW9kc1ZhbHVlU2VxLnUuc3RyaW5nVmFsKG9kc1ZhbHVlcyk7CisJCQl9CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLlNUUklOR19TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlTdHJpbmdbXVtdIG9kc1ZhbHVlcyA9IG5ldyBTdHJpbmdbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlpZiAoKChPRFNBdHRyaWJ1dGUpIGF0dHJpYnV0ZSkuaXNJZEF0dHJpYnV0ZSgpKSB7CisJCQkJb2RzVmFsdWVTZXEudS5sb25nbG9uZ1NlcSh0b0xvbmdMb25nU2VxKG9kc1ZhbHVlcykpOworCQkJfSBlbHNlIHsKKwkJCQlvZHNWYWx1ZVNlcS51LnN0cmluZ1NlcShvZHNWYWx1ZXMpOworCQkJfQorCisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkRBVEUgPT0gdHlwZSkgeworCQkJU3RyaW5nW10gb2RzVmFsdWVzID0gbmV3IFN0cmluZ1tzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHRvT0RTRGF0ZSh2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5kYXRlVmFsKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkRBVEVfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJU3RyaW5nW11bXSBvZHNWYWx1ZXMgPSBuZXcgU3RyaW5nW3NpemVdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB0b09EU0RhdGVTZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZGF0ZVNlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5CT09MRUFOID09IHR5cGUpIHsKKwkJCWJvb2xlYW5bXSBvZHNWYWx1ZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuYm9vbGVhblZhbChvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5CT09MRUFOX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCWJvb2xlYW5bXVtdIG9kc1ZhbHVlcyA9IG5ldyBib29sZWFuW3NpemVdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmJvb2xlYW5TZXEob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQllURSA9PSB0eXBlKSB7CisJCQlieXRlW10gb2RzVmFsdWVzID0gbmV3IGJ5dGVbc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmJ5dGVWYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQllURV9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlieXRlW11bXSBvZHNWYWx1ZXMgPSBuZXcgYnl0ZVtzaXplXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5ieXRlU2VxKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLlNIT1JUID09IHR5cGUpIHsKKwkJCXNob3J0W10gb2RzVmFsdWVzID0gbmV3IHNob3J0W3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5zaG9ydFZhbChvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5TSE9SVF9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlzaG9ydFtdW10gb2RzVmFsdWVzID0gbmV3IHNob3J0W3NpemVdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LnNob3J0U2VxKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLklOVEVHRVIgPT0gdHlwZSkgeworCQkJaW50W10gb2RzVmFsdWVzID0gbmV3IGludFtzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUubG9uZ1ZhbChvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5JTlRFR0VSX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCWludFtdW10gb2RzVmFsdWVzID0gbmV3IGludFtzaXplXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5sb25nU2VxKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkxPTkcgPT0gdHlwZSkgeworCQkJVF9MT05HTE9OR1tdIG9kc1ZhbHVlcyA9IG5ldyBUX0xPTkdMT05HW3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdG9PRFNMb25nKHZhbHVlLmV4dHJhY3QoKSk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51Lmxvbmdsb25nVmFsKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkxPTkdfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJVF9MT05HTE9OR1tdW10gb2RzVmFsdWVzID0gbmV3IFRfTE9OR0xPTkdbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHRvT0RTTG9uZ1NlcSh2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5sb25nbG9uZ1NlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5GTE9BVCA9PSB0eXBlKSB7CisJCQlmbG9hdFtdIG9kc1ZhbHVlcyA9IG5ldyBmbG9hdFtzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZmxvYXRWYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRkxPQVRfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJZmxvYXRbXVtdIG9kc1ZhbHVlcyA9IG5ldyBmbG9hdFtzaXplXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5mbG9hdFNlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5ET1VCTEUgPT0gdHlwZSkgeworCQkJZG91YmxlW10gb2RzVmFsdWVzID0gbmV3IGRvdWJsZVtzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZG91YmxlVmFsKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkRPVUJMRV9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlkb3VibGVbXVtdIG9kc1ZhbHVlcyA9IG5ldyBkb3VibGVbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZG91YmxlU2VxKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJZVEVfU1RSRUFNID09IHR5cGUpIHsKKwkJCWJ5dGVbXVtdIG9kc1ZhbHVlcyA9IG5ldyBieXRlW3NpemVdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmJ5dGVzdHJWYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQllURV9TVFJFQU1fU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJYnl0ZVtdW11bXSBvZHNWYWx1ZXMgPSBuZXcgYnl0ZVtzaXplXVtdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmJ5dGVzdHJTZXEob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRkxPQVRfQ09NUExFWCA9PSB0eXBlKSB7CisJCQlUX0NPTVBMRVhbXSBvZHNWYWx1ZXMgPSBuZXcgVF9DT01QTEVYW3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdG9PRFNGbG9hdENvbXBsZXgodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuY29tcGxleFZhbChvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5GTE9BVF9DT01QTEVYX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCVRfQ09NUExFWFtdW10gb2RzVmFsdWVzID0gbmV3IFRfQ09NUExFWFtzaXplXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdG9PRFNGbG9hdENvbXBsZXhTZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuY29tcGxleFNlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5ET1VCTEVfQ09NUExFWCA9PSB0eXBlKSB7CisJCQlUX0RDT01QTEVYW10gb2RzVmFsdWVzID0gbmV3IFRfRENPTVBMRVhbc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB0b09EU0RvdWJsZUNvbXBsZXgodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZGNvbXBsZXhWYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJVF9EQ09NUExFWFtdW10gb2RzVmFsdWVzID0gbmV3IFRfRENPTVBMRVhbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHRvT0RTRG91YmxlQ29tcGxleFNlcSh2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5kY29tcGxleFNlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5FTlVNRVJBVElPTiA9PSB0eXBlKSB7CisJCQlpbnRbXSBvZHNWYWx1ZXMgPSBuZXcgaW50W3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gT0RTRW51bWVyYXRpb25zLnRvT0RTRW51bSh2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5lbnVtVmFsKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkVOVU1FUkFUSU9OX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCWludFtdW10gb2RzVmFsdWVzID0gbmV3IGludFtzaXplXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gT0RTRW51bWVyYXRpb25zLnRvT0RTRW51bVNlcSh2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5lbnVtU2VxKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkZJTEVfTElOSyA9PSB0eXBlKSB7CisJCQlUX0V4dGVybmFsUmVmZXJlbmNlW10gb2RzVmFsdWVzID0gbmV3IFRfRXh0ZXJuYWxSZWZlcmVuY2Vbc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB0b09EU0V4dGVybmFsUmVmZXJlbmNlKHZhbHVlLmV4dHJhY3QoKSk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmV4dFJlZlZhbChvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5GSUxFX0xJTktfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJVF9FeHRlcm5hbFJlZmVyZW5jZVtdW10gb2RzVmFsdWVzID0gbmV3IFRfRXh0ZXJuYWxSZWZlcmVuY2Vbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHRvT0RTRXh0ZXJuYWxSZWZlcmVuY2VTZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZXh0UmVmU2VxKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJMT0IgPT0gdHlwZSkgeworCQkJQmxvYltdIG9kc1ZhbHVlcyA9IG5ldyBCbG9iW3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdG9PRFNCbG9iKHZhbHVlLmV4dHJhY3QoKSk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmJsb2JWYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJNYXBwaW5nIGZvciB2YWx1ZSB0eXBlICciICsgdHlwZSArICInIGRvZXMgbm90IGV4aXN0LiIpOworCQl9CisKKwkJcmV0dXJuIG9kc1ZhbHVlU2VxOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHR3byBkaW1lbnNpb25hbCBTdHJpbmcgYXJyYXkgdG8gdHdvIGRpbWVuc2lvbmFsCisJICoge0BsaW5rIFRfTE9OR0xPTkd9IGFycmF5LgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgU3RyaW5nIGFycmF5LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGxpbmsgVF9MT05HTE9OR30gYXJyYXkuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVF9MT05HTE9OR1tdW10gdG9Mb25nTG9uZ1NlcShTdHJpbmdbXVtdIHZhbHVlKSB7CisKKwkJcmV0dXJuIFN0cmVhbS5vZih2YWx1ZSkubWFwKE9EU0NvbnZlcnRlcjo6dG9Mb25nTG9uZykudG9BcnJheShUX0xPTkdMT05HW11bXTo6bmV3KTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBTdHJpbmcgYXJyYXkgdG8ge0BsaW5rIFRfTE9OR0xPTkd9IGFycmF5LgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgU3RyaW5nIGFycmF5LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGxpbmsgVF9MT05HTE9OR30gYXJyYXkuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVF9MT05HTE9OR1tdIHRvTG9uZ0xvbmcoU3RyaW5nW10gdmFsdWUpIHsKKwkJcmV0dXJuIFN0cmVhbS5vZih2YWx1ZSkubWFwKHMgLT4gdG9PRFNJRChzKSkudG9BcnJheShUX0xPTkdMT05HW106Om5ldyk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIE5hbWVWYWx1ZVNlcVVuaXRbXX0gdG8ge0BsaW5rIE1lYXN1cmVkVmFsdWVzfXMuCisJICoKKwkgKiBAcGFyYW0gb2RzTWVhc3VyZWRWYWx1ZXNTZXEgVGhlIHtAY29kZSBOYW1lVmFsdWVTZXFVbml0fXMuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBNZWFzdXJlZFZhbHVlc31zIGFyZSByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIG9uIGNvbnZlcnNpb24gZXJyb3JzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxNZWFzdXJlZFZhbHVlcz4gZnJvbU9EU01lYXN1cmVkVmFsdWVzU2VxKE5hbWVWYWx1ZVNlcVVuaXRbXSBvZHNNZWFzdXJlZFZhbHVlc1NlcSwKKwkJCVJlYWRSZXF1ZXN0SGFuZGxlci5Db2x1bW5BdHRyaWJ1dGVzW10gY29sdW1uQXR0cmlidXRlc0FycmF5KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8TWVhc3VyZWRWYWx1ZXM+IG1lYXN1cmVkVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KG9kc01lYXN1cmVkVmFsdWVzU2VxLmxlbmd0aCk7CisKKwkJTWFwPFN0cmluZywgUmVhZFJlcXVlc3RIYW5kbGVyLkNvbHVtbkF0dHJpYnV0ZXM+IG1hcENvbHVtbkF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWlmIChudWxsICE9IGNvbHVtbkF0dHJpYnV0ZXNBcnJheSkgeworCQkJQXJyYXlzLnN0cmVhbShjb2x1bW5BdHRyaWJ1dGVzQXJyYXkpLmZvckVhY2goY2EgLT4gbWFwQ29sdW1uQXR0cmlidXRlcy5wdXQoY2EuZ2V0TmFtZSgpLCBjYSkpOworCQl9CisKKwkJZm9yIChOYW1lVmFsdWVTZXFVbml0IG9kc01lYXN1cmVkVmFsdWVzIDogb2RzTWVhc3VyZWRWYWx1ZXNTZXEpIHsKKwkJCW1lYXN1cmVkVmFsdWVzCisJCQkJCS5hZGQoZnJvbU9EU01lYXN1cmVkVmFsdWVzKG9kc01lYXN1cmVkVmFsdWVzLCBtYXBDb2x1bW5BdHRyaWJ1dGVzLmdldChvZHNNZWFzdXJlZFZhbHVlcy52YWxOYW1lKSkpOworCQl9CisKKwkJcmV0dXJuIG1lYXN1cmVkVmFsdWVzOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBOYW1lVmFsdWVTZXFVbml0fSB0byB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9LgorCSAqCisJICogQHBhcmFtIG9kc01lYXN1cmVkVmFsdWVzIFRoZSB7QGNvZGUgTmFtZVZhbHVlU2VxVW5pdH0uCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBNZWFzdXJlZFZhbHVlc30gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBvbiBjb252ZXJzaW9uIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBNZWFzdXJlZFZhbHVlcyBmcm9tT0RTTWVhc3VyZWRWYWx1ZXMoTmFtZVZhbHVlU2VxVW5pdCBvZHNNZWFzdXJlZFZhbHVlcywKKwkJCVJlYWRSZXF1ZXN0SGFuZGxlci5Db2x1bW5BdHRyaWJ1dGVzIGNvbHVtbkF0dHJpYnV0ZXMpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJVFNfVmFsdWVTZXEgb2RzVmFsdWVTZXEgPSBvZHNNZWFzdXJlZFZhbHVlcy52YWx1ZTsKKwkJRGF0YVR5cGUgZGF0YVR5cGUgPSBvZHNWYWx1ZVNlcS51LmRpc2NyaW1pbmF0b3IoKTsKKwkJU2NhbGFyVHlwZSBzY2FsYXJUeXBlOworCQlPYmplY3QgdmFsdWVzOworCisJCWlmIChEYXRhVHlwZS5EVF9TVFJJTkcgPT0gZGF0YVR5cGUpIHsKKwkJCXNjYWxhclR5cGUgPSBTY2FsYXJUeXBlLlNUUklORzsKKwkJCXZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuc3RyaW5nVmFsKCk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfREFURSA9PSBkYXRhVHlwZSkgeworCQkJc2NhbGFyVHlwZSA9IFNjYWxhclR5cGUuREFURTsKKwkJCXZhbHVlcyA9IGZyb21PRFNEYXRlU2VxKG9kc1ZhbHVlU2VxLnUuZGF0ZVZhbCgpKTsKKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9CT09MRUFOID09IGRhdGFUeXBlKSB7CisJCQlzY2FsYXJUeXBlID0gU2NhbGFyVHlwZS5CT09MRUFOOworCQkJdmFsdWVzID0gb2RzVmFsdWVTZXEudS5ib29sZWFuVmFsKCk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfQllURSA9PSBkYXRhVHlwZSkgeworCQkJc2NhbGFyVHlwZSA9IFNjYWxhclR5cGUuQllURTsKKwkJCXZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuYnl0ZVZhbCgpOworCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX1NIT1JUID09IGRhdGFUeXBlKSB7CisJCQlzY2FsYXJUeXBlID0gU2NhbGFyVHlwZS5TSE9SVDsKKwkJCXZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuc2hvcnRWYWwoKTsKKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9MT05HID09IGRhdGFUeXBlKSB7CisJCQlzY2FsYXJUeXBlID0gU2NhbGFyVHlwZS5JTlRFR0VSOworCQkJdmFsdWVzID0gb2RzVmFsdWVTZXEudS5sb25nVmFsKCk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfTE9OR0xPTkcgPT0gZGF0YVR5cGUpIHsKKwkJCXNjYWxhclR5cGUgPSBTY2FsYXJUeXBlLkxPTkc7CisJCQl2YWx1ZXMgPSBmcm9tT0RTTG9uZ1NlcShvZHNWYWx1ZVNlcS51Lmxvbmdsb25nVmFsKCkpOworCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0ZMT0FUID09IGRhdGFUeXBlKSB7CisJCQlzY2FsYXJUeXBlID0gU2NhbGFyVHlwZS5GTE9BVDsKKwkJCXZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuZmxvYXRWYWwoKTsKKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9ET1VCTEUgPT0gZGF0YVR5cGUpIHsKKwkJCXNjYWxhclR5cGUgPSBTY2FsYXJUeXBlLkRPVUJMRTsKKwkJCXZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuZG91YmxlVmFsKCk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfQllURVNUUiA9PSBkYXRhVHlwZSkgeworCQkJc2NhbGFyVHlwZSA9IFNjYWxhclR5cGUuQllURV9TVFJFQU07CisJCQl2YWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmJ5dGVzdHJWYWwoKTsKKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9DT01QTEVYID09IGRhdGFUeXBlKSB7CisJCQlzY2FsYXJUeXBlID0gU2NhbGFyVHlwZS5GTE9BVF9DT01QTEVYOworCQkJdmFsdWVzID0gZnJvbU9EU0Zsb2F0Q29tcGxleFNlcShvZHNWYWx1ZVNlcS51LmNvbXBsZXhWYWwoKSk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfRENPTVBMRVggPT0gZGF0YVR5cGUpIHsKKwkJCXNjYWxhclR5cGUgPSBTY2FsYXJUeXBlLkRPVUJMRV9DT01QTEVYOworCQkJdmFsdWVzID0gZnJvbU9EU0RvdWJsZUNvbXBsZXhTZXEob2RzVmFsdWVTZXEudS5kY29tcGxleFZhbCgpKTsKKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9FWFRFUk5BTFJFRkVSRU5DRSA9PSBkYXRhVHlwZSkgeworCQkJc2NhbGFyVHlwZSA9IFNjYWxhclR5cGUuRklMRV9MSU5LOworCQkJdmFsdWVzID0gZnJvbU9EU0V4dGVybmFsUmVmZXJlbmNlU2VxKG9kc1ZhbHVlU2VxLnUuZXh0UmVmVmFsKCkpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oCisJCQkJCSJDb252ZXJzaW9uIGZvciBPRFMgbWVhc3VyZWQgcG9pbnRzIG9mIHR5cGUgJyIgKyBkYXRhVHlwZS50b1N0cmluZygpICsgIicgZG9lcyBub3QgZXhpc3QuIik7CisJCX0KKworCQlpZiAobnVsbCA9PSBjb2x1bW5BdHRyaWJ1dGVzKSB7CisJCQljb2x1bW5BdHRyaWJ1dGVzID0gbmV3IFJlYWRSZXF1ZXN0SGFuZGxlci5Db2x1bW5BdHRyaWJ1dGVzKCIiLCBudWxsLCBuZXcgZG91YmxlWzBdLCBmYWxzZSwgbnVsbCk7CisJCX0KKworCQlyZXR1cm4gc2NhbGFyVHlwZS5jcmVhdGVNZWFzdXJlZFZhbHVlcyhvZHNNZWFzdXJlZFZhbHVlcy52YWxOYW1lLCBvZHNNZWFzdXJlZFZhbHVlcy51bml0LAorCQkJCWNvbHVtbkF0dHJpYnV0ZXMuZ2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbigpLCBjb2x1bW5BdHRyaWJ1dGVzLmdldEdlbmVyYXRpb25QYXJhbWV0ZXJzKCksCisJCQkJY29sdW1uQXR0cmlidXRlcy5pc0luZGVwZW5kZW50Q29sdW1uKCksIGNvbHVtbkF0dHJpYnV0ZXMuZ2V0QXhpc1R5cGUoKSwgdmFsdWVzLAorCQkJCWZyb21PRFNWYWxpZEZsYWdTZXEob2RzVmFsdWVTZXEuZmxhZykpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBWYWx1ZX0gdG8ge0BsaW5rIFRTX1ZhbHVlfS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUge0Bjb2RlIFZhbHVlfS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRTX1ZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIG9uIGNvbnZlcnNpb24gZXJyb3JzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVFNfVmFsdWUgdG9PRFNWYWx1ZShBdHRyaWJ1dGUgYXR0cmlidXRlLCBWYWx1ZSB2YWx1ZSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlUU19WYWx1ZSBvZHNWYWx1ZSA9IG5ldyBUU19WYWx1ZShuZXcgVFNfVW5pb24oKSwgdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKSk7CisJCVZhbHVlVHlwZTw/PiB0eXBlID0gdmFsdWUuZ2V0VmFsdWVUeXBlKCk7CisKKwkJaWYgKFZhbHVlVHlwZS5TVFJJTkcgPT0gdHlwZSkgeworCQkJaWYgKCgoT0RTQXR0cmlidXRlKSBhdHRyaWJ1dGUpLmlzSWRBdHRyaWJ1dGUoKSkgeworCQkJCW9kc1ZhbHVlLnUubG9uZ2xvbmdWYWwoT0RTQ29udmVydGVyLnRvT0RTSUQodmFsdWUuZXh0cmFjdCgpKSk7CisJCQl9IGVsc2UgeworCQkJCW9kc1ZhbHVlLnUuc3RyaW5nVmFsKHZhbHVlLmV4dHJhY3QoKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLlNUUklOR19TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlpZiAoKChPRFNBdHRyaWJ1dGUpIGF0dHJpYnV0ZSkuaXNJZEF0dHJpYnV0ZSgpKSB7CisJCQkJb2RzVmFsdWUudS5sb25nbG9uZ1NlcSgKKwkJCQkJCVN0cmVhbS5vZigoU3RyaW5nW10pIHZhbHVlLmV4dHJhY3QoKSkubWFwKE9EU0NvbnZlcnRlcjo6dG9PRFNJRCkudG9BcnJheShUX0xPTkdMT05HW106Om5ldykpOworCQkJfSBlbHNlIHsKKwkJCQlvZHNWYWx1ZS51LnN0cmluZ1NlcSh2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5EQVRFID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuZGF0ZVZhbCh0b09EU0RhdGUodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkRBVEVfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5kYXRlU2VxKHRvT0RTRGF0ZVNlcSh2YWx1ZS5leHRyYWN0KCkpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQk9PTEVBTiA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmJvb2xlYW5WYWwodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQk9PTEVBTl9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmJvb2xlYW5WYWwodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQllURSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmJ5dGVWYWwodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQllURV9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmJ5dGVTZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuU0hPUlQgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5zaG9ydFZhbCh2YWx1ZS5leHRyYWN0KCkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5TSE9SVF9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LnNob3J0U2VxKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLklOVEVHRVIgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5sb25nVmFsKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLklOVEVHRVJfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5sb25nU2VxKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkxPTkcgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5sb25nbG9uZ1ZhbCh0b09EU0xvbmcodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkxPTkdfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5sb25nbG9uZ1NlcSh0b09EU0xvbmdTZXEodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkZMT0FUID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuZmxvYXRWYWwodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRkxPQVRfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5mbG9hdFNlcSh2YWx1ZS5leHRyYWN0KCkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5ET1VCTEUgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5kb3VibGVWYWwodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRE9VQkxFX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuZG91YmxlU2VxKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJZVEVfU1RSRUFNID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuYnl0ZXN0clZhbCh2YWx1ZS5leHRyYWN0KCkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5CWVRFX1NUUkVBTV9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmJ5dGVzdHJTZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRkxPQVRfQ09NUExFWCA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmNvbXBsZXhWYWwodG9PRFNGbG9hdENvbXBsZXgodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkZMT0FUX0NPTVBMRVhfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5jb21wbGV4U2VxKHRvT0RTRmxvYXRDb21wbGV4U2VxKHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5ET1VCTEVfQ09NUExFWCA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmRjb21wbGV4VmFsKHRvT0RTRG91YmxlQ29tcGxleCh2YWx1ZS5leHRyYWN0KCkpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5kY29tcGxleFNlcSh0b09EU0RvdWJsZUNvbXBsZXhTZXEodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkVOVU1FUkFUSU9OID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuZW51bVZhbChPRFNFbnVtZXJhdGlvbnMudG9PRFNFbnVtKHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5FTlVNRVJBVElPTl9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmVudW1TZXEoT0RTRW51bWVyYXRpb25zLnRvT0RTRW51bVNlcSh2YWx1ZS5leHRyYWN0KCkpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRklMRV9MSU5LID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuZXh0UmVmVmFsKHRvT0RTRXh0ZXJuYWxSZWZlcmVuY2UodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkZJTEVfTElOS19TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmV4dFJlZlNlcSh0b09EU0V4dGVybmFsUmVmZXJlbmNlU2VxKHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5CTE9CID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuYmxvYlZhbCh0b09EU0Jsb2IodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiTWFwcGluZyBmb3IgdmFsdWUgdHlwZSAnIiArIHR5cGUgKyAiJyBkb2VzIG5vdCBleGlzdC4iKTsKKwkJfQorCisJCXJldHVybiBvZHNWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgc2hvcnRbXX0gdG8ge0BsaW5rIGJvb2xlYW5bXX0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBzaG9ydH1zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgYm9vbGVhbn1zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuW10gZnJvbU9EU1ZhbGlkRmxhZ1NlcShzaG9ydFtdIGlucHV0KSB7CisJCWJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhbltpbnB1dC5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgeworCQkJcmVzdWx0W2ldID0gZnJvbU9EU1ZhbGlkRmxhZyhpbnB1dFtpXSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBzaG9ydH0gdG8ge0BsaW5rIGJvb2xlYW59LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgc2hvcnR9LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgYm9vbGVhbn0gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmcm9tT0RTVmFsaWRGbGFnKHNob3J0IGlucHV0KSB7CisJCXJldHVybiBpbnB1dCA9PSAxNTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgYm9vbGVhbltdfSB0byB7QGxpbmsgc2hvcnRbXX0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBib29sZWFufXMuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBzaG9ydH1zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHNob3J0W10gdG9PRFNWYWxpZEZsYWdTZXEoYm9vbGVhbltdIGlucHV0KSB7CisJCXNob3J0W10gcmVzdWx0ID0gbmV3IHNob3J0W2lucHV0Lmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CisJCQlyZXN1bHRbaV0gPSB0b09EU1ZhbGlkRmxhZyhpbnB1dFtpXSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBib29sZWFufSB0byB7QGxpbmsgc2hvcnR9LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgYm9vbGVhbn0uCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBzaG9ydH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIHN0YXRpYyBzaG9ydCB0b09EU1ZhbGlkRmxhZyhib29sZWFuIGlucHV0KSB7CisJCXJldHVybiAoc2hvcnQpIChpbnB1dCA/IDE1IDogMCk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFRfTE9OR0xPTkdbXX0gdG8ge0BsaW5rIGxvbmdbXX0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBUX0xPTkdMT05HfXMuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBsb25nfXMgYXJlIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIGxvbmdbXSBmcm9tT0RTTG9uZ1NlcShUX0xPTkdMT05HW10gaW5wdXQpIHsKKwkJbG9uZ1tdIHJlc3VsdCA9IG5ldyBsb25nW2lucHV0Lmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CisJCQlyZXN1bHRbaV0gPSBmcm9tT0RTTG9uZyhpbnB1dFtpXSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBUX0xPTkdMT05HfSB0byB7QGxpbmsgbG9uZ30uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBUX0xPTkdMT05HfS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIGxvbmd9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgbG9uZyBmcm9tT0RTTG9uZyhUX0xPTkdMT05HIGlucHV0KSB7CisJCVRfTE9OR0xPTkcgdmFsdWUgPSBpbnB1dCA9PSBudWxsID8gbmV3IFRfTE9OR0xPTkcoKSA6IGlucHV0OworCQlyZXR1cm4gKHZhbHVlLmhpZ2ggKyAodmFsdWUubG93ID49IDAgPyAwIDogMSkpICogMHgxMDAwMDAwMDBMICsgdmFsdWUubG93OworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBsb25nW119IHRvIHtAbGluayBUX0xPTkdMT05HW119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgbG9uZ31zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgVF9MT05HTE9OR31zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBUX0xPTkdMT05HW10gdG9PRFNMb25nU2VxKGxvbmdbXSBpbnB1dCkgeworCQlMaXN0PFRfTE9OR0xPTkc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PihpbnB1dC5sZW5ndGgpOworCQlmb3IgKGxvbmcgdmFsdWUgOiBpbnB1dCkgeworCQkJcmVzdWx0LmFkZCh0b09EU0xvbmcodmFsdWUpKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgVF9MT05HTE9OR1tyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIGxvbmd9IHRvIHtAbGluayBUX0xPTkdMT05HfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIGxvbmd9LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgVF9MT05HTE9OR30gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIHN0YXRpYyBUX0xPTkdMT05HIHRvT0RTTG9uZyhsb25nIGlucHV0KSB7CisJCXJldHVybiBuZXcgVF9MT05HTE9ORygoaW50KSAoaW5wdXQgPj4gMzIgJiAweGZmZmZmZmZmTCksIChpbnQpIChpbnB1dCAmIDB4ZmZmZmZmZmZMKSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgYSBnaXZlbiBNRE0gSUQgc3RyaW5nIHRvIHtAbGluayBUX0xPTkdMT05HfS4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIE1ETSBJRCBzdHJpbmcuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBUX0xPTkdMT05HfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRfTE9OR0xPTkcgdG9PRFNJRChTdHJpbmcgaW5wdXQpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0b09EU0xvbmcoTG9uZy52YWx1ZU9mKGlucHV0KSk7CisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbmV3IFRfTE9OR0xPTkcoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBTdHJpbmdbXX0gdG8ge0BsaW5rIExvY2FsRGF0ZVRpbWVbXX0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBTdHJpbmd9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIExvY2FsRGF0ZVRpbWV9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTG9jYWxEYXRlVGltZVtdIGZyb21PRFNEYXRlU2VxKFN0cmluZ1tdIGlucHV0KSB7CisJCUxpc3Q8TG9jYWxEYXRlVGltZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWlmIChpbnB1dCAhPSBudWxsKSB7CisJCQlmb3IgKFN0cmluZyB2YWx1ZSA6IGlucHV0KSB7CisJCQkJcmVzdWx0LmFkZChmcm9tT0RTRGF0ZSh2YWx1ZSkpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBMb2NhbERhdGVUaW1lW3Jlc3VsdC5zaXplKCldKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgU3RyaW5nfSB0byB7QGxpbmsgTG9jYWxEYXRlVGltZX0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBUX0NPTVBMRVh9LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgU3RyaW5nfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBMb2NhbERhdGVUaW1lIGZyb21PRFNEYXRlKFN0cmluZyBpbnB1dCkgeworCQlpZiAoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJRGF0ZVRpbWVGb3JtYXR0ZXIgZm9ybWF0dGVyID0gT0RTX0RBVEVfRk9STUFUVEVSUy5nZXQoaW5wdXQubGVuZ3RoKCkpOworCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgT0RTIGRhdGU6ICIgKyBpbnB1dCk7CisJCX0KKworCQl0cnkgeworCQkJaWYgKGlucHV0Lmxlbmd0aCgpIDw9IDgpIHsKKwkJCQkvLyBKYXZhIGRvZXMgbm90IGFjY2VwdCBhIGJhcmUgZGF0ZSBhcyBEYXRlVGltZSwgc28gd2UgYXJlIHVzaW5nIExvY2FsRGF0ZQorCQkJCS8vIGluc3RlYWQgb2YgTG9jYWxEYXRlVGltZQorCQkJCXJldHVybiBMb2NhbERhdGUucGFyc2UoaW5wdXQsIGZvcm1hdHRlcikuYXRTdGFydE9mRGF5KCk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBMb2NhbERhdGVUaW1lLnBhcnNlKGlucHV0LCBmb3JtYXR0ZXIpOworCQkJfQorCQl9IGNhdGNoIChEYXRlVGltZVBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgT0RTIGRhdGU6ICIgKyBpbnB1dCwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgTG9jYWxEYXRlVGltZVtdfSB0byB7QGxpbmsgU3RyaW5nW119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgTG9jYWxEYXRlVGltZX1zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgU3RyaW5nfXMgYXJlIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRvT0RTRGF0ZVNlcShMb2NhbERhdGVUaW1lW10gaW5wdXQpIHsKKwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PihpbnB1dC5sZW5ndGgpOworCQlmb3IgKExvY2FsRGF0ZVRpbWUgdmFsdWUgOiBpbnB1dCkgeworCQkJcmVzdWx0LmFkZCh0b09EU0RhdGUodmFsdWUpKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgTG9jYWxEYXRlVGltZX0gdG8ge0BsaW5rIFN0cmluZ30uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBMb2NhbERhdGVUaW1lfS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFN0cmluZ30gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvT0RTRGF0ZShMb2NhbERhdGVUaW1lIGlucHV0KSB7CisJCXJldHVybiBpbnB1dCA9PSBudWxsID8gIiIgOiBpbnB1dC5mb3JtYXQoT0RTX0RBVEVfRk9STUFUVEVSUy5nZXQoMTQpKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgVF9DT01QTEVYW119IHRvIHtAbGluayBGbG9hdENvbXBsZXhbXX0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBUX0NPTVBMRVh9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIEZsb2F0Q29tcGxleH1zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBGbG9hdENvbXBsZXhbXSBmcm9tT0RTRmxvYXRDb21wbGV4U2VxKFRfQ09NUExFWFtdIGlucHV0KSB7CisJCUxpc3Q8RmxvYXRDb21wbGV4PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaWYgKGlucHV0ICE9IG51bGwpIHsKKwkJCWZvciAoVF9DT01QTEVYIHZhbHVlIDogaW5wdXQpIHsKKwkJCQlyZXN1bHQuYWRkKGZyb21PRFNGbG9hdENvbXBsZXgodmFsdWUpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgRmxvYXRDb21wbGV4W3Jlc3VsdC5zaXplKCldKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgVF9DT01QTEVYfSB0byB7QGxpbmsgRmxvYXRDb21wbGV4fS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIFRfQ09NUExFWH0uCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBGbG9hdENvbXBsZXh9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIEZsb2F0Q29tcGxleCBmcm9tT0RTRmxvYXRDb21wbGV4KFRfQ09NUExFWCBpbnB1dCkgeworCQlyZXR1cm4gaW5wdXQgPT0gbnVsbCA/IG51bGwgOiBuZXcgRmxvYXRDb21wbGV4KGlucHV0LnIsIGlucHV0LmkpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBGbG9hdENvbXBsZXhbXX0gdG8ge0BsaW5rIFRfQ09NUExFWFtdfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIEZsb2F0Q29tcGxleH1zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgVF9DT01QTEVYfXMgYXJlIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFRfQ09NUExFWFtdIHRvT0RTRmxvYXRDb21wbGV4U2VxKEZsb2F0Q29tcGxleFtdIGlucHV0KSB7CisJCUxpc3Q8VF9DT01QTEVYPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oaW5wdXQubGVuZ3RoKTsKKwkJZm9yIChGbG9hdENvbXBsZXggdmFsdWUgOiBpbnB1dCkgeworCQkJcmVzdWx0LmFkZCh0b09EU0Zsb2F0Q29tcGxleCh2YWx1ZSkpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBUX0NPTVBMRVhbcmVzdWx0LnNpemUoKV0pOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBGbG9hdENvbXBsZXh9IHRvIHtAbGluayBUX0NPTVBMRVh9LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgRmxvYXRDb21wbGV4fS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRfQ09NUExFWH0gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVF9DT01QTEVYIHRvT0RTRmxvYXRDb21wbGV4KEZsb2F0Q29tcGxleCBpbnB1dCkgeworCQlyZXR1cm4gaW5wdXQgPT0gbnVsbCA/IG51bGwgOiBuZXcgVF9DT01QTEVYKGlucHV0LnJlYWwoKSwgaW5wdXQuaW1hZ2luYXJ5KCkpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBUX0RDT01QTEVYW119IHRvIHtAbGluayBEb3VibGVDb21wbGV4W119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgVF9EQ09NUExFWH1zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgRG91YmxlQ29tcGxleH1zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBEb3VibGVDb21wbGV4W10gZnJvbU9EU0RvdWJsZUNvbXBsZXhTZXEoVF9EQ09NUExFWFtdIGlucHV0KSB7CisJCUxpc3Q8RG91YmxlQ29tcGxleD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWlmIChpbnB1dCAhPSBudWxsKSB7CisJCQlmb3IgKFRfRENPTVBMRVggdmFsdWUgOiBpbnB1dCkgeworCQkJCXJlc3VsdC5hZGQoZnJvbU9EU0RvdWJsZUNvbXBsZXgodmFsdWUpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgRG91YmxlQ29tcGxleFtyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFRfRENPTVBMRVh9IHRvIHtAbGluayBEb3VibGVDb21wbGV4fS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIFRfRENPTVBMRVh9LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgRG91YmxlQ29tcGxleH0gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRG91YmxlQ29tcGxleCBmcm9tT0RTRG91YmxlQ29tcGxleChUX0RDT01QTEVYIGlucHV0KSB7CisJCXJldHVybiBpbnB1dCA9PSBudWxsID8gbnVsbCA6IG5ldyBEb3VibGVDb21wbGV4KGlucHV0LnIsIGlucHV0LmkpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBEb3VibGVDb21wbGV4W119IHRvIHtAbGluayBUX0RDT01QTEVYW119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgRG91YmxlQ29tcGxleH1zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgVF9EQ09NUExFWH1zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBUX0RDT01QTEVYW10gdG9PRFNEb3VibGVDb21wbGV4U2VxKERvdWJsZUNvbXBsZXhbXSBpbnB1dCkgeworCQlMaXN0PFRfRENPTVBMRVg+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PihpbnB1dC5sZW5ndGgpOworCQlmb3IgKERvdWJsZUNvbXBsZXggdmFsdWUgOiBpbnB1dCkgeworCQkJcmVzdWx0LmFkZCh0b09EU0RvdWJsZUNvbXBsZXgodmFsdWUpKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgVF9EQ09NUExFWFtyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIERvdWJsZUNvbXBsZXh9IHRvIHtAbGluayBUX0RDT01QTEVYfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIERvdWJsZUNvbXBsZXh9LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgVF9EQ09NUExFWH0gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVF9EQ09NUExFWCB0b09EU0RvdWJsZUNvbXBsZXgoRG91YmxlQ29tcGxleCBpbnB1dCkgeworCQlyZXR1cm4gaW5wdXQgPT0gbnVsbCA/IG51bGwgOiBuZXcgVF9EQ09NUExFWChpbnB1dC5yZWFsKCksIGlucHV0LmltYWdpbmFyeSgpKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgVF9FeHRlcm5hbFJlZmVyZW5jZVtdfSB0byB7QGxpbmsgRmlsZUxpbmtbXX0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBUX0V4dGVybmFsUmVmZXJlbmNlfXMuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBGaWxlTGlua31zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBGaWxlTGlua1tdIGZyb21PRFNFeHRlcm5hbFJlZmVyZW5jZVNlcShUX0V4dGVybmFsUmVmZXJlbmNlW10gaW5wdXQpIHsKKwkJTGlzdDxGaWxlTGluaz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWlmIChpbnB1dCAhPSBudWxsKSB7CisJCQlmb3IgKFRfRXh0ZXJuYWxSZWZlcmVuY2UgdmFsdWUgOiBpbnB1dCkgeworCQkJCXJlc3VsdC5hZGQoZnJvbU9EU0V4dGVybmFsUmVmZXJlbmNlKHZhbHVlKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IEZpbGVMaW5rW3Jlc3VsdC5zaXplKCldKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgVF9FeHRlcm5hbFJlZmVyZW5jZX0gdG8ge0BsaW5rIEZpbGVMaW5rfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIFRfRXh0ZXJuYWxSZWZlcmVuY2V9LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgRmlsZUxpbmt9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIEZpbGVMaW5rIGZyb21PRFNFeHRlcm5hbFJlZmVyZW5jZShUX0V4dGVybmFsUmVmZXJlbmNlIGlucHV0KSB7CisJCWlmIChpbnB1dCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gRmlsZUxpbmsubmV3UmVtb3RlKGlucHV0LmxvY2F0aW9uLCBuZXcgTWltZVR5cGUoaW5wdXQubWltZVR5cGUpLCBpbnB1dC5kZXNjcmlwdGlvbik7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rW119IHRvIHtAbGluayBUX0V4dGVybmFsUmVmZXJlbmNlW119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgRmlsZUxpbmt9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRfRXh0ZXJuYWxSZWZlcmVuY2V9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVF9FeHRlcm5hbFJlZmVyZW5jZVtdIHRvT0RTRXh0ZXJuYWxSZWZlcmVuY2VTZXEoRmlsZUxpbmtbXSBpbnB1dCkgeworCQlMaXN0PFRfRXh0ZXJuYWxSZWZlcmVuY2U+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PihpbnB1dC5sZW5ndGgpOworCQlmb3IgKEZpbGVMaW5rIHZhbHVlIDogaW5wdXQpIHsKKwkJCXJlc3VsdC5hZGQodG9PRFNFeHRlcm5hbFJlZmVyZW5jZSh2YWx1ZSkpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBUX0V4dGVybmFsUmVmZXJlbmNlW3Jlc3VsdC5zaXplKCldKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9IHRvIHtAbGluayBUX0V4dGVybmFsUmVmZXJlbmNlfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIEZpbGVMaW5rfS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRfRXh0ZXJuYWxSZWZlcmVuY2V9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFRfRXh0ZXJuYWxSZWZlcmVuY2UgdG9PRFNFeHRlcm5hbFJlZmVyZW5jZShGaWxlTGluayBpbnB1dCkgeworCQlpZiAoaW5wdXQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBUX0V4dGVybmFsUmVmZXJlbmNlKCIiLCAiIiwgIiIpOworCQl9CisJCVN0cmluZyByZW1vdGVQYXRoID0gaW5wdXQuaXNSZW1vdGUoKSA/IGlucHV0LmdldFJlbW90ZVBhdGgoKSA6ICIiOworCQlyZXR1cm4gbmV3IFRfRXh0ZXJuYWxSZWZlcmVuY2UoaW5wdXQuZ2V0RGVzY3JpcHRpb24oKSwgaW5wdXQuZ2V0TWltZVR5cGUoKS50b1N0cmluZygpLCByZW1vdGVQYXRoKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgQmxvYn0gdG8ge0BsaW5rIE9iamVjdH0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBCbG9ifQorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgT2JqZWN0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBPYmplY3QgZnJvbU9EU0Jsb2IoQmxvYiBpbnB1dCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5PVCBZRVQgSU1QTEVNRU5URUQiKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBvYmplY3QgdG8ge0BsaW5rIEJsb2J9LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSBvYmplY3QuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBCbG9ifSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBCbG9iIHRvT0RTQmxvYihPYmplY3QgaW5wdXQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOT1QgWUVUIElNUExFTUVOVEVEIik7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdXRpbHMvT0RTRW51bS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0VudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTBkMDhjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0VudW0uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1lcmF0aW9uVmFsdWU7CisKKy8qKgorICogU3BlY2lhbCBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgT0RTIGVudW1lcmF0aW9ucworICoKKyAqLworcHVibGljIGNsYXNzIE9EU0VudW0gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBuYW1lOiAgICB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW51bWVyYXRpb24gdmFsdWUKKwkgKiBAcGFyYW0gb3JkaW5hbDogdGhlIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVudW1lcmF0aW9uIHZhbHVlCisJICovCisJcHVibGljIE9EU0VudW0oU3RyaW5nIG5hbWUsIGludCBvcmRpbmFsKSB7CisJCXN1cGVyKG5hbWUsIG9yZGluYWwpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0VudW1lcmF0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0VudW1lcmF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDYxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdXRpbHMvT0RTRW51bWVyYXRpb25zLmphdmEKQEAgLTAsMCArMSw0NjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkF4aXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5JbnRlcnBvbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UeXBlU3BlY2lmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmVyc2lvblN0YXRlOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGVudW1lcmF0aW9uIGNvbnN0YW50IGNvbnZlcnNpb25zIGZyb20vdG8gT0RTIHR5cGVzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgT0RTRW51bWVyYXRpb25zIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTEFSX1RZUEVfTkFNRSA9ICJkYXRhdHlwZV9lbnVtIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfTkFNRSA9ICJ2YWxpZF9lbnVtIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJQT0xBVElPTl9OQU1FID0gImludGVycG9sYXRpb25fZW51bSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFYSVNfVFlQRV9OQU1FID0gImF4aXN0eXBlIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TUEVDSUZJQ0FUSU9OX05BTUUgPSAidHlwZXNwZWNfZW51bSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX1JFUFJFU0VOVEFUSU9OX05BTUUgPSAic2VxX3JlcF9lbnVtIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKi8KKwlwcml2YXRlIE9EU0VudW1lcmF0aW9ucygpIHsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBlbnVtZXJhdGlvbiBjbGFzcyBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gPEU+ICBUaGUgZW51bWVyYXRpb24gdHlwZS4KKwkgKiBAcGFyYW0gbmFtZSBUaGUgT0RTIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBlbnVtZXJhdGlvbiBjbGFzcy4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGVudW1lcmF0aW9uIGNsYXNzIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBPRFMgZW51bWVyYXRpb24gbmFtZSBpcyB1bmtub3duLgorCSAqLworCS8vIEZJWE1FIChGbG9yaWFuIFNjaG1pdHQpOiBjYW4gd2UgZG8gdGhpcyBzaW1wbGVyPworCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb248PyBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IGdldEVudW1PYmooU3RyaW5nIG5hbWUpIHsKKwkJRW51bVJlZ2lzdHJ5IGVyID0gRW51bVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7CisJCWlmIChTQ0FMQVJfVFlQRV9OQU1FLmVxdWFscyhuYW1lKSkgeworCQkJcmV0dXJuIChlci5nZXQoRW51bVJlZ2lzdHJ5LlNDQUxBUl9UWVBFKSk7CisJCX0gZWxzZSBpZiAoU1RBVEVfTkFNRS5lcXVhbHMobmFtZSkpIHsKKwkJCXJldHVybiAoZXIuZ2V0KEVudW1SZWdpc3RyeS5WRVJTSU9OX1NUQVRFKSk7CisJCX0gZWxzZSBpZiAoSU5URVJQT0xBVElPTl9OQU1FLmVxdWFscyhuYW1lKSkgeworCQkJcmV0dXJuIChlci5nZXQoRW51bVJlZ2lzdHJ5LklOVEVSUE9MQVRJT04pKTsKKwkJfSBlbHNlIGlmIChBWElTX1RZUEVfTkFNRS5lcXVhbHMobmFtZSkpIHsKKwkJCXJldHVybiAoZXIuZ2V0KEVudW1SZWdpc3RyeS5BWElTX1RZUEUpKTsKKwkJfSBlbHNlIGlmIChUWVBFX1NQRUNJRklDQVRJT05fTkFNRS5lcXVhbHMobmFtZSkpIHsKKwkJCXJldHVybiAoZXIuZ2V0KEVudW1SZWdpc3RyeS5UWVBFX1NQRUNJRklDQVRJT04pKTsKKwkJfSBlbHNlIGlmIChTRVFVRU5DRV9SRVBSRVNFTlRBVElPTl9OQU1FLmVxdWFscyhuYW1lKSkgeworCQkJcmV0dXJuIChlci5nZXQoRW51bVJlZ2lzdHJ5LlNFUVVFTkNFX1JFUFJFU0VOVEFUSU9OKSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZXIuZ2V0KG5hbWUpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgT0RTIGVudW1lcmF0aW9uIG5hbWUgZm9yIGdpdmVuIGVudW1lcmF0aW9uIGNsYXNzLgorCSAqCisJICogQHBhcmFtIGVudW1PYmogVGhlIGVudW1lcmF0aW9uIG9iamVjdC4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIE9EUyBlbnVtZXJhdGlvbiBuYW1lIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBlbnVtZXJhdGlvbiBjbGFzcyBpcyB1bmtub3duLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVudW1OYW1lKEVudW1lcmF0aW9uPD8+IGVudW1PYmopIHsKKwkJaWYgKGVudW1PYmogPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW51bWVyYXRpb25WYWx1ZSBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBudWxsLiIpOworCQl9IGVsc2UgaWYgKEVudW1SZWdpc3RyeS5TQ0FMQVJfVFlQRS5lcXVhbHMoZW51bU9iai5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gU0NBTEFSX1RZUEVfTkFNRTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuVkVSU0lPTl9TVEFURS5lcXVhbHMoZW51bU9iai5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gU1RBVEVfTkFNRTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuSU5URVJQT0xBVElPTi5lcXVhbHMoZW51bU9iai5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gSU5URVJQT0xBVElPTl9OQU1FOworCQl9IGVsc2UgaWYgKEVudW1SZWdpc3RyeS5BWElTX1RZUEUuZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEFYSVNfVFlQRV9OQU1FOworCQl9IGVsc2UgaWYgKEVudW1SZWdpc3RyeS5UWVBFX1NQRUNJRklDQVRJT04uZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIFRZUEVfU1BFQ0lGSUNBVElPTl9OQU1FOworCQl9IGVsc2UgaWYgKEVudW1SZWdpc3RyeS5TRVFVRU5DRV9SRVBSRVNFTlRBVElPTi5lcXVhbHMoZW51bU9iai5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gU0VRVUVOQ0VfUkVQUkVTRU5UQVRJT05fTkFNRTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBlbnVtT2JqLmdldE5hbWUoKTsKKwkJfQorCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQYWNrYWdlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBPRFMgZW51bWVyYXRpb24gdmFsdWUgdXNpbmcgZ2l2ZW4gZW51bWVyYXRpb24gY2xhc3MgdG8gdGhlCisJICogY29ycmVzcG9uZGluZyBlbnVtZXJhdGlvbiBjb25zdGFudC4KKwkgKgorCSAqIEBwYXJhbSA8RT4gICAgICAgVGhlIGVudW1lcmF0aW9uIHR5cGUuCisJICogQHBhcmFtIGVudW1DbGFzcyBUaGUgZW51bWVyYXRpb24gY2xhc3MuCisJICogQHBhcmFtIHZhbHVlICAgICBUaGUgT0RTIGVudW1lcmF0aW9uIHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRpb24gY29uc3RhbnQgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGNvbnZlcnNpb24gbm90IHBvc3NpYmxlLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCS8vIEZJWE1FOiBjYW50IHdlIGhhdmUgdGhpcyBlYXNpZXI/CisJc3RhdGljIDxFIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZT4gRSBmcm9tT0RTRW51bShFbnVtZXJhdGlvbjxFPiBlbnVtT2JqLCBpbnQgdmFsdWUpIHsKKwkJaWYgKGVudW1PYmogPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW51bWVyYXRpb25WYWx1ZSBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBudWxsLiIpOworCQl9IGVsc2UgaWYgKEVudW1SZWdpc3RyeS5TQ0FMQVJfVFlQRS5lcXVhbHMoZW51bU9iai5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gKEUpIGZyb21PRFNTY2FsYXJUeXBlKHZhbHVlKTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuU0VRVUVOQ0VfUkVQUkVTRU5UQVRJT04uZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIChFKSBmcm9tT0RTU2VxdWVuY2VSZXByZXNlbnRhdGlvbih2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gKEUpIGZyb21PRFNFbnVtQnlPcmRpbmFsKGVudW1PYmosIHZhbHVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZXMgdXNpbmcgZ2l2ZW4gZW51bWVyYXRpb24gY2xhc3MgdG8gdGhlCisJICogY29ycmVzcG9uZGluZyBlbnVtZXJhdGlvbiBjb25zdGFudHMuCisJICoKKwkgKiBAcGFyYW0gPEU+ICAgICAgIFRoZSBlbnVtZXJhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSBlbnVtQ2xhc3MgVGhlIGVudW1lcmF0aW9uIGNsYXNzLgorCSAqIEBwYXJhbSB2YWx1ZXMgICAgVGhlIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZXMuCisJICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBlbnVtZXJhdGlvbiBjb25zdGFudHMgYXJlIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBjb252ZXJzaW9uIG5vdCBwb3NzaWJsZS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlzdGF0aWMgPEUgZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBFW10gZnJvbU9EU0VudW1TZXEoRW51bWVyYXRpb248Pz4gZW51bU9iaiwgaW50W10gdmFsdWVzKSB7CisJCWlmIChlbnVtT2JqID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVudW1lcmF0aW9uVmFsdWUgY2xhc3MgaXMgbm90IGFsbG93ZWQgdG8gYmUgbnVsbC4iKTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuU0NBTEFSX1RZUEUuZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJTGlzdDxFPiBzY2FsYXJUeXBlcyA9IG5ldyBBcnJheUxpc3Q8Pih2YWx1ZXMubGVuZ3RoKTsKKwkJCWZvciAoaW50IHZhbHVlIDogdmFsdWVzKSB7CisJCQkJc2NhbGFyVHlwZXMuYWRkKChFKSBmcm9tT0RTU2NhbGFyVHlwZSh2YWx1ZSkpOworCQkJfQorCQkJcmV0dXJuIChFW10pIHNjYWxhclR5cGVzLnRvQXJyYXkobmV3IFNjYWxhclR5cGVbdmFsdWVzLmxlbmd0aF0pOworCQl9IGVsc2UgaWYgKEVudW1SZWdpc3RyeS5TRVFVRU5DRV9SRVBSRVNFTlRBVElPTi5lcXVhbHMoZW51bU9iai5nZXROYW1lKCkpKSB7CisJCQlMaXN0PEU+IHNlcXVlbmNlUmVwcmVzZW50YXRpb25zID0gbmV3IEFycmF5TGlzdDw+KHZhbHVlcy5sZW5ndGgpOworCQkJZm9yIChpbnQgdmFsdWUgOiB2YWx1ZXMpIHsKKwkJCQlzZXF1ZW5jZVJlcHJlc2VudGF0aW9ucy5hZGQoKEUpIGZyb21PRFNTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKHZhbHVlKSk7CisJCQl9CisJCQlyZXR1cm4gKEVbXSkgc2VxdWVuY2VSZXByZXNlbnRhdGlvbnMudG9BcnJheShuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvblt2YWx1ZXMubGVuZ3RoXSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gKEVbXSkgZnJvbU9EU0VudW1TZXFCeU9yZGluYWwoZW51bU9iaiwgdmFsdWVzKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIGVudW1lcmF0aW9uIGNvbnN0YW50IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyBlbnVtZXJhdGlvbgorCSAqIHZhbHVlLgorCSAqCisJICogQHBhcmFtIDxFPiAgICAgIFRoZSBlbnVtZXJhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSBjb25zdGFudCBUaGUgZW51bWVyYXRpb24gY29uc3RhbnQuCisJICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBPRFMgZW51bWVyYXRpb24gdmFsdWUgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGNvbnZlcnNpb24gbm90IHBvc3NpYmxlLgorCSAqLworCXN0YXRpYyA8RSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IGludCB0b09EU0VudW0oRSBjb25zdGFudCkgeworCQlpZiAoY29uc3RhbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoY29uc3RhbnQgaW5zdGFuY2VvZiBTY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gdG9PRFNTY2FsYXJUeXBlKChTY2FsYXJUeXBlKSBjb25zdGFudCk7CisJCX0gZWxzZSBpZiAoY29uc3RhbnQgaW5zdGFuY2VvZiBWZXJzaW9uU3RhdGUgfHwgY29uc3RhbnQgaW5zdGFuY2VvZiBJbnRlcnBvbGF0aW9uIHx8IGNvbnN0YW50IGluc3RhbmNlb2YgQXhpc1R5cGUKKwkJCQl8fCBjb25zdGFudCBpbnN0YW5jZW9mIFR5cGVTcGVjaWZpY2F0aW9uKSB7CisJCQkvLyBOT1RFOiBPcmRpbmFsIG51bWJlcnMgbWFwIGRpcmVjdGx5IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUworCQkJLy8gZW51bWVyYXRpb24gY29uc3RhbnQgdmFsdWUuCisJCQlyZXR1cm4gY29uc3RhbnQub3JkaW5hbCgpOworCQl9IGVsc2UgaWYgKGNvbnN0YW50IGluc3RhbmNlb2YgU2VxdWVuY2VSZXByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIHRvT0RTU2VxdWVuY2VSZXByZXNlbnRhdGlvbigoU2VxdWVuY2VSZXByZXNlbnRhdGlvbikgY29uc3RhbnQpOworCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkiRW51bWVyYXRpb25WYWx1ZSBtYXBwaW5nIGZvciB0eXBlICciICsgY29uc3RhbnQuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiJyBkb2VzIG5vdCBleGlzdC4iKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBlbnVtZXJhdGlvbiBjb25zdGFudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgT0RTIGVudW1lcmF0aW9uCisJICogdmFsdWVzLgorCSAqCisJICogQHBhcmFtIDxFPiAgICAgICBUaGUgZW51bWVyYXRpb24gdHlwZS4KKwkgKiBAcGFyYW0gY29uc3RhbnRzIFRoZSBlbnVtZXJhdGlvbiBjb25zdGFudHMuCisJICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBPRFMgZW51bWVyYXRpb24gdmFsdWVzIGFyZSByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgY29udmVyc2lvbiBub3QgcG9zc2libGUuCisJICovCisJc3RhdGljIDxFIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZT4gaW50W10gdG9PRFNFbnVtU2VxKEVbXSBjb25zdGFudHMpIHsKKwkJaWYgKGNvbnN0YW50cyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IGludFswXTsKKwkJfQorCisJCWludFtdIHZhbHVlcyA9IG5ldyBpbnRbY29uc3RhbnRzLmxlbmd0aF07CisJCWlmIChjb25zdGFudHMgaW5zdGFuY2VvZiBTY2FsYXJUeXBlW10pIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzW2ldID0gdG9PRFNTY2FsYXJUeXBlKChTY2FsYXJUeXBlKSBjb25zdGFudHNbaV0pOworCQkJfQorCQl9IGVsc2UgaWYgKGNvbnN0YW50cyBpbnN0YW5jZW9mIFZlcnNpb25TdGF0ZVtdIHx8IGNvbnN0YW50cyBpbnN0YW5jZW9mIEludGVycG9sYXRpb25bXQorCQkJCXx8IGNvbnN0YW50cyBpbnN0YW5jZW9mIEF4aXNUeXBlW10gfHwgY29uc3RhbnRzIGluc3RhbmNlb2YgVHlwZVNwZWNpZmljYXRpb25bXSkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkvLyBOT1RFOiBPcmRpbmFsIG51bWJlcnMgZGlyZWN0bHkgbWFwIHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUworCQkJCS8vIGVudW1lcmF0aW9uIGNvbnN0YW50IHZhbHVlLgorCQkJCS8vIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0aGlzPworCQkJCXZhbHVlc1tpXSA9ICgoRW51bWVyYXRpb25WYWx1ZSkgY29uc3RhbnRzW2ldKS5vcmRpbmFsKCk7CisJCQl9CisJCX0gZWxzZSBpZiAoY29uc3RhbnRzIGluc3RhbmNlb2YgU2VxdWVuY2VSZXByZXNlbnRhdGlvbltdKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlc1tpXSA9IHRvT0RTU2VxdWVuY2VSZXByZXNlbnRhdGlvbigoU2VxdWVuY2VSZXByZXNlbnRhdGlvbikgY29uc3RhbnRzW2ldKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVudW1lcmF0aW9uVmFsdWUgbWFwcGluZyBmb3IgdHlwZSAnIgorCQkJCQkrIGNvbnN0YW50cy5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKS5nZXRTaW1wbGVOYW1lKCkgKyAiJyBkb2VzIG5vdCBleGlzdC4iKTsKKwkJfQorCisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgU2NhbGFyVHlwZX0KKwkgKiBjb25zdGFudC4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgT0RTIGVudW1lcmF0aW9uIHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFNjYWxhclR5cGV9IGNvbnN0YW50IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBjb252ZXJzaW9uIG5vdCBwb3NzaWJsZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTY2FsYXJUeXBlIGZyb21PRFNTY2FsYXJUeXBlKGludCB2YWx1ZSkgeworCQlpZiAodmFsdWUgPT0gMCkgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuVU5LTk9XTjsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAxKSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5TVFJJTkc7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gMikgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuU0hPUlQ7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gMykgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuRkxPQVQ7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gNCkgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuQk9PTEVBTjsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSA1KSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5CWVRFOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDYpIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLklOVEVHRVI7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gNykgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuRE9VQkxFOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDgpIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLkxPTkc7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gMTApIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLkRBVEU7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gMTEpIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLkJZVEVfU1RSRUFNOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDEyKSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5CTE9COworCQl9IGVsc2UgaWYgKHZhbHVlID09IDEzKSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5GTE9BVF9DT01QTEVYOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDE0KSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWDsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAyOCkgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuRklMRV9MSU5LOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDMwKSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5FTlVNRVJBVElPTjsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBtYXAgT0RTIGVudW1lcmF0aW9uIHZhdWUgJyIgKyB2YWx1ZSArICInIHRvIGNvbnN0YW50IG9mIHR5cGUgJyIKKwkJCQkrIFNjYWxhclR5cGUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIicuIik7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFNjYWxhclR5cGV9IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSBzY2FsYXJUeXBlIFRoZSB7QGNvZGUgU2NhbGFyVHlwZX0uCisJICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBPRFMgZW51bWVyYXRpb24gdmFsdWUgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGNvbnZlcnNpb24gbm90IHBvc3NpYmxlLgorCSAqLworCXByaXZhdGUgc3RhdGljIGludCB0b09EU1NjYWxhclR5cGUoU2NhbGFyVHlwZSBzY2FsYXJUeXBlKSB7CisJCWlmIChTY2FsYXJUeXBlLlVOS05PV04gPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5TVFJJTkcgPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5TSE9SVCA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gMjsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkZMT0FUID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiAzOworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuQk9PTEVBTiA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gNDsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkJZVEUgPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDU7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5JTlRFR0VSID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiA2OworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuRE9VQkxFID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiA3OworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuTE9ORyA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gODsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkRBVEUgPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDEwOworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuQllURV9TVFJFQU0gPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDExOworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuQkxPQiA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gMTI7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5GTE9BVF9DT01QTEVYID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiAxMzsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkRPVUJMRV9DT01QTEVYID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiAxNDsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkZJTEVfTElOSyA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gMjg7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5FTlVNRVJBVElPTiA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gMzA7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gbWFwIGVudW1lcmF0aW9uIGNvbnN0YW50ICciICsgc2NhbGFyVHlwZSArICInIG9mIHR5cGUgJyIKKwkJCQkrIFNjYWxhclR5cGUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIicgdG8gT0RTIGVudW1lcmF0aW9uIHZhbHVlLiIpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZworCSAqIHtAbGluayBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSBjb25zdGFudC4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgT0RTIGVudW1lcmF0aW9uIHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IGNvbnN0YW50IGlzCisJICogICAgICAgICByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgY29udmVyc2lvbiBub3QgcG9zc2libGUuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBmcm9tT0RTU2VxdWVuY2VSZXByZXNlbnRhdGlvbihpbnQgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IDApIHsKKwkJCXJldHVybiBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lUOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDEpIHsKKwkJCXJldHVybiBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLklNUExJQ0lUX0NPTlNUQU5UOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDIpIHsKKwkJCXJldHVybiBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLklNUExJQ0lUX0xJTkVBUjsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAzKSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5JTVBMSUNJVF9TQVc7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gNCkgeworCQkJcmV0dXJuIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX0xJTkVBUjsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSA1KSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfUE9MWU5PTUlBTDsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSA3KSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVF9FWFRFUk5BTDsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSA4KSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfTElORUFSX0VYVEVSTkFMOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDkpIHsKKwkJCXJldHVybiBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19QT0xZTk9NSUFMX0VYVEVSTkFMOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDEwKSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfTElORUFSX0NBTElCUkFURUQ7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gMTEpIHsKKwkJCXJldHVybiBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19MSU5FQVJfQ0FMSUJSQVRFRF9FWFRFUk5BTDsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBtYXAgT0RTIGVudW1lcmF0aW9uIHZhdWUgJyIgKyB2YWx1ZSArICInIHRvIGNvbnN0YW50IG9mIHR5cGUgJyIKKwkJCQkrIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIicuIik7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUworCSAqIGVudW1lcmF0aW9uIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHNlcXVlbmNlUmVwcmVzZW50YXRpb24gVGhlIHtAY29kZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufS4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgY29udmVyc2lvbiBub3QgcG9zc2libGUuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgaW50IHRvT0RTU2VxdWVuY2VSZXByZXNlbnRhdGlvbihTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIHNlcXVlbmNlUmVwcmVzZW50YXRpb24pIHsKKwkJaWYgKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVQgPT0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5JTVBMSUNJVF9DT05TVEFOVCA9PSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmIChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLklNUExJQ0lUX0xJTkVBUiA9PSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQlyZXR1cm4gMjsKKwkJfSBlbHNlIGlmIChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLklNUExJQ0lUX1NBVyA9PSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQlyZXR1cm4gMzsKKwkJfSBlbHNlIGlmIChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19MSU5FQVIgPT0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIDQ7CisJCX0gZWxzZSBpZiAoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfUE9MWU5PTUlBTCA9PSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQlyZXR1cm4gNTsKKwkJfSBlbHNlIGlmIChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lUX0VYVEVSTkFMID09IHNlcXVlbmNlUmVwcmVzZW50YXRpb24pIHsKKwkJCXJldHVybiA3OworCQl9IGVsc2UgaWYgKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX0xJTkVBUl9FWFRFUk5BTCA9PSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQlyZXR1cm4gODsKKwkJfSBlbHNlIGlmIChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19QT0xZTk9NSUFMX0VYVEVSTkFMID09IHNlcXVlbmNlUmVwcmVzZW50YXRpb24pIHsKKwkJCXJldHVybiA5OworCQl9IGVsc2UgaWYgKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX0xJTkVBUl9DQUxJQlJBVEVEID09IHNlcXVlbmNlUmVwcmVzZW50YXRpb24pIHsKKwkJCXJldHVybiAxMDsKKwkJfSBlbHNlIGlmIChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19MSU5FQVJfQ0FMSUJSQVRFRF9FWFRFUk5BTCA9PSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQlyZXR1cm4gMTE7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gbWFwIGVudW1lcmF0aW9uIGNvbnN0YW50ICciICsgc2VxdWVuY2VSZXByZXNlbnRhdGlvbgorCQkJCSsgIicgb2YgdHlwZSAnIiArIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIicgdG8gT0RTIGVudW1lcmF0aW9uIHZhbHVlLiIpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZyBlbnVtZXJhdGlvbgorCSAqIGNvbnN0YW50LiBUaGUgT0RTIGVudW1lcmF0aW9uIHZhbHVlIGlzIHVzZWQgYXMgdGhlIG9yZGluYWwgbnVtYmVyIG9mIHRoZQorCSAqIHJlcXVlc3RlZCBlbnVtZXJhdGlvbiBjb25zdGFudC4KKwkgKgorCSAqIEBwYXJhbSA8RT4gICAgICAgVGhlIGVudW1lcmF0aW9uIHR5cGUuCisJICogQHBhcmFtIGVudW1DbGFzcyBUaGUgZW51bWVyYXRpb24gY2xhc3MuCisJICogQHBhcmFtIHZhbHVlICAgICBUaGUgT0RTIGVudW1lcmF0aW9uIHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRpb24gY29uc3RhbnQgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGNvbnZlcnNpb24gbm90IHBvc3NpYmxlLgorCSAqLworCXByaXZhdGUgc3RhdGljIDxFIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZT4gRSBmcm9tT0RTRW51bUJ5T3JkaW5hbChFbnVtZXJhdGlvbjxFPiBlbnVtT2JqLCBpbnQgdmFsdWUpIHsKKwkJLy8gTk9URTogT3JkaW5hbCBudW1iZXJzIGRpcmVjdGx5IG1hcCB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMKKwkJLy8gZW51bWVyYXRpb24gY29uc3RhbnQgdmFsdWUuCisJCUUgZW51bXZhbHVlID0gZW51bU9iai52YWx1ZU9mKHZhbHVlKTsKKwkJaWYgKGVudW12YWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmV0dXJuIGVudW12YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBPRFMgZW51bWVyYXRpb24gdmFsdWVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVudW1lcmF0aW9uCisJICogY29uc3RhbnRzLiBUaGUgT0RTIGVudW1lcmF0aW9uIHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgb3JkaW5hbCBudW1iZXJzIG9mIHRoZQorCSAqIHJlcXVlc3RlZCBlbnVtZXJhdGlvbiBjb25zdGFudHMuCisJICoKKwkgKiBAcGFyYW0gPEU+ICAgICAgIFRoZSBlbnVtZXJhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSBlbnVtQ2xhc3MgVGhlIGVudW1lcmF0aW9uIGNsYXNzLgorCSAqIEBwYXJhbSB2YWx1ZXMgICAgVGhlIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZXMuCisJICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBlbnVtZXJhdGlvbiBjb25zdGFudHMgYXJlIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBjb252ZXJzaW9uIG5vdCBwb3NzaWJsZS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIHN0YXRpYyA8RSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IEVbXSBmcm9tT0RTRW51bVNlcUJ5T3JkaW5hbChFbnVtZXJhdGlvbjxFPiBlbnVtT2JqLCBpbnRbXSB2YWx1ZXMpIHsKKwkJTGlzdDxFPiBlbnVtVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KHZhbHVlcy5sZW5ndGgpOworCisJCWZvciAoaW50IHZhbHVlIDogdmFsdWVzKSB7CisJCQkvLyBOT1RFOiBPcmRpbmFsIG51bWJlcnMgZGlyZWN0bHkgbWFwIHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUworCQkJLy8gZW51bWVyYXRpb24gY29uc3RhbnQgdmFsdWUuCisJCQlFIGVudW12YWx1ZSA9IGVudW1PYmoudmFsdWVPZih2YWx1ZSk7CisJCQlpZiAoZW51bXZhbHVlID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQl9CisJCQllbnVtVmFsdWVzLmFkZChlbnVtdmFsdWUpOworCQl9CisKKwkJcmV0dXJuIGVudW1WYWx1ZXMudG9BcnJheSgoRVtdKSBBcnJheS5uZXdJbnN0YW5jZShlbnVtT2JqLmdldENsYXNzKCksIHZhbHVlcy5sZW5ndGgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0MzRhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFnZ3JGdW5jOworaW1wb3J0IG9yZy5hc2FtLm9kcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuU2VsT3Bjb2RlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5TZWxPcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkFnZ3JlZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Cb29sZWFuT3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkJyYWNrZXRPcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQ29tcGFyaXNvbk9wZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Kb2luVHlwZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlQmlNYXA7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBwcm92aWRlcyBiaWRpcmVjdGlvbmFsIG1hcHBpbmdzIGZvciBPRFMgdHlwZXMKKyAqCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE9EU1V0aWxzIHsKKwkvKioKKwkgKiBNYXBzIHtAbGluayBSZWxhdGlvblR5cGV9IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyB7QGxpbmsgUmVsYXRpb25UeXBlfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltbXV0YWJsZUJpTWFwPFJlbGF0aW9uVHlwZSwgb3JnLmFzYW0ub2RzLlJlbGF0aW9uVHlwZT4gUkVMQVRJT05TSElQUyA9IEltbXV0YWJsZUJpTWFwLjxSZWxhdGlvblR5cGUsIG9yZy5hc2FtLm9kcy5SZWxhdGlvblR5cGU+YnVpbGRlcigpCisJCQkucHV0KFJlbGF0aW9uVHlwZS5GQVRIRVJfQ0hJTEQsIG9yZy5hc2FtLm9kcy5SZWxhdGlvblR5cGUuRkFUSEVSX0NISUxEKQorCQkJLnB1dChSZWxhdGlvblR5cGUuSU5GTywgb3JnLmFzYW0ub2RzLlJlbGF0aW9uVHlwZS5JTkZPKQorCQkJLnB1dChSZWxhdGlvblR5cGUuSU5IRVJJVEFOQ0UsIG9yZy5hc2FtLm9kcy5SZWxhdGlvblR5cGUuSU5IRVJJVEFOQ0UpLmJ1aWxkKCk7CisKKwkvKioKKwkgKiBNYXBzIHtAbGluayBBZ2dyZWdhdGlvbn0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgT0RTIHtAbGluayBBZ2dyRnVuY30uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbW11dGFibGVCaU1hcDxBZ2dyZWdhdGlvbiwgQWdnckZ1bmM+IEFHR1JFR0FUSU9OUyA9IEltbXV0YWJsZUJpTWFwCisJCQkuPEFnZ3JlZ2F0aW9uLCBBZ2dyRnVuYz5idWlsZGVyKCkucHV0KEFnZ3JlZ2F0aW9uLk5PTkUsIEFnZ3JGdW5jLk5PTkUpCisJCQkucHV0KEFnZ3JlZ2F0aW9uLkNPVU5ULCBBZ2dyRnVuYy5DT1VOVCkucHV0KEFnZ3JlZ2F0aW9uLkRJU1RJTkNUX0NPVU5ULCBBZ2dyRnVuYy5EQ09VTlQpCisJCQkucHV0KEFnZ3JlZ2F0aW9uLk1JTklNVU0sIEFnZ3JGdW5jLk1JTikucHV0KEFnZ3JlZ2F0aW9uLk1BWElNVU0sIEFnZ3JGdW5jLk1BWCkKKwkJCS5wdXQoQWdncmVnYXRpb24uQVZFUkFHRSwgQWdnckZ1bmMuQVZHKS5wdXQoQWdncmVnYXRpb24uREVWSUFUSU9OLCBBZ2dyRnVuYy5TVERERVYpCisJCQkucHV0KEFnZ3JlZ2F0aW9uLlNVTSwgQWdnckZ1bmMuU1VNKS5wdXQoQWdncmVnYXRpb24uRElTVElOQ1QsIEFnZ3JGdW5jLkRJU1RJTkNUKS5idWlsZCgpOworCisJLyoqCisJICogTWFwcyB7QGxpbmsgQ29udGV4dFR5cGV9IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyB7QGxpbmsgU3RyaW5nfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltbXV0YWJsZUJpTWFwPENvbnRleHRUeXBlLCBTdHJpbmc+IENPTlRFWFRUWVBFUyA9IEltbXV0YWJsZUJpTWFwLjxDb250ZXh0VHlwZSwgU3RyaW5nPmJ1aWxkZXIoKQorCQkJLnB1dChDb250ZXh0VHlwZS5VTklUVU5ERVJURVNULCAiVW5pdFVuZGVyVGVzdCIpLnB1dChDb250ZXh0VHlwZS5URVNUU0VRVUVOQ0UsICJUZXN0U2VxdWVuY2UiKQorCQkJLnB1dChDb250ZXh0VHlwZS5URVNURVFVSVBNRU5ULCAiVGVzdEVxdWlwbWVudCIpLmJ1aWxkKCk7CisKKwkvKioKKwkgKiBNYXBzIHtAbGluayBDb21wYXJpc29uT3BlcmF0b3J9IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyB7QGxpbmsgU2VsT3Bjb2RlfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltbXV0YWJsZUJpTWFwPENvbXBhcmlzb25PcGVyYXRvciwgU2VsT3Bjb2RlPiBPUEVSQVRJT05TID0gSW1tdXRhYmxlQmlNYXAKKwkJCS48Q29tcGFyaXNvbk9wZXJhdG9yLCBTZWxPcGNvZGU+YnVpbGRlcigpLnB1dChDb21wYXJpc29uT3BlcmF0b3IuTElLRSwgU2VsT3Bjb2RlLkxJS0UpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5DQVNFX0lOU0VOU0lUSVZFX0xJS0UsIFNlbE9wY29kZS5DSV9MSUtFKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuTk9UX0xJS0UsIFNlbE9wY29kZS5OT1RMSUtFKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuQ0FTRV9JTlNFTlNJVElWRV9OT1RfTElLRSwgU2VsT3Bjb2RlLkNJX05PVExJS0UpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5FUVVBTCwgU2VsT3Bjb2RlLkVRKS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkNBU0VfSU5TRU5TSVRJVkVfRVFVQUwsIFNlbE9wY29kZS5DSV9FUSkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLk5PVF9FUVVBTCwgU2VsT3Bjb2RlLk5FUSkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkNBU0VfSU5TRU5TSVRJVkVfTk9UX0VRVUFMLCBTZWxPcGNvZGUuQ0lfTkVRKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOLCBTZWxPcGNvZGUuR1QpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5DQVNFX0lOU0VOU0lUSVZFX0dSRUFURVJfVEhBTiwgU2VsT3Bjb2RlLkNJX0dUKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMLCBTZWxPcGNvZGUuR1RFKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuQ0FTRV9JTlNFTlNJVElWRV9HUkVBVEVSX1RIQU5fT1JfRVFVQUwsIFNlbE9wY29kZS5DSV9HVEUpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU4sIFNlbE9wY29kZS5MVCkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkNBU0VfSU5TRU5TSVRJVkVfTEVTU19USEFOLCBTZWxPcGNvZGUuQ0lfTFQpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwsIFNlbE9wY29kZS5MVEUpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5DQVNFX0lOU0VOU0lUSVZFX0xFU1NfVEhBTl9PUl9FUVVBTCwgU2VsT3Bjb2RlLkNJX0xURSkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLklTX05VTEwsIFNlbE9wY29kZS5JU19OVUxMKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuSVNfTk9UX05VTEwsIFNlbE9wY29kZS5JU19OT1RfTlVMTCkucHV0KENvbXBhcmlzb25PcGVyYXRvci5JTl9TRVQsIFNlbE9wY29kZS5JTlNFVCkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkNBU0VfSU5TRU5TSVRJVkVfSU5fU0VULCBTZWxPcGNvZGUuQ0lfSU5TRVQpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5OT1RfSU5fU0VULCBTZWxPcGNvZGUuTk9USU5TRVQpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5DQVNFX0lOU0VOU0lUSVZFX05PVF9JTl9TRVQsIFNlbE9wY29kZS5DSV9OT1RJTlNFVCkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkJFVFdFRU4sIFNlbE9wY29kZS5CRVRXRUVOKS5idWlsZCgpOworCisJLyoqCisJICogTWFwcyB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yfSB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMge0BsaW5rIFNlbE9wZXJhdG9yfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltbXV0YWJsZUJpTWFwPEJvb2xlYW5PcGVyYXRvciwgU2VsT3BlcmF0b3I+IE9QRVJBVE9SUyA9IEltbXV0YWJsZUJpTWFwCisJCQkuPEJvb2xlYW5PcGVyYXRvciwgU2VsT3BlcmF0b3I+YnVpbGRlcigpLnB1dChCb29sZWFuT3BlcmF0b3IuQU5ELCBTZWxPcGVyYXRvci5BTkQpCisJCQkucHV0KEJvb2xlYW5PcGVyYXRvci5PUiwgU2VsT3BlcmF0b3IuT1IpLnB1dChCb29sZWFuT3BlcmF0b3IuTk9ULCBTZWxPcGVyYXRvci5OT1QpLmJ1aWxkKCk7CisKKwkvKioKKwkgKiBNYXBzIHtAbGluayBCcmFja2V0T3BlcmF0b3J9IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyB7QGxpbmsgU2VsT3BlcmF0b3J9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1tdXRhYmxlQmlNYXA8QnJhY2tldE9wZXJhdG9yLCBTZWxPcGVyYXRvcj4gQlJBQ0tFVE9QRVJBVE9SUyA9IEltbXV0YWJsZUJpTWFwCisJCQkuPEJyYWNrZXRPcGVyYXRvciwgU2VsT3BlcmF0b3I+YnVpbGRlcigpLnB1dChCcmFja2V0T3BlcmF0b3IuT1BFTiwgU2VsT3BlcmF0b3IuT1BFTikKKwkJCS5wdXQoQnJhY2tldE9wZXJhdG9yLkNMT1NFLCBTZWxPcGVyYXRvci5DTE9TRSkuYnVpbGQoKTsKKworCS8qKgorCSAqIE1hcHMge0BsaW5rIFZhbHVlVHlwZX0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgT0RTIHtAbGluayBEYXRhVHlwZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbW11dGFibGVCaU1hcDxWYWx1ZVR5cGU8Pz4sIERhdGFUeXBlPiBWQUxVRVRZUEVTID0gSW1tdXRhYmxlQmlNYXAKKwkJCS48VmFsdWVUeXBlPD8+LCBEYXRhVHlwZT5idWlsZGVyKCkucHV0KFZhbHVlVHlwZS5VTktOT1dOLCBEYXRhVHlwZS5EVF9VTktOT1dOKQorCQkJLnB1dChWYWx1ZVR5cGUuU1RSSU5HLCBEYXRhVHlwZS5EVF9TVFJJTkcpLnB1dChWYWx1ZVR5cGUuU1RSSU5HX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19TVFJJTkcpCisJCQkucHV0KFZhbHVlVHlwZS5EQVRFLCBEYXRhVHlwZS5EVF9EQVRFKS5wdXQoVmFsdWVUeXBlLkRBVEVfU0VRVUVOQ0UsIERhdGFUeXBlLkRTX0RBVEUpCisJCQkucHV0KFZhbHVlVHlwZS5CT09MRUFOLCBEYXRhVHlwZS5EVF9CT09MRUFOKS5wdXQoVmFsdWVUeXBlLkJPT0xFQU5fU0VRVUVOQ0UsIERhdGFUeXBlLkRTX0JPT0xFQU4pCisJCQkucHV0KFZhbHVlVHlwZS5CWVRFLCBEYXRhVHlwZS5EVF9CWVRFKS5wdXQoVmFsdWVUeXBlLkJZVEVfU0VRVUVOQ0UsIERhdGFUeXBlLkRTX0JZVEUpCisJCQkucHV0KFZhbHVlVHlwZS5TSE9SVCwgRGF0YVR5cGUuRFRfU0hPUlQpLnB1dChWYWx1ZVR5cGUuU0hPUlRfU0VRVUVOQ0UsIERhdGFUeXBlLkRTX1NIT1JUKQorCQkJLnB1dChWYWx1ZVR5cGUuSU5URUdFUiwgRGF0YVR5cGUuRFRfTE9ORykucHV0KFZhbHVlVHlwZS5JTlRFR0VSX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19MT05HKQorCQkJLnB1dChWYWx1ZVR5cGUuTE9ORywgRGF0YVR5cGUuRFRfTE9OR0xPTkcpLnB1dChWYWx1ZVR5cGUuTE9OR19TRVFVRU5DRSwgRGF0YVR5cGUuRFNfTE9OR0xPTkcpCisJCQkucHV0KFZhbHVlVHlwZS5GTE9BVCwgRGF0YVR5cGUuRFRfRkxPQVQpLnB1dChWYWx1ZVR5cGUuRkxPQVRfU0VRVUVOQ0UsIERhdGFUeXBlLkRTX0ZMT0FUKQorCQkJLnB1dChWYWx1ZVR5cGUuRE9VQkxFLCBEYXRhVHlwZS5EVF9ET1VCTEUpLnB1dChWYWx1ZVR5cGUuRE9VQkxFX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19ET1VCTEUpCisJCQkucHV0KFZhbHVlVHlwZS5CWVRFX1NUUkVBTSwgRGF0YVR5cGUuRFRfQllURVNUUikucHV0KFZhbHVlVHlwZS5CWVRFX1NUUkVBTV9TRVFVRU5DRSwgRGF0YVR5cGUuRFNfQllURVNUUikKKwkJCS5wdXQoVmFsdWVUeXBlLkZMT0FUX0NPTVBMRVgsIERhdGFUeXBlLkRUX0NPTVBMRVgpCisJCQkucHV0KFZhbHVlVHlwZS5GTE9BVF9DT01QTEVYX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19DT01QTEVYKQorCQkJLnB1dChWYWx1ZVR5cGUuRE9VQkxFX0NPTVBMRVgsIERhdGFUeXBlLkRUX0RDT01QTEVYKQorCQkJLnB1dChWYWx1ZVR5cGUuRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0UsIERhdGFUeXBlLkRTX0RDT01QTEVYKS5wdXQoVmFsdWVUeXBlLkVOVU1FUkFUSU9OLCBEYXRhVHlwZS5EVF9FTlVNKQorCQkJLnB1dChWYWx1ZVR5cGUuRU5VTUVSQVRJT05fU0VRVUVOQ0UsIERhdGFUeXBlLkRTX0VOVU0pCisJCQkucHV0KFZhbHVlVHlwZS5GSUxFX0xJTkssIERhdGFUeXBlLkRUX0VYVEVSTkFMUkVGRVJFTkNFKQorCQkJLnB1dChWYWx1ZVR5cGUuRklMRV9MSU5LX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19FWFRFUk5BTFJFRkVSRU5DRSkucHV0KFZhbHVlVHlwZS5CTE9CLCBEYXRhVHlwZS5EVF9CTE9CKQorCQkJLmJ1aWxkKCk7CisKKwkvKioKKwkgKiBNYXBzIHtAbGluayBKb2luVHlwZX0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgT0RTIHtAbGluayBvcmcuYXNhbS5vZHMuSm9pblR5cGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1tdXRhYmxlQmlNYXA8Sm9pblR5cGUsIG9yZy5hc2FtLm9kcy5Kb2luVHlwZT4gSk9JTlMgPSBJbW11dGFibGVCaU1hcC48Sm9pblR5cGUsIG9yZy5hc2FtLm9kcy5Kb2luVHlwZT5idWlsZGVyKCkKKwkJCS5wdXQoSm9pblR5cGUuSU5ORVIsIG9yZy5hc2FtLm9kcy5Kb2luVHlwZS5KVERFRkFVTFQpLnB1dChKb2luVHlwZS5PVVRFUiwgb3JnLmFzYW0ub2RzLkpvaW5UeXBlLkpUT1VURVIpCisJCQkuYnVpbGQoKTsKKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSUQoU3RyaW5nIGluc3RhbmNlSUQpIHsKKwkJcmV0dXJuIGluc3RhbmNlSUQgIT0gbnVsbCAmJiAhaW5zdGFuY2VJRC5pc0VtcHR5KCkgJiYgISIwIi5lcXVhbHMoaW5zdGFuY2VJRCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL3Byb3RvL25vdGlmaWNhdGlvbi5wcm90byBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9wcm90by9ub3RpZmljYXRpb24ucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwMzIwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9wcm90by9ub3RpZmljYXRpb24ucHJvdG8KQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24NCisgKg0KKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwNCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKg0KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQ0KKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuDQorICoNCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KKyAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyAKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLnBlYWtzb2x1dGlvbi5vZHMubm90aWZpY2F0aW9uLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJOb3RpZmljYXRpb25Qcm90b3MiOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8iOworCitlbnVtIE1vZGlmaWNhdGlvblR5cGUgeworICBORVcgPSAwOworICBNT0RJRlkgPSAxOworICBERUxFVEUgPSAyOworICBNT0RFTCA9IDM7CisgIFNFQ1VSSVRZID0gNDsKK30KKwkKK21lc3NhZ2UgUmVnaXN0cmF0aW9uIHsKKwllbnVtIE5vdGlmaWNhdGlvbk1vZGUgeworCQlQVVNIID0gMDsKKwkJUFVMTCA9IDE7CisJfQorCQorCU5vdGlmaWNhdGlvbk1vZGUgbW9kZSA9IDE7CisJcmVwZWF0ZWQgTW9kaWZpY2F0aW9uVHlwZSB0eXBlID0gMjsKKwlyZXBlYXRlZCBpbnQ2NCBhaWQgPSAzOworfQorCittZXNzYWdlIE5vdGlmaWNhdGlvbiB7CisJTW9kaWZpY2F0aW9uVHlwZSB0eXBlID0gMTsKKwlzdHJpbmcgdXVpZCA9IDI7CisJZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGlvbiA9IDM7CisJaW50NjQgdXNlcklkID0gNDsKKwlpbnQ2NCBhaWQgPSA1OworCXJlcGVhdGVkIGludDY0IGlpZCA9IDY7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL0FnZ3JlZ2F0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL0FnZ3JlZ2F0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjhkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvQWdncmVnYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0U7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fVVNFUjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Nb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CisKKy8qKgorICogQWdncmVnYXRpb24gdGVzdAorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBtYWYsIFBlYWsgU29sdXRpb24gR21iSAorICovCitASWdub3JlCisvLyBGSVhNRSAxMS4wMS4yMDE4OiB0aGlzIHRlc3QgbmVlZHMgYSBydW5uaW5nIE9EUyBTZXJ2ZXIsIHRoYXQgaXMgbm90IHN1aXRhYmxlIGZvciBjb250aW5vdXMgYnVpbGQgaW4gSmVua2lucy4KKy8vIENvbW1lbnQgdGhpcyBpbiBmb3IgbG9jYWwgdGVzdHMgb25seS4KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGlvblRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU0VSVklDRSA9ICJjb3JiYWxvYzo6MS4yQCVzOiVzL05hbWVTZXJ2aWNlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSID0gInNhIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAic2EiOworCisJcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBCZWZvcmVDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlSG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaG9zdCIpOworCQlTdHJpbmcgbmFtZVNlcnZpY2VQb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJwb3J0Iik7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic2VydmljZSIpOworCisJCWlmIChuYW1lU2VydmljZUhvc3QgPT0gbnVsbCB8fCBuYW1lU2VydmljZUhvc3QuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuYW1lIHNlcnZpY2UgaG9zdCBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdob3N0JyIpOworCQl9CisKKwkJbmFtZVNlcnZpY2VQb3J0ID0gbmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSA/IFN0cmluZy52YWx1ZU9mKDI4MDkpIDogbmFtZVNlcnZpY2VQb3J0OworCQlpZiAobmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIHBvcnQgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAncG9ydCciKTsKKwkJfQorCisJCWlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VOYW1lLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBuYW1lIGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3NlcnZpY2UnIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fTkFNRVNFUlZJQ0UsIFN0cmluZy5mb3JtYXQoTkFNRV9TRVJWSUNFLCBuYW1lU2VydmljZUhvc3QsIG5hbWVTZXJ2aWNlUG9ydCkpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fU0VSVklDRU5BTUUsIHNlcnZpY2VOYW1lICsgIi5BU0FNLU9EUyIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fVVNFUiwgVVNFUik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9QQVNTV09SRCwgUEFTU1dPUkQpOworCisJCWNvbnRleHQgPSBuZXcgT0RTQ29udGV4dEZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKwl9CisKKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkFmdGVyQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCWNvbnRleHQuY2xvc2UoKTsKKwkJfQorCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RRdWVyeUlkQW5kTmFtZU5vQWdncmVnYXRpb24oKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlID0gY29udGV4dC5nZXRRdWVyeVNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIHVuaXRFbnRpdHlUeXBlID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVW5pdC5jbGFzcyk7CisJCUF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IHVuaXRFbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiSWQiKTsKKwkJQXR0cmlidXRlIG5hbWVBdHRyaWJ1dGUgPSB1bml0RW50aXR5VHlwZS5nZXRBdHRyaWJ1dGUoIk5hbWUiKTsKKworCQlMaXN0PFJlc3VsdD4gbGlzdFJlcyA9IHF1ZXJ5U2VydmljZS5jcmVhdGVRdWVyeSgpLnNlbGVjdChpZEF0dHJpYnV0ZSkuc2VsZWN0KG5hbWVBdHRyaWJ1dGUpLmZldGNoKCk7CisKKwkJYXNzZXJ0VGhhdChsaXN0UmVzLnNpemUoKSkuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygxKTsKKwkJYXNzZXJ0VGhhdChsaXN0UmVzLmdldCgwKS5nZXRWYWx1ZShpZEF0dHJpYnV0ZSkuZ2V0VmFsdWVUeXBlKCkpLmlzRXF1YWxUbyhWYWx1ZVR5cGUuU1RSSU5HKTsKKwkJLy8gVGVzdCByZXRyaWV2aW5nIGF0dHJpYnV0ZSB2YWx1ZSB3aXRoIEFnZ3JlZ2F0aW9uLk5PTkUgKHNob3VsZCB5aWVsZCB0aGUgc2FtZQorCQkvLyByZXN1bHQgYXMgd2l0aCBubyBhZ2dyZWdhdGlvbik6CisJCWFzc2VydFRoYXQobGlzdFJlcy5nZXQoMCkuZ2V0VmFsdWUoaWRBdHRyaWJ1dGUsIEFnZ3JlZ2F0aW9uLk5PTkUpLmdldFZhbHVlVHlwZSgpKS5pc0VxdWFsVG8oVmFsdWVUeXBlLlNUUklORyk7CisJCWFzc2VydFRoYXQobGlzdFJlcy5nZXQoMCkuZ2V0VmFsdWUobmFtZUF0dHJpYnV0ZSkuZ2V0VmFsdWVUeXBlKCkpLmlzRXF1YWxUbyhWYWx1ZVR5cGUuU1RSSU5HKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UXVlcnlJZFdpdGhBZ2dyZWdhdGlvbigpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UgPSBjb250ZXh0LmdldFF1ZXJ5U2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgdW5pdEVudGl0eVR5cGUgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShVbml0LmNsYXNzKTsKKwkJQXR0cmlidXRlIGlkQXR0cmlidXRlID0gdW5pdEVudGl0eVR5cGUuZ2V0QXR0cmlidXRlKCJJZCIpOworCisJCUxpc3Q8UmVzdWx0PiBsaXN0UmVzID0gcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KCkuc2VsZWN0KGlkQXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5NQVhJTVVNKSAvLyBzaG91bGQgYmUgYSBzdHJpbmcKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbiByZXN1bHQsIGp1c3QKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsaWtlCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm9uLWFnZ3JlZ2F0ZWQgSWQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhdHRyaWJ1dGUKKwkJCQkuc2VsZWN0KGlkQXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5BVkVSQUdFKSAvLyBzaG91bGQgYmUgYSBudW1lcmljIHZhbHVlIGluIHJlc3VsdAorCQkJCS5mZXRjaCgpOworCisJCWFzc2VydFRoYXQobGlzdFJlcy5zaXplKCkpLmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMSk7CisJCWFzc2VydFRoYXQobGlzdFJlcy5nZXQoMCkuZ2V0VmFsdWUoaWRBdHRyaWJ1dGUsIEFnZ3JlZ2F0aW9uLk1BWElNVU0pLmdldFZhbHVlVHlwZSgpKQorCQkJCS5pc0VxdWFsVG8oVmFsdWVUeXBlLlNUUklORyk7CisJCWFzc2VydFRoYXQobGlzdFJlcy5nZXQoMCkuZ2V0VmFsdWUoaWRBdHRyaWJ1dGUsIEFnZ3JlZ2F0aW9uLkFWRVJBR0UpLmdldFZhbHVlVHlwZSgpKS5pc0VxdWFsVG8oVmFsdWVUeXBlLkxPTkcpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RRdWVyeUZhY3RvcldpdGhBZ2dyZWdhdGlvbigpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UgPSBjb250ZXh0LmdldFF1ZXJ5U2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgdW5pdEVudGl0eVR5cGUgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShVbml0LmNsYXNzKTsKKwkJQXR0cmlidXRlIGZhY3RvckF0dHJpYnV0ZSA9IHVuaXRFbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiRmFjdG9yIik7CisKKwkJTGlzdDxSZXN1bHQ+IGxpc3RSZXMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3QoZmFjdG9yQXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5DT1VOVCkKKwkJCQkuZ3JvdXAoZmFjdG9yQXR0cmlidXRlKS5mZXRjaCgpOworCisJCWFzc2VydFRoYXQobGlzdFJlcy5zaXplKCkpLmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMSk7CisJCWFzc2VydFRoYXQobGlzdFJlcy5nZXQoMCkuZ2V0VmFsdWUoZmFjdG9yQXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5DT1VOVCkuZ2V0VmFsdWVUeXBlKCkpCisJCQkJLmlzRXF1YWxUbyhWYWx1ZVR5cGUuSU5URUdFUik7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdFF1ZXJ5RmFjdG9yV2l0aEFuZFdpdGhvdXRBZ2dyZWdhdGlvbigpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UgPSBjb250ZXh0LmdldFF1ZXJ5U2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgdW5pdEVudGl0eVR5cGUgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShVbml0LmNsYXNzKTsKKwkJQXR0cmlidXRlIGZhY3RvckF0dHJpYnV0ZSA9IHVuaXRFbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiRmFjdG9yIik7CisKKwkJTGlzdDxSZXN1bHQ+IGxpc3RSZXMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3QoZmFjdG9yQXR0cmlidXRlKQorCQkJCS5zZWxlY3QoZmFjdG9yQXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5TVU0pLmdyb3VwKGZhY3RvckF0dHJpYnV0ZSkuZmV0Y2goKTsKKworCQlhc3NlcnRUaGF0KGxpc3RSZXMuc2l6ZSgpKS5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDEpOworCQlhc3NlcnRUaGF0KGxpc3RSZXMuZ2V0KDApLmdldFZhbHVlKGZhY3RvckF0dHJpYnV0ZSkuZ2V0VmFsdWVUeXBlKCkpLmlzRXF1YWxUbyhWYWx1ZVR5cGUuRE9VQkxFKTsKKwkJYXNzZXJ0VGhhdChsaXN0UmVzLmdldCgwKS5nZXRWYWx1ZShmYWN0b3JBdHRyaWJ1dGUsIEFnZ3JlZ2F0aW9uLlNVTSkuZ2V0VmFsdWVUeXBlKCkpCisJCQkJLmlzRXF1YWxUbyhWYWx1ZVR5cGUuRE9VQkxFKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9Kb2luVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL0pvaW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4ZmQxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9Kb2luVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9OQU1FU0VSVklDRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1BBU1NXT1JEOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fU0VSVklDRU5BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9VU0VSOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLk1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKKworLyoqCisgKiBKb2luVHlwZSB0ZXN0CisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIGpzdCwgUGVhayBTb2x1dGlvbiBHbWJICisgKi8KK0BJZ25vcmUKKy8vIEZJWE1FIDEwLjcuMjAxNzogdGhpcyB0ZXN0IG5lZWRzIGEgcnVubmluZyBPRFMgU2VydmVyLCB0aGF0IGlzIG5vdCBzdWl0YWJsZSBmb3IgY29udGlub3VzIGJ1aWxkIGluIEplbmtpbnMuCisvLyBDb21tZW50IHRoaXMgaW4gZm9yIGxvY2FsIHRlc3RzIG9ubHkuCitwdWJsaWMgY2xhc3MgSm9pblRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU0VSVklDRSA9ICJjb3JiYWxvYzo6MS4yQCVzOiVzL05hbWVTZXJ2aWNlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSID0gInNhIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAic2EiOworCisJcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBCZWZvcmVDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlSG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaG9zdCIpOworCQlTdHJpbmcgbmFtZVNlcnZpY2VQb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJwb3J0Iik7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic2VydmljZSIpOworCisJCWlmIChuYW1lU2VydmljZUhvc3QgPT0gbnVsbCB8fCBuYW1lU2VydmljZUhvc3QuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuYW1lIHNlcnZpY2UgaG9zdCBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdob3N0JyIpOworCQl9CisKKwkJbmFtZVNlcnZpY2VQb3J0ID0gbmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSA/IFN0cmluZy52YWx1ZU9mKDI4MDkpIDogbmFtZVNlcnZpY2VQb3J0OworCQlpZiAobmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIHBvcnQgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAncG9ydCciKTsKKwkJfQorCisJCWlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VOYW1lLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBuYW1lIGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3NlcnZpY2UnIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fTkFNRVNFUlZJQ0UsIFN0cmluZy5mb3JtYXQoTkFNRV9TRVJWSUNFLCBuYW1lU2VydmljZUhvc3QsIG5hbWVTZXJ2aWNlUG9ydCkpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fU0VSVklDRU5BTUUsIHNlcnZpY2VOYW1lICsgIi5BU0FNLU9EUyIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fVVNFUiwgVVNFUik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9QQVNTV09SRCwgUEFTU1dPUkQpOworCisJCWNvbnRleHQgPSBuZXcgT0RTQ29udGV4dEZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKwl9CisKKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkFmdGVyQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCWNvbnRleHQuY2xvc2UoKTsKKwkJfQorCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRUZXN0RnJvbVRlc3RTdGVwSWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVGVzdFN0ZXAuY2xhc3MpOworCisJCUxpc3Q8VGVzdD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goVGVzdC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjM3IikpOworCisJCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZFRlc3RGcm9tTWVhc3VyZW1lbnRJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShNZWFzdXJlbWVudC5jbGFzcyk7CisKKwkJTGlzdDxUZXN0PiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChUZXN0LmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiNjUiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kVGVzdEZyb21DaGFubmVsR3JvdXBJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShDaGFubmVsR3JvdXAuY2xhc3MpOworCisJCUxpc3Q8VGVzdD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goVGVzdC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjgwIikpOworCisJCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZFRlc3RGcm9tQ2hhbm5lbElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKENoYW5uZWwuY2xhc3MpOworCisJCUxpc3Q8VGVzdD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goVGVzdC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjMwMiIpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRUZXN0U3RlcEZyb21UZXN0SWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVGVzdC5jbGFzcyk7CisKKwkJTGlzdDxUZXN0U3RlcD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goVGVzdFN0ZXAuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICIyOCIpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRUZXN0U3RlcEZyb21NZWFzdXJlbWVudElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKE1lYXN1cmVtZW50LmNsYXNzKTsKKworCQlMaXN0PFRlc3RTdGVwPiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChUZXN0U3RlcC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjY1IikpOworCisJCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZFRlc3RTdGVwRnJvbUNoYW5uZWxHcm91cElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKENoYW5uZWxHcm91cC5jbGFzcyk7CisKKwkJTGlzdDxUZXN0PiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChUZXN0LmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiODAiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kVGVzdFN0ZXBGcm9tQ2hhbm5lbElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKENoYW5uZWwuY2xhc3MpOworCisJCUxpc3Q8VGVzdFN0ZXA+IGxpc3QgPSBzZWFyY2hTZXJ2aWNlLmZldGNoKFRlc3RTdGVwLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiMzAyIikpOworCisJCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZE1lYXN1cmVtZW50RnJvbVRlc3RJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShUZXN0LmNsYXNzKTsKKworCQlMaXN0PE1lYXN1cmVtZW50PiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChNZWFzdXJlbWVudC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjI4IikpOworCisJCWFzc2VydEVxdWFscyg5LCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZE1lYXN1cmVtZW50RnJvbVRlc3RTdGVwSWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVGVzdFN0ZXAuY2xhc3MpOworCisJCUxpc3Q8TWVhc3VyZW1lbnQ+IGxpc3QgPSBzZWFyY2hTZXJ2aWNlLmZldGNoKE1lYXN1cmVtZW50LmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiMzciKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDksIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kTWVhc3VyZW1lbnRGcm9tQ2hhbm5lbEdyb3VwSWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoQ2hhbm5lbEdyb3VwLmNsYXNzKTsKKworCQlMaXN0PE1lYXN1cmVtZW50PiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChNZWFzdXJlbWVudC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjgwIikpOworCisJCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZE1lYXN1cmVtZW50RnJvbUNoYW5uZWxJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShDaGFubmVsLmNsYXNzKTsKKworCQlMaXN0PE1lYXN1cmVtZW50PiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChNZWFzdXJlbWVudC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjMwMiIpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRDaGFubmVsR3JvdXBGcm9tVGVzdElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3QuY2xhc3MpOworCisJCUxpc3Q8Q2hhbm5lbEdyb3VwPiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChDaGFubmVsR3JvdXAuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICIyOCIpKTsKKworCQlhc3NlcnRFcXVhbHMoMTQsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kQ2hhbm5lbEdyb3VwRnJvbVRlc3RTdGVwSWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVGVzdFN0ZXAuY2xhc3MpOworCisJCUxpc3Q8Q2hhbm5lbEdyb3VwPiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChDaGFubmVsR3JvdXAuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICIzNyIpKTsKKworCQlhc3NlcnRFcXVhbHMoMTQsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kQ2hhbm5lbEdyb3VwRnJvbU1lYXN1cmVtZW50SWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoTWVhc3VyZW1lbnQuY2xhc3MpOworCisJCUxpc3Q8Q2hhbm5lbEdyb3VwPiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChDaGFubmVsR3JvdXAuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICI2NSIpKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRDaGFubmVsR3JvdXBGcm9tQ2hhbm5lbElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKENoYW5uZWwuY2xhc3MpOworCisJCUxpc3Q8Q2hhbm5lbEdyb3VwPiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChDaGFubmVsR3JvdXAuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICIzMDIiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kQ2hhbm5lbEZyb21UZXN0SWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVGVzdC5jbGFzcyk7CisKKwkJTGlzdDxDaGFubmVsPiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChDaGFubmVsLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiMjgiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDQzLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZENoYW5uZWxGcm9tVGVzdFN0ZXBJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShUZXN0U3RlcC5jbGFzcyk7CisKKwkJTGlzdDxDaGFubmVsPiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChDaGFubmVsLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiMzciKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDQzLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZENoYW5uZWxGcm9tTWVhc3VyZW1lbnRJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShNZWFzdXJlbWVudC5jbGFzcyk7CisKKwkJTGlzdDxDaGFubmVsPiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChDaGFubmVsLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiNjUiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kQ2hhbm5lbEZyb21DaGFubmVsR3JvdXBJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShDaGFubmVsR3JvdXAuY2xhc3MpOworCisJCUxpc3Q8Q2hhbm5lbD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goQ2hhbm5lbC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjgwIikpOworCisJCWFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQWRhcHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9PRFNBZGFwdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDgyYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQWRhcHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0U7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fVVNFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5TZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5Xcml0ZVJlcXVlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhLldyaXRlUmVxdWVzdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkF4aXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmlsZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NaW1lVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUGh5c2ljYWxEaW1lbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlF1YW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5FbnRpdHlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5UZW1wbGF0ZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5UZW1wbGF0ZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworQElnbm9yZQorLy8gRklYTUUgMTAuNy4yMDE3OiB0aGlzIHRlc3QgbmVlZHMgYSBydW5uaW5nIE9EUyBTZXJ2ZXIsIHRoYXQgaXMgbm90IHN1aXRhYmxlIGZvciBjb250aW5vdXMgYnVpbGQgaW4gSmVua2lucy4KKy8vIENvbW1lbnQgdGhpcyBpbiBmb3IgbG9jYWwgdGVzdHMgb25seS4KK3B1YmxpYyBjbGFzcyBPRFNBZGFwdGVyVGVzdCB7CisKKwkvKgorCSAqIEFUVEVOVElPTjogPT09PT09PT09PQorCSAqCisJICogVG8gcnVuIHRoaXMgdGVzdCBtYWtlIHN1cmUgdGhlIHRhcmdldCBzZXJ2aWNlIGlzIHJ1bm5pbmcgYSBNRE0gZGVmYXVsdCBtb2RlbAorCSAqIGFuZCBhbnkgZGF0YWJhc2UgY29uc3RyYWludCB3aGljaCBlbmZvcmNlcyBhIHJlbGF0aW9uIG9mIFRlc3QgdG8gYSBwYXJlbnQKKwkgKiBlbnRpdHkgaXMgZGVhY3RpdmF0ZWQhCisJICovCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT0RTQWRhcHRlclRlc3QuY2xhc3MpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU0VSVklDRSA9ICJjb3JiYWxvYzo6MS4yQCVzOiVzL05hbWVTZXJ2aWNlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSID0gInNhIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAic2EiOworCisJcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7CisJcHJpdmF0ZSBzdGF0aWMgRW50aXR5TWFuYWdlciBlbnRpdHlNYW5hZ2VyOworCXByaXZhdGUgc3RhdGljIEVudGl0eUZhY3RvcnkgZW50aXR5RmFjdG9yeTsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEJlZm9yZUNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlTdHJpbmcgbmFtZVNlcnZpY2VIb3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJob3N0Iik7CisJCVN0cmluZyBuYW1lU2VydmljZVBvcnQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBvcnQiKTsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJzZXJ2aWNlIik7CisKKwkJaWYgKG5hbWVTZXJ2aWNlSG9zdCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlSG9zdC5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5hbWUgc2VydmljZSBob3N0IGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ2hvc3QnIik7CisJCX0KKworCQluYW1lU2VydmljZVBvcnQgPSBuYW1lU2VydmljZVBvcnQgPT0gbnVsbCB8fCBuYW1lU2VydmljZVBvcnQuaXNFbXB0eSgpID8gU3RyaW5nLnZhbHVlT2YoMjgwOSkgOiBuYW1lU2VydmljZVBvcnQ7CisJCWlmIChuYW1lU2VydmljZVBvcnQgPT0gbnVsbCB8fCBuYW1lU2VydmljZVBvcnQuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuYW1lIHNlcnZpY2UgcG9ydCBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdwb3J0JyIpOworCQl9CisKKwkJaWYgKHNlcnZpY2VOYW1lID09IG51bGwgfHwgc2VydmljZU5hbWUuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlIG5hbWUgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAnc2VydmljZSciKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gY29ubmVjdGlvblBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9OQU1FU0VSVklDRSwgU3RyaW5nLmZvcm1hdChOQU1FX1NFUlZJQ0UsIG5hbWVTZXJ2aWNlSG9zdCwgbmFtZVNlcnZpY2VQb3J0KSk7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9TRVJWSUNFTkFNRSwgc2VydmljZU5hbWUgKyAiLkFTQU0tT0RTIik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9VU0VSLCBVU0VSKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1BBU1NXT1JELCBQQVNTV09SRCk7CisKKwkJY29udGV4dCA9IG5ldyBPRFNDb250ZXh0RmFjdG9yeSgpLmNvbm5lY3QoY29ubmVjdGlvblBhcmFtZXRlcnMpOworCQllbnRpdHlNYW5hZ2VyID0gY29udGV4dC5nZXRFbnRpdHlNYW5hZ2VyKCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbihFbnRpdHlNYW5hZ2VyLmNsYXNzKSk7CisJCWVudGl0eUZhY3RvcnkgPSBjb250ZXh0LmdldEVudGl0eUZhY3RvcnkoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnRpdHkgbWFuYWdlciBmYWN0b3J5IG5vdCBhdmFpbGFibGUuIikpOworCX0KKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQWZ0ZXJDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJaWYgKGNvbnRleHQgIT0gbnVsbCkgeworCQkJY29udGV4dC5jbG9zZSgpOworCQl9CisJfQorCisJLyoKKwkgKiBGSVhNRSB0aGlzIHRlc3QgcmVxdWlyZXMgdGhhdCB0aGVyZSBpcyBhIHRlc3RzdGVwIHdpdGggaWQgMiwgdGhhdCBoYXMgYQorCSAqIHVuaXR1bmRlcnRlc3QgY29tcG9uZW50IGNhbGxlZCAiZmlsZXRlc3QiLCB0aGF0IGhhcyBhbiBlbXB0eSBmaWxlbGluaworCSAqIGF0dHJpYnV0ZSAibXlleHRyZWYiIGFuZCBhIHN0cmluZyBhdHRyaW51dGUgImF0dHIxIi4gcmVtb3ZlIHRoZSBjb21tZW50IGF0CisJICogb3JnLmp1bml0LlRlc3QgaWYgeW91IGZ1bGZpbGwgdGhlc2UgcmVxdWlyZW1lbnRzCisJICovCisJLy8gQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgY2hhbmdlRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgaWR0ZXN0c3RlcCA9ICIyIjsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXR0ZXN0c3RlcCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKwkJVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb247CisKKwkJdHJhbnNhY3Rpb24gPSBlbnRpdHlNYW5hZ2VyLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKworCQl0cnkgeworCQkJTGlzdDxUZXN0U3RlcD4gbWVhbGlzdDsKKwkJCW1lYWxpc3QgPSBzZWFyY2hTZXJ2aWNlLmZldGNoKFRlc3RTdGVwLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0dGVzdHN0ZXAsIGlkdGVzdHN0ZXApKTsKKwkJCWFzc2VydEVxdWFscygxLCBtZWFsaXN0LnNpemUoKSk7CisJCQlUZXN0U3RlcCB0cyA9IG1lYWxpc3QuZ2V0KDApOworCQkJTWFwPENvbnRleHRUeXBlLCBDb250ZXh0Um9vdD4gbG9hZENvbnRleHRzID0gdHMubG9hZENvbnRleHRzKGVudGl0eU1hbmFnZXIsIENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpOworCQkJQ29udGV4dFJvb3QgY29udGV4dFJvb3QgPSBsb2FkQ29udGV4dHMuZ2V0KENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpOworCQkJT3B0aW9uYWw8Q29udGV4dENvbXBvbmVudD4gY29udGV4dENvbXBvbmVudCA9IGNvbnRleHRSb290LmdldENvbnRleHRDb21wb25lbnQoImZpbGV0ZXN0Iik7CisJCQlWYWx1ZSB2YWx1ZSA9IGNvbnRleHRDb21wb25lbnQuZ2V0KCkuZ2V0VmFsdWUoIm15ZXh0cmVmIik7CisJCQljb250ZXh0Q29tcG9uZW50LmdldCgpLmdldFZhbHVlKCJhdHRyMSIpLnNldCgidmFsNDcxMSIpOworCQkJRmlsZUxpbmsgZmwgPSBGaWxlTGluay5uZXdSZW1vdGUoIiIsIG5ldyBNaW1lVHlwZSgiIiksICIiKTsKKwkJCUZpbGVMaW5rIGZsMiA9IChGaWxlTGluaykgdmFsdWUuZXh0cmFjdCgpOworCQkJYXNzZXJ0RXF1YWxzKGZsMiwgZmwpOworCQkJTGlzdDxCYXNlRW50aXR5PiB0b1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJdG9VcGRhdGUuYWRkKGNvbnRleHRDb21wb25lbnQuZ2V0KCkpOworCQkJdHJhbnNhY3Rpb24udXBkYXRlKHRvVXBkYXRlKTsKKwkJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCXRyYW5zYWN0aW9uLmFib3J0KCk7CisJCQl0aHJvdyBlOworCQl9CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgcnVudFRlc3RTY3JpcHQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8Q2F0YWxvZ0NvbXBvbmVudD4gY2F0YWxvZ0NvbXBvbmVudHMgPSBjcmVhdGVDYXRhbG9nQ29tcG9uZW50cygpOworCQlMaXN0PFRlbXBsYXRlUm9vdD4gdGVtcGxhdGVSb290cyA9IGNyZWF0ZVRlbXBsYXRlUm9vdHMoY2F0YWxvZ0NvbXBvbmVudHMpOworCQlMaXN0PFRlbXBsYXRlVGVzdFN0ZXA+IHRlbXBsYXRlVGVzdFN0ZXBzID0gY3JlYXRlVGVtcGxhdGVUZXN0U3RlcHModGVtcGxhdGVSb290cyk7CisJCVRlbXBsYXRlVGVzdCB0ZW1wbGF0ZVRlc3QgPSBjcmVhdGVUZW1wbGF0ZVRlc3QodGVtcGxhdGVUZXN0U3RlcHMpOworCQlQaHlzaWNhbERpbWVuc2lvbiBwaHlzaWNhbERpbWVuc2lvbiA9IGVudGl0eUZhY3RvcnkuY3JlYXRlUGh5c2ljYWxEaW1lbnNpb24oImFueV9waHlzaWNhbF9kaW1lbnNpb24iKTsKKwkJVW5pdCB1bml0ID0gZW50aXR5RmFjdG9yeS5jcmVhdGVVbml0KCJhbnlfdW5pdCIsIHBoeXNpY2FsRGltZW5zaW9uKTsKKwkJUXVhbnRpdHkgcXVhbnRpdHkgPSBlbnRpdHlGYWN0b3J5LmNyZWF0ZVF1YW50aXR5KCJhbnlfcXVhbnRpdHkiLCB1bml0KTsKKworCQlUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGVudGl0eU1hbmFnZXIuc3RhcnRUcmFuc2FjdGlvbigpOworCQl0cnkgeworCQkJY3JlYXRlKHRyYW5zYWN0aW9uLCAiY2F0YWxvZyBjb21wb25lbnRzIiwgY2F0YWxvZ0NvbXBvbmVudHMpOworCQkJY3JlYXRlKHRyYW5zYWN0aW9uLCAidGVtcGxhdGUgcm9vdHMiLCB0ZW1wbGF0ZVJvb3RzKTsKKwkJCWNyZWF0ZSh0cmFuc2FjdGlvbiwgInRlbXBsYXRlIHRlc3Qgc3RlcHMiLCB0ZW1wbGF0ZVRlc3RTdGVwcyk7CisJCQljcmVhdGUodHJhbnNhY3Rpb24sICJ0ZW1wbGF0ZSB0ZXN0IiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0ZW1wbGF0ZVRlc3QpKTsKKwkJCWNyZWF0ZSh0cmFuc2FjdGlvbiwgInBoeXNpY2FsIGRpbWVuc2lvbiIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocGh5c2ljYWxEaW1lbnNpb24pKTsKKwkJCWNyZWF0ZSh0cmFuc2FjdGlvbiwgInVuaXQiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVuaXQpKTsKKwkJCWNyZWF0ZSh0cmFuc2FjdGlvbiwgInF1YW50aXR5IiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChxdWFudGl0eSkpOworCisJCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQl0cmFuc2FjdGlvbi5hYm9ydCgpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCWZhaWwoIlVuYWJsZSB0byBjcmVhdGUgdGVzdCBkYXRhIGR1ZSB0bzogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCisJCUxpc3Q8UHJvamVjdD4gcHJvamVjdHMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJdHJ5IHsKKwkJCXByb2plY3RzID0gY3JlYXRlVGVzdERhdGEodGVtcGxhdGVUZXN0LCBxdWFudGl0eSk7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXRyYW5zYWN0aW9uID0gZW50aXR5TWFuYWdlci5zdGFydFRyYW5zYWN0aW9uKCk7CisJCXRyeSB7CisJCQkvLyBkZWxldGUgaW4gcmV2ZXJzZSBvcmRlciEKKwkJCWlmICghcHJvamVjdHMuaXNFbXB0eSgpKSB7CisJCQkJZGVsZXRlKHRyYW5zYWN0aW9uLCAicHJvamVjdHMgYW5kIHRoZWlyIGNoaWxkcmVuIiwgcHJvamVjdHMpOworCQkJfQorCisJCQlkZWxldGUodHJhbnNhY3Rpb24sICJxdWFudGl0eSIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocXVhbnRpdHkpKTsKKwkJCWRlbGV0ZSh0cmFuc2FjdGlvbiwgInVuaXQiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVuaXQpKTsKKwkJCWRlbGV0ZSh0cmFuc2FjdGlvbiwgInBoeXNpY2FsIGRpbWVuc2lvbiIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocGh5c2ljYWxEaW1lbnNpb24pKTsKKwkJCWRlbGV0ZSh0cmFuc2FjdGlvbiwgInRlbXBsYXRlIHRlc3QiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRlbXBsYXRlVGVzdCkpOworCQkJZGVsZXRlKHRyYW5zYWN0aW9uLCAidGVtcGxhdGUgdGVzdCBzdGVwcyIsIHRlbXBsYXRlVGVzdFN0ZXBzKTsKKwkJCWRlbGV0ZSh0cmFuc2FjdGlvbiwgInRlbXBsYXRlIHJvb3RzIiwgdGVtcGxhdGVSb290cyk7CisJCQlkZWxldGUodHJhbnNhY3Rpb24sICJjYXRhbG9nIGNvbXBvbmVudHMiLCBjYXRhbG9nQ29tcG9uZW50cyk7CisKKwkJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCXRyYW5zYWN0aW9uLmFib3J0KCk7CisJCQlmYWlsKCJVbmFibGUgdG8gZGVsZXRlIHRlc3QgZGF0YSBkdWUgdG86ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKworCQlpZiAocHJvamVjdHMuaXNFbXB0eSgpKSB7CisJCQlmYWlsKCJXYXMgdW5hYmxlIHRvIGNyZWF0ZSB0ZXN0IGRhdGEuIik7CisJCX0KKwl9CisKKwlwcml2YXRlIExpc3Q8UHJvamVjdD4gY3JlYXRlVGVzdERhdGEoVGVtcGxhdGVUZXN0IHRlbXBsYXRlVGVzdCwgUXVhbnRpdHkgcXVhbnRpdHkpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQlQcm9qZWN0IHByb2plY3QgPSBlbnRpdHlGYWN0b3J5LmNyZWF0ZVByb2plY3QoInNpbXBsZV9wcm9qZWN0Iik7CisJCVBvb2wgcG9vbCA9IGVudGl0eUZhY3RvcnkuY3JlYXRlUG9vbCgic2ltcGxlX3Bvb2wiLCBwcm9qZWN0KTsKKworCQlMaXN0PFRlc3Q+IHRlc3RzID0gY3JlYXRlVGVzdHMoMiwgcG9vbCwgdGVtcGxhdGVUZXN0KTsKKworCQkvLyBjcmVhdGUgbWVhc3VyZW1lbnQgdGVzdCBkYXRhCisJCUxpc3Q8V3JpdGVSZXF1ZXN0PiB3cml0ZVJlcXVlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoVGVzdCB0ZXN0IDogdGVzdHMpIHsKKwkJCWZvciAoVGVzdFN0ZXAgdGVzdFN0ZXAgOiB0ZXN0LmdldENvbW1pc3Npb25lZFRlc3RTdGVwcygpKSB7CisJCQkJT3B0aW9uYWw8VGVtcGxhdGVUZXN0U3RlcD4gdGVtcGxhdGVUZXN0U3RlcCA9IFRlbXBsYXRlVGVzdFN0ZXAub2YodGVzdFN0ZXApOworCQkJCUNvbnRleHRSb290W10gY29udGV4dFJvb3RzID0gbmV3IENvbnRleHRSb290WzBdOworCQkJCWlmICh0ZW1wbGF0ZVRlc3RTdGVwLmlzUHJlc2VudCgpKSB7CisJCQkJCWNvbnRleHRSb290cyA9IHRlbXBsYXRlVGVzdFN0ZXAuZ2V0KCkuZ2V0VGVtcGxhdGVSb290cygpLnN0cmVhbSgpCisJCQkJCQkJLm1hcCh0ZW1wbGF0ZVJvb3QgLT4gZW50aXR5RmFjdG9yeS5jcmVhdGVDb250ZXh0Um9vdCh0ZW1wbGF0ZVJvb3QpKQorCQkJCQkJCS50b0FycmF5KENvbnRleHRSb290W106Om5ldyk7CisJCQkJfQorCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgMzsgaSsrKSB7CisJCQkJCU1lYXN1cmVtZW50IG1lYXN1cmVtZW50ID0gZW50aXR5RmFjdG9yeS5jcmVhdGVNZWFzdXJlbWVudCgibWVhc3VyZW1lbnRfIiArIGksIHRlc3RTdGVwLAorCQkJCQkJCWNvbnRleHRSb290cyk7CisKKwkJCQkJLy8gY3JlYXRlIGNoYW5uZWxzCisJCQkJCUxpc3Q8Q2hhbm5lbD4gY2hhbm5lbHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCA5OyBqKyspIHsKKwkJCQkJCWNoYW5uZWxzLmFkZChlbnRpdHlGYWN0b3J5LmNyZWF0ZUNoYW5uZWwoImNoYW5uZWxfICIgKyBqLCBtZWFzdXJlbWVudCwgcXVhbnRpdHkpKTsKKwkJCQkJfQorCisJCQkJCS8vIGNyZWF0ZSBjaGFubmVsIGdyb3VwCisJCQkJCUNoYW5uZWxHcm91cCBjaGFubmVsR3JvdXAgPSBlbnRpdHlGYWN0b3J5LmNyZWF0ZUNoYW5uZWxHcm91cCgiZ3JvdXAiLCAxMCwgbWVhc3VyZW1lbnQpOworCQkJCQl3cml0ZVJlcXVlc3RzLmFkZEFsbChjcmVhdGVNZWFzdXJlbWVudERhdGEobWVhc3VyZW1lbnQsIGNoYW5uZWxHcm91cCwgY2hhbm5lbHMpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGVudGl0eU1hbmFnZXIuc3RhcnRUcmFuc2FjdGlvbigpOworCQl0cnkgeworCQkJY3JlYXRlKHRyYW5zYWN0aW9uLCAicHJvamVjdCBhbmQgcG9vbCB3aXRoIHRlc3RzIGJhc2VkIG9uIHRlYW1wbGF0ZXMgd2l0aCBtZWFzdXJlbWVudHMgYW5kIG1hc3MgZGF0YSIsCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihwcm9qZWN0KSk7CisKKwkJCXRyYW5zYWN0aW9uLndyaXRlTWVhc3VyZWRWYWx1ZXMod3JpdGVSZXF1ZXN0cyk7CisJCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHByb2plY3QpOworCQl9IGNhdGNoIChEYXRhQWNjZXNzRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl0cmFuc2FjdGlvbi5hYm9ydCgpOworCQl9CisKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCX0KKworCXByaXZhdGUgTGlzdDxXcml0ZVJlcXVlc3Q+IGNyZWF0ZU1lYXN1cmVtZW50RGF0YShNZWFzdXJlbWVudCBtZWFzdXJlbWVudCwgQ2hhbm5lbEdyb3VwIGNoYW5uZWxHcm91cCwKKwkJCUxpc3Q8Q2hhbm5lbD4gY2hhbm5lbHMpIHsKKwkJLy8gc2V0IGxlbmd0aCBvZiB0aGUgY2hhbm5lbCB2YWx1ZSBzZXF1ZW5jZQorCQlMaXN0PFdyaXRlUmVxdWVzdD4gd3JpdGVSZXF1ZXN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCS8vIHBvcHVsYXRlIGNoYW5uZWwgdmFsdWUgd3JpdGUgcmVxdWVzdHMgLSBvbmUgcGVyIGNoYW5uZWwKKwkJQ29sbGVjdGlvbnMuc29ydChjaGFubmVscywgKGMxLCBjMikgLT4gYzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhjMi5nZXROYW1lKCkpKTsKKworCQlXcml0ZVJlcXVlc3RCdWlsZGVyIHdyYiA9IFdyaXRlUmVxdWVzdC5jcmVhdGUoY2hhbm5lbEdyb3VwLCBjaGFubmVscy5nZXQoMCksIEF4aXNUeXBlLlhfQVhJUyk7CisJCXdyaXRlUmVxdWVzdHMuYWRkKHdyYi5pbXBsaWNpdExpbmVhcihTY2FsYXJUeXBlLkZMT0FULCAwLCAxKS5pbmRlcGVuZGVudCgpLmJ1aWxkKCkpOworCisJCXdyYiA9IFdyaXRlUmVxdWVzdC5jcmVhdGUoY2hhbm5lbEdyb3VwLCBjaGFubmVscy5nZXQoMSksIEF4aXNUeXBlLllfQVhJUyk7CisJCXdyaXRlUmVxdWVzdHMuYWRkKHdyYi5leHBsaWNpdCgpCisJCQkJLmJvb2xlYW5WYWx1ZXMobmV3IGJvb2xlYW5bXSB7IHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSB9KQorCQkJCS5idWlsZCgpKTsKKworCQl3cmIgPSBXcml0ZVJlcXVlc3QuY3JlYXRlKGNoYW5uZWxHcm91cCwgY2hhbm5lbHMuZ2V0KDIpLCBBeGlzVHlwZS5ZX0FYSVMpOworCQl3cml0ZVJlcXVlc3RzLmFkZCh3cmIuZXhwbGljaXQoKS5ieXRlVmFsdWVzKG5ldyBieXRlW10geyA1LCAzMiwgNDIsIDksIDE3LCA2NSwgMTMsIDgsIDE1LCAyMSB9KS5idWlsZCgpKTsKKworCQl3cmIgPSBXcml0ZVJlcXVlc3QuY3JlYXRlKGNoYW5uZWxHcm91cCwgY2hhbm5lbHMuZ2V0KDMpLCBBeGlzVHlwZS5ZX0FYSVMpOworCQl3cml0ZVJlcXVlc3RzLmFkZCgKKwkJCQl3cmIuZXhwbGljaXQoKS5pbnRlZ2VyVmFsdWVzKG5ldyBpbnRbXSB7IDQyMywgNjQ1LCAyMjEsIDExMSwgNjc1LCAzNTMsIDc4MSwgNTgyLCA3NTUsIDIzMSB9KS5idWlsZCgpKTsKKworCQl3cmIgPSBXcml0ZVJlcXVlc3QuY3JlYXRlKGNoYW5uZWxHcm91cCwgY2hhbm5lbHMuZ2V0KDQpLCBBeGlzVHlwZS5ZX0FYSVMpOworCQl3cml0ZVJlcXVlc3RzLmFkZCh3cmIuZXhwbGljaXQoKQorCQkJCS5zdHJpbmdWYWx1ZXMobmV3IFN0cmluZ1tdIHsgInMxIiwgInMyIiwgInMzIiwgInM0IiwgInM1IiwgInM2IiwgInM3IiwgInM4IiwgInM5IiwgInMxMCIgfSkuYnVpbGQoKSk7CisKKwkJTG9jYWxEYXRlVGltZSBub3cgPSBMb2NhbERhdGVUaW1lLm5vdygpOworCQl3cmIgPSBXcml0ZVJlcXVlc3QuY3JlYXRlKGNoYW5uZWxHcm91cCwgY2hhbm5lbHMuZ2V0KDUpLCBBeGlzVHlwZS5ZX0FYSVMpOworCQl3cml0ZVJlcXVlc3RzCisJCQkJLmFkZCh3cmIuZXhwbGljaXQoKQorCQkJCQkJLmRhdGVWYWx1ZXMobmV3IExvY2FsRGF0ZVRpbWVbXSB7IG5vdywgbm93LnBsdXNEYXlzKDEpLCBub3cucGx1c0RheXMoMiksIG5vdy5wbHVzRGF5cygzKSwKKwkJCQkJCQkJbm93LnBsdXNEYXlzKDQpLCBub3cucGx1c0RheXMoNSksIG5vdy5wbHVzRGF5cyg2KSwgbm93LnBsdXNEYXlzKDcpLCBub3cucGx1c0RheXMoOCksCisJCQkJCQkJCW5vdy5wbHVzRGF5cyg5KSB9KQorCQkJCQkJLmJ1aWxkKCkpOworCisJCXdyYiA9IFdyaXRlUmVxdWVzdC5jcmVhdGUoY2hhbm5lbEdyb3VwLCBjaGFubmVscy5nZXQoNiksIEF4aXNUeXBlLllfQVhJUyk7CisJCXdyaXRlUmVxdWVzdHMuYWRkKHdyYi5leHBsaWNpdCgpLmJ5dGVTdHJlYW1WYWx1ZXMobmV3IGJ5dGVbXVtdIHsgeyAxLCAyIH0sIHsgMywgNCwgNSB9LCB7IDYsIDcsIDggfSwgeyA5LCAxMCB9LAorCQkJCXsgMTEgfSwgeyAxMiwgMTMsIDE0IH0sIHsgMTUsIDE2IH0sIHsgMTcsIDE4LCAxOSwgMjAgfSwgeyAyMSwgMjIgfSwgeyAyMyB9IH0pLmJ1aWxkKCkpOworCisJCXdyYiA9IFdyaXRlUmVxdWVzdC5jcmVhdGUoY2hhbm5lbEdyb3VwLCBjaGFubmVscy5nZXQoNyksIEF4aXNUeXBlLllfQVhJUyk7CisJCXdyaXRlUmVxdWVzdHMuYWRkKHdyYi5pbXBsaWNpdENvbnN0YW50KFNjYWxhclR5cGUuU0hPUlQsIFNob3J0Lk1BWF9WQUxVRSkuYnVpbGQoKSk7CisKKwkJd3JiID0gV3JpdGVSZXF1ZXN0LmNyZWF0ZShjaGFubmVsR3JvdXAsIGNoYW5uZWxzLmdldCg4KSwgQXhpc1R5cGUuWV9BWElTKTsKKwkJd3JpdGVSZXF1ZXN0cy5hZGQod3JiLmltcGxpY2l0U2F3KFNjYWxhclR5cGUuRkxPQVQsIDAsIDEsIDQpLmJ1aWxkKCkpOworCisJCXJldHVybiB3cml0ZVJlcXVlc3RzOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlKFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLCBTdHJpbmcga2V5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZWxldGFibGU+IGVudGl0aWVzKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMT0dHRVIuaW5mbygiPj4+Pj4+Pj4+Pj4+Pj4+Pj4gZGVsZXRpbmcgIiArIGtleSArICIuLi4iKTsKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl0cmFuc2FjdGlvbi5kZWxldGUoZW50aXRpZXMpOworCQlMT0dHRVIuaW5mbygiPj4+Pj4+Pj4+Pj4+Pj4+Pj4gIiArIGtleSArICIgZGVsZXRlZCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpICsgIiBtcyIpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlKFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLCBTdHJpbmcga2V5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0aWVzKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMT0dHRVIuaW5mbygiPj4+Pj4+Pj4+Pj4+Pj4+Pj4gY3JlYXRpbmcgIiArIGtleSArICIuLi4iKTsKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl0cmFuc2FjdGlvbi5jcmVhdGUoZW50aXRpZXMpOworCQlMT0dHRVIuaW5mbygiPj4+Pj4+Pj4+Pj4+Pj4+Pj4gIiArIGtleSArICIgd3JpdHRlbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpICsgIiBtcyIpOworCX0KKworCXByaXZhdGUgTGlzdDxUZXN0PiBjcmVhdGVUZXN0cyhpbnQgY291bnQsIFBvb2wgcG9vbCwgVGVtcGxhdGVUZXN0IHRlbXBsYXRlVGVzdCkgeworCQlyZXR1cm4gSW50U3RyZWFtLnJhbmdlKDEsICsrY291bnQpCisJCQkJLm1hcFRvT2JqKGkgLT4gZW50aXR5RmFjdG9yeS5jcmVhdGVUZXN0KCJzaW1wbGVfdGVzdF8iICsgaSwgcG9vbCwgdGVtcGxhdGVUZXN0KSkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwl9CisKKwlwcml2YXRlIFRlbXBsYXRlVGVzdCBjcmVhdGVUZW1wbGF0ZVRlc3QoTGlzdDxUZW1wbGF0ZVRlc3RTdGVwPiB0ZW1wbGF0ZVRlc3RTdGVwcykgeworCQlUZW1wbGF0ZVRlc3QgdGVtcGxhdGVUZXN0ID0gZW50aXR5RmFjdG9yeS5jcmVhdGVUZW1wbGF0ZVRlc3QoInRwbF90ZXN0Iik7CisJCXRlbXBsYXRlVGVzdFN0ZXBzLmZvckVhY2godHRzIC0+IHsKKwkJCWVudGl0eUZhY3RvcnkuY3JlYXRlVGVtcGxhdGVUZXN0U3RlcFVzYWdlKFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCksIHRlbXBsYXRlVGVzdCwgdHRzKTsKKwkJfSk7CisJCXJldHVybiB0ZW1wbGF0ZVRlc3Q7CisJfQorCisJcHJpdmF0ZSBMaXN0PFRlbXBsYXRlVGVzdFN0ZXA+IGNyZWF0ZVRlbXBsYXRlVGVzdFN0ZXBzKExpc3Q8VGVtcGxhdGVSb290PiB0ZW1wbGF0ZVJvb3RzKSB7CisJCS8vIG1ha2Ugc3VyZSBlYWNoIGNvbnRleHQgdHlwZSBpcyBnaXZlbiBvbmx5IG9uY2UKKwkJdGVtcGxhdGVSb290cy5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoVGVtcGxhdGVSb290OjpnZXRDb250ZXh0VHlwZSwgRnVuY3Rpb24uaWRlbnRpdHkoKSkpOworCisJCUxpc3Q8VGVtcGxhdGVUZXN0U3RlcD4gdGVtcGxhdGVUZXN0U3RlcHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJVGVtcGxhdGVUZXN0U3RlcCB0ZW1wbGF0ZVRlc3RTdGVwMSA9IGVudGl0eUZhY3RvcnkuY3JlYXRlVGVtcGxhdGVUZXN0U3RlcCgidHBsX3Rlc3Rfc3RlcF8xIik7CisJCXRlbXBsYXRlUm9vdHMuZm9yRWFjaCh0ciAtPiB0ZW1wbGF0ZVRlc3RTdGVwMS5zZXRUZW1wbGF0ZVJvb3QodHIpKTsKKwkJdGVtcGxhdGVUZXN0U3RlcHMuYWRkKHRlbXBsYXRlVGVzdFN0ZXAxKTsKKwkJVGVtcGxhdGVUZXN0U3RlcCB0ZW1wbGF0ZVRlc3RTdGVwMiA9IGVudGl0eUZhY3RvcnkuY3JlYXRlVGVtcGxhdGVUZXN0U3RlcCgidHBsX3Rlc3Rfc3RlcF8yIik7CisJCXRlbXBsYXRlUm9vdHMuZm9yRWFjaCh0ciAtPiB0ZW1wbGF0ZVRlc3RTdGVwMi5zZXRUZW1wbGF0ZVJvb3QodHIpKTsKKwkJdGVtcGxhdGVUZXN0U3RlcHMuYWRkKHRlbXBsYXRlVGVzdFN0ZXAyKTsKKworCQlyZXR1cm4gdGVtcGxhdGVUZXN0U3RlcHM7CisJfQorCisJcHJpdmF0ZSBMaXN0PFRlbXBsYXRlUm9vdD4gY3JlYXRlVGVtcGxhdGVSb290cyhMaXN0PENhdGFsb2dDb21wb25lbnQ+IGNhdGFsb2dDb21wb25lbnRzKSB7CisJCU1hcDxDb250ZXh0VHlwZSwgTGlzdDxDYXRhbG9nQ29tcG9uZW50Pj4gZ3JvdXBzID0gY2F0YWxvZ0NvbXBvbmVudHMuc3RyZWFtKCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoQ2F0YWxvZ0NvbXBvbmVudDo6Z2V0Q29udGV4dFR5cGUpKTsKKworCQlMaXN0PFRlbXBsYXRlUm9vdD4gdGVtcGxhdGVSb290cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlncm91cHMuZm9yRWFjaCgoY29udGV4dFR5cGUsIGNhdGFsb2dDb21wcykgLT4geworCQkJVGVtcGxhdGVSb290IHRlbXBsYXRlUm9vdCA9IGVudGl0eUZhY3RvcnkuY3JlYXRlVGVtcGxhdGVSb290KGNvbnRleHRUeXBlLAorCQkJCQkidHBsXyIgKyB0b0xvd2VyKGNvbnRleHRUeXBlLm5hbWUoKSkgKyAiX3Jvb3QiKTsKKwkJCS8vIGNyZWF0ZSBjaGlsZCB0ZW1wbGF0ZSBjb21wb25lbnRzIGZvciB0ZW1wbGF0ZSByb290CisJCQljYXRhbG9nQ29tcHMuZm9yRWFjaChjYXRhbG9nQ29tcCAtPiB7CisJCQkJVGVtcGxhdGVDb21wb25lbnQgdGVtcGxhdGVDb21wb25lbnQgPSBlbnRpdHlGYWN0b3J5CisJCQkJCQkuY3JlYXRlVGVtcGxhdGVDb21wb25lbnQoInRwbF8iICsgY2F0YWxvZ0NvbXAuZ2V0TmFtZSgpICsgIl9wYXJlbnQiLCB0ZW1wbGF0ZVJvb3QsIGNhdGFsb2dDb21wKTsKKwkJCQllbnRpdHlGYWN0b3J5LmNyZWF0ZVRlbXBsYXRlQ29tcG9uZW50KCJ0cGxfIiArIGNhdGFsb2dDb21wLmdldE5hbWUoKSArICJfY2hpbGQiLCB0ZW1wbGF0ZUNvbXBvbmVudCwKKwkJCQkJCWNhdGFsb2dDb21wKTsKKwkJCX0pOworCisJCQl0ZW1wbGF0ZVJvb3RzLmFkZCh0ZW1wbGF0ZVJvb3QpOworCQl9KTsKKworCQlyZXR1cm4gdGVtcGxhdGVSb290czsKKwl9CisKKwlwcml2YXRlIExpc3Q8Q2F0YWxvZ0NvbXBvbmVudD4gY3JlYXRlQ2F0YWxvZ0NvbXBvbmVudHMoKSB7CisJCUxpc3Q8Q2F0YWxvZ0NvbXBvbmVudD4gY2F0YWxvZ0NvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY2F0YWxvZ0NvbXBvbmVudHMuYWRkKGNyZWF0ZUNhdGFsb2dDb21wb25lbnQoQ29udGV4dFR5cGUuVU5JVFVOREVSVEVTVCkpOworCQljYXRhbG9nQ29tcG9uZW50cy5hZGQoY3JlYXRlQ2F0YWxvZ0NvbXBvbmVudChDb250ZXh0VHlwZS5URVNUU0VRVUVOQ0UpKTsKKwkJY2F0YWxvZ0NvbXBvbmVudHMuYWRkKGNyZWF0ZUNhdGFsb2dDb21wb25lbnQoQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCkpOworCQlyZXR1cm4gY2F0YWxvZ0NvbXBvbmVudHM7CisJfQorCisJcHJpdmF0ZSBDYXRhbG9nQ29tcG9uZW50IGNyZWF0ZUNhdGFsb2dDb21wb25lbnQoQ29udGV4dFR5cGUgY29udGV4dFR5cGUpIHsKKwkJQ2F0YWxvZ0NvbXBvbmVudCBjYXRhbG9nQ29tcG9uZW50ID0gZW50aXR5RmFjdG9yeS5jcmVhdGVDYXRhbG9nQ29tcG9uZW50KGNvbnRleHRUeXBlLAorCQkJCXRvTG93ZXIoY29udGV4dFR5cGUubmFtZSgpKSk7CisKKwkJZW50aXR5RmFjdG9yeS5jcmVhdGVDYXRhbG9nQXR0cmlidXRlKCJzdHJpbmciLCBWYWx1ZVR5cGUuU1RSSU5HLCBjYXRhbG9nQ29tcG9uZW50KTsKKwkJZW50aXR5RmFjdG9yeS5jcmVhdGVDYXRhbG9nQXR0cmlidXRlKCJkYXRlIiwgVmFsdWVUeXBlLkRBVEUsIGNhdGFsb2dDb21wb25lbnQpOworCQllbnRpdHlGYWN0b3J5LmNyZWF0ZUNhdGFsb2dBdHRyaWJ1dGUoImxvbmciLCBWYWx1ZVR5cGUuTE9ORywgY2F0YWxvZ0NvbXBvbmVudCk7CisJCWVudGl0eUZhY3RvcnkuY3JlYXRlQ2F0YWxvZ0F0dHJpYnV0ZSgiZmlsZV9saW5rIiwgVmFsdWVUeXBlLkZJTEVfTElOSywgY2F0YWxvZ0NvbXBvbmVudCk7CisJCWVudGl0eUZhY3RvcnkuY3JlYXRlQ2F0YWxvZ0F0dHJpYnV0ZSgiZmlsZV9saW5rX2FycmF5IiwgVmFsdWVUeXBlLkZJTEVfTElOS19TRVFVRU5DRSwgY2F0YWxvZ0NvbXBvbmVudCk7CisJCUVudW1SZWdpc3RyeSBlciA9IEVudW1SZWdpc3RyeS5nZXRJbnN0YW5jZSgpOworCQllbnRpdHlGYWN0b3J5LmNyZWF0ZUNhdGFsb2dBdHRyaWJ1dGUoInNjYWxhcl90eXBlIiwgZXIuZ2V0KEVudW1SZWdpc3RyeS5TQ0FMQVJfVFlQRSksIGNhdGFsb2dDb21wb25lbnQpOworCisJCXJldHVybiBjYXRhbG9nQ29tcG9uZW50OworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b0xvd2VyKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9PRFNDb250ZXh0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0NvbnRleHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxOTUxMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9PRFNDb250ZXh0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX05BTUVTRVJWSUNFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fUEFTU1dPUkQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9TRVJWSUNFTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1VTRVI7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuSW5zdGFuY2VFbGVtZW50OworaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkNvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5GYWlsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5TZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CisKK0BJZ25vcmUKKy8vRklYTUUgMjYuMDEuMjAxODogdGhpcyB0ZXN0IG5lZWRzIGEgcnVubmluZyBPRFMgU2VydmVyLCB0aGF0IGlzIG5vdCBzdWl0YWJsZSBmb3IgY29udGlub3VzIGJ1aWxkIGluIEplbmtpbnMuCisvL0NvbW1lbnQgdGhpcyBpbiBmb3IgbG9jYWwgdGVzdHMgb25seS4KK3B1YmxpYyBjbGFzcyBPRFNDb250ZXh0VGVzdCB7CisKKwkvKgorCSAqIEFUVEVOVElPTjogPT09PT09PT09PQorCSAqCisJICogVG8gcnVuIHRoaXMgdGVzdCBtYWtlIHN1cmUgdGhlIHRhcmdldCBzZXJ2aWNlIGlzIHJ1bm5pbmcgYSBNRE0gZGVmYXVsdCBtb2RlbAorCSAqIGFuZCBhbnkgZGF0YWJhc2UgY29uc3RyYWludCB3aGljaCBlbmZvcmNlcyBhIHJlbGF0aW9uIG9mIFRlc3QgdG8gYSBwYXJlbnQKKwkgKiBlbnRpdHkgaXMgZGVhY3RpdmF0ZWQhCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU0VSVklDRSA9ICJjb3JiYWxvYzo6MS4yQCVzOiVzL05hbWVTZXJ2aWNlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSID0gInNhIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAic2EiOworCisJcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7CisJcHJpdmF0ZSBzdGF0aWMgRW50aXR5TWFuYWdlciBlbnRpdHlNYW5hZ2VyOworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5hbWVTZXJ2aWNlSG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaG9zdCIpOworCXByaXZhdGUgc3RhdGljIFN0cmluZyBuYW1lU2VydmljZVBvcnQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBvcnQiKTsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmljZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNlcnZpY2UiKTsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEJlZm9yZUNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCisJCWlmIChuYW1lU2VydmljZUhvc3QgPT0gbnVsbCB8fCBuYW1lU2VydmljZUhvc3QuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuYW1lIHNlcnZpY2UgaG9zdCBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdob3N0JyIpOworCQl9CisKKwkJbmFtZVNlcnZpY2VQb3J0ID0gbmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSA/IFN0cmluZy52YWx1ZU9mKDI4MDkpIDogbmFtZVNlcnZpY2VQb3J0OworCQlpZiAobmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIHBvcnQgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAncG9ydCciKTsKKwkJfQorCisJCWlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VOYW1lLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBuYW1lIGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3NlcnZpY2UnIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fTkFNRVNFUlZJQ0UsIFN0cmluZy5mb3JtYXQoTkFNRV9TRVJWSUNFLCBuYW1lU2VydmljZUhvc3QsIG5hbWVTZXJ2aWNlUG9ydCkpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fU0VSVklDRU5BTUUsIHNlcnZpY2VOYW1lICsgIi5BU0FNLU9EUyIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fVVNFUiwgVVNFUik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9QQVNTV09SRCwgUEFTU1dPUkQpOworCisJCWNvbnRleHQgPSBuZXcgT0RTQ29udGV4dEZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKwkJZW50aXR5TWFuYWdlciA9IGNvbnRleHQuZ2V0RW50aXR5TWFuYWdlcigpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBTZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24oRW50aXR5TWFuYWdlci5jbGFzcykpOworCX0KKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQWZ0ZXJDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJaWYgKGNvbnRleHQgIT0gbnVsbCkgeworCQkJY29udGV4dC5jbG9zZSgpOworCQl9CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldEFkYXB0ZXJUeXBlKCkgeworCQlhc3NlcnRUaGF0KGNvbnRleHQuZ2V0QWRhcHRlclR5cGUoKSkuaXNFcXVhbFRvKCJvZHMiKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TGluaygpIHsKKwkJLy8gd2UgYXNzdW1lIGEgdGVzdCB3aXRoIElEIDQgZXhpc3RzLgorCQlUZXN0IHRlc3QgPSBlbnRpdHlNYW5hZ2VyLmxvYWQoVGVzdC5jbGFzcywgIjQiKTsKKworCQlNYXA8RW50aXR5LCBTdHJpbmc+IGFzYW1QYXRocyA9IGVudGl0eU1hbmFnZXIuZ2V0TGlua3MoQXJyYXlzLmFzTGlzdCh0ZXN0KSk7CisKKwkJYXNzZXJ0VGhhdChhc2FtUGF0aHMpLmhhc1NpemUoMSkuY29udGFpbnNPbmx5S2V5cyh0ZXN0KS5oYXNFbnRyeVNhdGlzZnlpbmcodGVzdCwKKwkJCQluZXcgQ29uZGl0aW9uPFN0cmluZz4ocyAtPiBzLnN0YXJ0c1dpdGgoZ2V0TGlua1ByZWZpeCgpKSwgIiIpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TGlua0FuZExvYWRPZHNJbnN0YW5jZSgpIHsKKwkJLy8gd2UgYXNzdW1lIGEgdGVzdCB3aXRoIElEIDQgZXhpc3RzLgorCQlsb25nIHRlc3RJZCA9IDRMOworCQlUZXN0IHRlc3QgPSBlbnRpdHlNYW5hZ2VyLmxvYWQoVGVzdC5jbGFzcywgTG9uZy50b1N0cmluZyh0ZXN0SWQpKTsKKworCQlNYXA8RW50aXR5LCBTdHJpbmc+IGFzYW1QYXRocyA9IGVudGl0eU1hbmFnZXIuZ2V0TGlua3MoQXJyYXlzLmFzTGlzdCh0ZXN0KSk7CisKKwkJYXNzZXJ0VGhhdChhc2FtUGF0aHMpLmhhc1NpemUoMSkuY29udGFpbnNPbmx5S2V5cyh0ZXN0KS5oYXNFbnRyeVNhdGlzZnlpbmcodGVzdCwKKwkJCQluZXcgQ29uZGl0aW9uPFN0cmluZz4ocyAtPiBzLnN0YXJ0c1dpdGgoZ2V0TGlua1ByZWZpeCgpKSwgIiIpKTsKKwkJLy8gV2UgdHJ5IHRvIGxvYWQgdGhlIGluc3RhbmNlIGZyb20gdGhlIE9EUyBTZXJ2ZXIgd2l0aCB0aGUgQXNhbVBhdGgsIGJ1dAorCQkvLyB3aXRob3V0IHRoZSBzZXJ2aWNlIHByZWZpeAorCQlTdHJpbmcgYXNhbVBhdGhXaXRob3V0U2VydmljZSA9IGFzYW1QYXRocy5nZXQodGVzdCkucmVwbGFjZShnZXRMaW5rUHJlZml4KCksICIiKTsKKworCQl0cnkgeworCQkJSW5zdGFuY2VFbGVtZW50IGllID0gKChPRFNDb250ZXh0KSBjb250ZXh0KS5nZXRBb1Nlc3Npb24oKS5nZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpCisJCQkJCS5nZXRJbnN0YW5jZUJ5QXNhbVBhdGgoYXNhbVBhdGhXaXRob3V0U2VydmljZSk7CisJCQlhc3NlcnRUaGF0KE9EU0NvbnZlcnRlci5mcm9tT0RTTG9uZyhpZS5nZXRJZCgpKSkuaXNFcXVhbFRvKHRlc3RJZCk7CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCUZhaWwuZmFpbCgKKwkJCQkJIkluc3RhbmNlIHdpdGggQXNhbVBhdGggJyIgKyBhc2FtUGF0aFdpdGhvdXRTZXJ2aWNlICsgIicgY291bGQgbm90IGJlIGxvYWRlZC4gUmVhc29uOiAiICsgZS5yZWFzb24sCisJCQkJCWUpOworCQl9CisJfQorCisJQG9yZy5qdW5pdC5UZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RHZXRMaW5rc1dpdGhJbnZhbGlkVHlwZSgpIHsKKwkJLy8gd2UgYXNzdW1lIGEgdGVzdCB3aXRoIElEIDQgZXhpc3RzLgorCQlUZXN0IHRlc3QgPSBlbnRpdHlNYW5hZ2VyLmxvYWQoVGVzdC5jbGFzcywgIjQiKTsKKwkJQmFzZUVudGl0eSBlbnRpdHkgPSBNb2NraXRvLm1vY2soQmFzZUVudGl0eS5jbGFzcyk7CisJCS8vIE1vY2sgYW4gZW50aXR5IHdpdGggYSBub24gZXhpc3RpbmcgVHlwZU5hbWUKKwkJd2hlbihlbnRpdHkuZ2V0VHlwZU5hbWUoKSkudGhlblJldHVybigiaW52YWxpZFR5cGUiKTsKKworCQllbnRpdHlNYW5hZ2VyLmdldExpbmtzKEFycmF5cy5hc0xpc3QodGVzdCwgZW50aXR5KSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldExpbmtzV2l0aEVuaXRpdHlXaXRoTWlzc2luZ0lkKCkgeworCQkvLyB3ZSBhc3N1bWUgYSB0ZXN0IHdpdGggSUQgNCBleGlzdHMuCisJCVRlc3QgdGVzdCA9IGVudGl0eU1hbmFnZXIubG9hZChUZXN0LmNsYXNzLCAiNCIpOworCisJCS8vIE1vY2sgYW4gZW50aXR5IHdpdGggYSBub24gZXhpc3RpbmcgSUQKKwkJVGVzdFN0ZXAgdGVzdFN0ZXAgPSBNb2NraXRvLm1vY2soVGVzdFN0ZXAuY2xhc3MpOworCQl3aGVuKHRlc3RTdGVwLmdldElEKCkpLnRoZW5SZXR1cm4oIi0xIik7CisKKwkJTWFwPEVudGl0eSwgU3RyaW5nPiBhc2FtUGF0aHMgPSBlbnRpdHlNYW5hZ2VyLmdldExpbmtzKEFycmF5cy5hc0xpc3QodGVzdCwgdGVzdFN0ZXApKTsKKworCQlhc3NlcnRUaGF0KGFzYW1QYXRocykuaGFzU2l6ZSgxKS5jb250YWluc09ubHlLZXlzKHRlc3QpLmhhc0VudHJ5U2F0aXNmeWluZyh0ZXN0LAorCQkJCW5ldyBDb25kaXRpb248U3RyaW5nPihzIC0+IHMuc3RhcnRzV2l0aChnZXRMaW5rUHJlZml4KCkpLCAiIikpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldExpbmtQcmVmaXgoKSB7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCJjb3JiYWxvYzo6MS4yQCVzOiVzL05hbWVTZXJ2aWNlLyVzLkFTQU0tT0RTIiwgbmFtZVNlcnZpY2VIb3N0LCBuYW1lU2VydmljZVBvcnQsCisJCQkJc2VydmljZU5hbWUpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9PRFNSb2xlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU1JvbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyYTlkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9PRFNSb2xlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX05BTUVTRVJWSUNFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fUEFTU1dPUkQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9TRVJWSUNFTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1VTRVI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5TZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkVudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlJvbGU7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworQElnbm9yZQorLy8gRklYTUUgMTAuNy4yMDE3OiB0aGlzIHRlc3QgbmVlZHMgYSBydW5uaW5nIE9EUyBTZXJ2ZXIsIHRoYXQgaXMgbm90IHN1aXRhYmxlIGZvciBjb250aW5vdXMgYnVpbGQgaW4gSmVua2lucy4KKy8vIENvbW1lbnQgdGhpcyBpbiBmb3IgbG9jYWwgdGVzdHMgb25seS4KK3B1YmxpYyBjbGFzcyBPRFNSb2xlVGVzdCB7CisKKwkvKgorCSAqIEFUVEVOVElPTjogPT09PT09PT09PQorCSAqCisJICogVG8gcnVuIHRoaXMgdGVzdCBtYWtlIHN1cmUgdGhlIHRhcmdldCBzZXJ2aWNlIGlzIHJ1bm5pbmcgYSBNRE0gZGVmYXVsdCBtb2RlbAorCSAqIGFuZCBhbnkgZGF0YWJhc2UgY29uc3RyYWludCB3aGljaCBlbmZvcmNlcyBhIHJlbGF0aW9uIG9mIFRlc3QgdG8gYSBwYXJlbnQKKwkgKiBlbnRpdHkgaXMgZGVhY3RpdmF0ZWQhCisJICovCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT0RTUm9sZVRlc3QuY2xhc3MpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU0VSVklDRSA9ICJjb3JiYWxvYzo6MS4yQCVzOiVzL05hbWVTZXJ2aWNlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSID0gInNhIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAic2EiOworCisJcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7CisJcHJpdmF0ZSBzdGF0aWMgRW50aXR5TWFuYWdlciBlbTsKKwlwcml2YXRlIHN0YXRpYyBFbnRpdHlGYWN0b3J5IGVudGl0eUZhY3Rvcnk7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBCZWZvcmVDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlSG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaG9zdCIpOworCQlTdHJpbmcgbmFtZVNlcnZpY2VQb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJwb3J0Iik7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic2VydmljZSIpOworCisJCWlmIChuYW1lU2VydmljZUhvc3QgPT0gbnVsbCB8fCBuYW1lU2VydmljZUhvc3QuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuYW1lIHNlcnZpY2UgaG9zdCBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdob3N0JyIpOworCQl9CisKKwkJbmFtZVNlcnZpY2VQb3J0ID0gbmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSA/IFN0cmluZy52YWx1ZU9mKDI4MDkpIDogbmFtZVNlcnZpY2VQb3J0OworCQlpZiAobmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIHBvcnQgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAncG9ydCciKTsKKwkJfQorCisJCWlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VOYW1lLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBuYW1lIGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3NlcnZpY2UnIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fTkFNRVNFUlZJQ0UsIFN0cmluZy5mb3JtYXQoTkFNRV9TRVJWSUNFLCBuYW1lU2VydmljZUhvc3QsIG5hbWVTZXJ2aWNlUG9ydCkpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fU0VSVklDRU5BTUUsIHNlcnZpY2VOYW1lICsgIi5BU0FNLU9EUyIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fVVNFUiwgVVNFUik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9QQVNTV09SRCwgUEFTU1dPUkQpOworCisJCWNvbnRleHQgPSBuZXcgT0RTQ29udGV4dEZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKwkJZW0gPSBjb250ZXh0LmdldEVudGl0eU1hbmFnZXIoKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKEVudGl0eU1hbmFnZXIuY2xhc3MpKTsKKwkJZW50aXR5RmFjdG9yeSA9IGNvbnRleHQuZ2V0RW50aXR5RmFjdG9yeSgpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVudGl0eSBtYW5hZ2VyIGZhY3Rvcnkgbm90IGF2YWlsYWJsZS4iKSk7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25BZnRlckNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQljb250ZXh0LmNsb3NlKCk7CisJCX0KKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TG9hZFJlbGF0ZWRVc2VycygpCisJCQl0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gZW0ubG9hZEFsbChVc2VyLmNsYXNzLCAic2EiKS5nZXQoMCk7CisJCUxpc3Q8Um9sZT4gcm9sZSA9IGVtLmxvYWRSZWxhdGVkRW50aXRpZXModXNlciwgInVzZXJzMmdyb3VwcyIsIFJvbGUuY2xhc3MpOworCisJCWFzc2VydFRoYXQocm9sZSkuaGFzU2l6ZSgxKS5leHRyYWN0aW5nKFJvbGU6OmdldE5hbWUpLmNvbnRhaW5zRXhhY3RseSgiTURNU3lzdGVtQWRtaW5pc3RyYXRvciIpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RMb2FkUmVsYXRlZFJvbGVzKCkKKwkJCXRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQlSb2xlIHJvbGUgPSBlbS5sb2FkQWxsKFJvbGUuY2xhc3MsICJNRE1TeXN0ZW1BZG1pbmlzdHJhdG9yIikuZ2V0KDApOworCQlMaXN0PFVzZXI+IHVzZXIgPSBlbS5sb2FkUmVsYXRlZEVudGl0aWVzKHJvbGUsICJncm91cHMydXNlcnMiLCBVc2VyLmNsYXNzKTsKKworCQlhc3NlcnRUaGF0KHVzZXIpLmhhc1NpemUoMSkuZXh0cmFjdGluZyhVc2VyOjpnZXROYW1lKS5jb250YWluc0V4YWN0bHkoInNhIik7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVVzZXJBbmRSb2xlKCkKKwkJCXRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQlTdHJpbmcgdXNlck5hbWUgPSAiQ3JlYXRlVXNlckFuZFJvbGUiOworCQlTdHJpbmcgcm9sZU5hbWUgPSAiQ3JlYXRlVXNlckFuZFJvbGUiOworCisJCXRyeSB7CisJCQlUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGVtLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKwkJCVVzZXIgdXNlciA9IGVudGl0eUZhY3RvcnkuY3JlYXRlVXNlcih1c2VyTmFtZSwgIlRlc3QiLCAiVXNlciIpOworCQkJUm9sZSByb2xlID0gZW50aXR5RmFjdG9yeS5jcmVhdGVSb2xlKHJvbGVOYW1lKTsKKwkJCXJvbGUuYWRkVXNlcih1c2VyKTsKKworCQkJdHJhbnNhY3Rpb24uY3JlYXRlKEFycmF5cy5hc0xpc3QodXNlciwgcm9sZSkpOworCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisKKwkJCWFzc2VydFRoYXQoZW0ubG9hZFJlbGF0ZWRFbnRpdGllcyhyb2xlLCAidXNlcnMyZ3JvdXBzIiwgVXNlci5jbGFzcykpLmhhc1NpemUoMSkuZXh0cmFjdGluZyhVc2VyOjpnZXROYW1lKQorCQkJCQkuY29udGFpbnModXNlck5hbWUpOworCisJCQlhc3NlcnRUaGF0KGVtLmxvYWRSZWxhdGVkRW50aXRpZXModXNlciwgImdyb3VwczJ1c2VycyIsIFJvbGUuY2xhc3MpKS5oYXNTaXplKDEpLmV4dHJhY3RpbmcoUm9sZTo6Z2V0TmFtZSkKKwkJCQkJLmNvbnRhaW5zKHJvbGVOYW1lKTsKKwkJfSBmaW5hbGx5IHsKKwkJCVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gZW0uc3RhcnRUcmFuc2FjdGlvbigpOworCQkJTGlzdDxVc2VyPiB1c2VycyA9IGVtLmxvYWRBbGwoVXNlci5jbGFzcywgdXNlck5hbWUpOworCQkJdHJhbnNhY3Rpb24uZGVsZXRlKHVzZXJzKTsKKwkJCUxpc3Q8Um9sZT4gcm9sZXMgPSBlbS5sb2FkQWxsKFJvbGUuY2xhc3MsIHJvbGVOYW1lKTsKKwkJCXRyYW5zYWN0aW9uLmRlbGV0ZShyb2xlcyk7CisJCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKKwkJfQorCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRNdWx0aXBsZVVzZXJzVG9OZXdSb2xlKCkKKwkJCXRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQlTdHJpbmcgcm9sZU5hbWUgPSAiQWRkTXVsdGlwbGVVc2Vyc1RvTmV3Um9sZSI7CisJCXRyeSB7CisJCQlUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGVtLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKwkJCUxpc3Q8VXNlcj4gdXNlcnMgPSBlbS5sb2FkQWxsKFVzZXIuY2xhc3MpOworCQkJUm9sZSByb2xlID0gZW50aXR5RmFjdG9yeS5jcmVhdGVSb2xlKHJvbGVOYW1lKTsKKworCQkJdXNlcnMuZm9yRWFjaCh1IC0+IHJvbGUuYWRkVXNlcih1KSk7CisJCQl0cmFuc2FjdGlvbi5jcmVhdGUoQXJyYXlzLmFzTGlzdChyb2xlKSk7CisJCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKKworCQkJYXNzZXJ0VGhhdChlbS5sb2FkUmVsYXRlZEVudGl0aWVzKHJvbGUsICJ1c2VyczJncm91cHMiLCBVc2VyLmNsYXNzKSkuaGFzU2l6ZSh1c2Vycy5zaXplKCkpOworCQl9IGZpbmFsbHkgeworCQkJVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBlbS5zdGFydFRyYW5zYWN0aW9uKCk7CisJCQlMaXN0PFJvbGU+IHJvbGVzID0gZW0ubG9hZEFsbChSb2xlLmNsYXNzLCByb2xlTmFtZSk7CisJCQl0cmFuc2FjdGlvbi5kZWxldGUocm9sZXMpOworCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisJCX0KKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVXNlckZyb21Sb2xlKCkKKwkJCXRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQlTdHJpbmcgdXNlck5hbWUgPSAiUmVtb3ZlVXNlckZyb21Sb2xlIjsKKwkJdHJ5IHsKKwkJCVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gZW0uc3RhcnRUcmFuc2FjdGlvbigpOworCQkJUm9sZSByb2xlID0gZW0ubG9hZChSb2xlLmNsYXNzLCAiMSIpOworCQkJVXNlciB1c2VyID0gZW50aXR5RmFjdG9yeS5jcmVhdGVVc2VyKHVzZXJOYW1lLCAiVXNlciIsICJVc2VyIik7CisKKwkJCXJvbGUuYWRkVXNlcih1c2VyKTsKKworCQkJdHJhbnNhY3Rpb24uY3JlYXRlKEFycmF5cy5hc0xpc3QodXNlcikpOworCQkJdHJhbnNhY3Rpb24udXBkYXRlKEFycmF5cy5hc0xpc3Qocm9sZSkpOworCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisKKwkJCWFzc2VydFRoYXQoZW0ubG9hZFJlbGF0ZWRFbnRpdGllcyhyb2xlLCAiZ3JvdXBzMnVzZXJzIiwgVXNlci5jbGFzcykpLmhhc1NpemUoMik7CisKKwkJCVJvbGUgcm9sZTIgPSBlbS5sb2FkKFJvbGUuY2xhc3MsICIxIik7CisJCQl0cmFuc2FjdGlvbiA9IGVtLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKwkJCXJvbGUyLnJlbW92ZVVzZXIodXNlcik7CisJCQl0cmFuc2FjdGlvbi51cGRhdGUoQXJyYXlzLmFzTGlzdChyb2xlMikpOworCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisKKwkJCWFzc2VydFRoYXQoZW0ubG9hZFJlbGF0ZWRFbnRpdGllcyhyb2xlMiwgImdyb3VwczJ1c2VycyIsIFVzZXIuY2xhc3MpKS5oYXNTaXplKDEpOworCQl9IGZpbmFsbHkgeworCQkJVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBlbS5zdGFydFRyYW5zYWN0aW9uKCk7CisJCQlMaXN0PFVzZXI+IHVzZXJzID0gZW0ubG9hZEFsbChVc2VyLmNsYXNzLCB1c2VyTmFtZSk7CisJCQl0cmFuc2FjdGlvbi5kZWxldGUodXNlcnMpOworCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvUmVsYXRpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvUmVsYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzZmZjM0MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9SZWxhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0U7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fVVNFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5TZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUGFyYW1ldGVyU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVjb3JkOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoLlJlbGF0aW9uU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CisKK0BJZ25vcmUKKy8vIEZJWE1FIDEwLjcuMjAxNzogdGhpcyB0ZXN0IG5lZWRzIGEgcnVubmluZyBPRFMgU2VydmVyLCB0aGF0IGlzIG5vdCBzdWl0YWJsZSBmb3IgY29udGlub3VzIGJ1aWxkIGluIEplbmtpbnMuCisvLyBDb21tZW50IHRoaXMgaW4gZm9yIGxvY2FsIHRlc3RzIG9ubHkuCitwdWJsaWMgY2xhc3MgUmVsYXRpb25UZXN0IHsKKworCS8qCisJICogQVRURU5USU9OOiA9PT09PT09PT09CisJICoKKwkgKiBUbyBydW4gdGhpcyB0ZXN0IG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IHNlcnZpY2UgaXMgcnVubmluZyBhIE1ETSBkZWZhdWx0IG1vZGVsCisJICogYW5kIGFueSBkYXRhYmFzZSBjb25zdHJhaW50IHdoaWNoIGVuZm9yY2VzIGEgcmVsYXRpb24gb2YgVGVzdCB0byBhIHBhcmVudAorCSAqIGVudGl0eSBpcyBkZWFjdGl2YXRlZCEKKwkgKi8KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFUlZJQ0UgPSAiY29yYmFsb2M6OjEuMkAlczolcy9OYW1lU2VydmljZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJzYSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInNhIjsKKworCXByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0OworCXByaXZhdGUgc3RhdGljIEVudGl0eU1hbmFnZXIgZW50aXR5TWFuYWdlcjsKKwlwcml2YXRlIHN0YXRpYyBNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyOworCXByaXZhdGUgc3RhdGljIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2U7CisJcHJpdmF0ZSBzdGF0aWMgU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQmVmb3JlQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCVN0cmluZyBuYW1lU2VydmljZUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImhvc3QiKTsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlUG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicG9ydCIpOworCQlTdHJpbmcgc2VydmljZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNlcnZpY2UiKTsKKworCQlpZiAobmFtZVNlcnZpY2VIb3N0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VIb3N0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIGhvc3QgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAnaG9zdCciKTsKKwkJfQorCisJCW5hbWVTZXJ2aWNlUG9ydCA9IG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkgPyBTdHJpbmcudmFsdWVPZigyODA5KSA6IG5hbWVTZXJ2aWNlUG9ydDsKKwkJaWYgKG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5hbWUgc2VydmljZSBwb3J0IGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3BvcnQnIik7CisJCX0KKworCQlpZiAoc2VydmljZU5hbWUgPT0gbnVsbCB8fCBzZXJ2aWNlTmFtZS5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgbmFtZSBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdzZXJ2aWNlJyIpOworCQl9CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjb25uZWN0aW9uUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX05BTUVTRVJWSUNFLCBTdHJpbmcuZm9ybWF0KE5BTUVfU0VSVklDRSwgbmFtZVNlcnZpY2VIb3N0LCBuYW1lU2VydmljZVBvcnQpKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1NFUlZJQ0VOQU1FLCBzZXJ2aWNlTmFtZSArICIuQVNBTS1PRFMiKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1VTRVIsIFVTRVIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fUEFTU1dPUkQsIFBBU1NXT1JEKTsKKworCQljb250ZXh0ID0gbmV3IE9EU0NvbnRleHRGYWN0b3J5KCkuY29ubmVjdChjb25uZWN0aW9uUGFyYW1ldGVycyk7CisJCWVudGl0eU1hbmFnZXIgPSBjb250ZXh0LmdldEVudGl0eU1hbmFnZXIoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKEVudGl0eU1hbmFnZXIuY2xhc3MpKTsKKwkJbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKE1vZGVsTWFuYWdlci5jbGFzcykpOworCQlxdWVyeVNlcnZpY2UgPSBjb250ZXh0LmdldFF1ZXJ5U2VydmljZSgpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBTZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24oUXVlcnlTZXJ2aWNlLmNsYXNzKSk7CisJCXNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTZWFyY2ggc2VydmljZSBub3QgYXZhaWxhYmxlLiIpKTsKKwl9CisKKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkFmdGVyQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCWNvbnRleHQuY2xvc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIGNoYW5nZXMgYSByZWxhdGlvbiBiZXR3ZWVuIGluc3RhbmNlcy4gVGhlcmUgbmVlZHMgdG8gZXhpc3QgYSBNZWFSZXN1bHQgb2YgaWQKKwkgKiAxMTAxIGFuZCBhIFBhcmFtZXRlclNldCBvZiBpZCAxMTAyIHdoaWNoIHdpbGwgYmUgcmVsYXRlZCBhZnRlciBydW5uaW5nIHRoaXMKKwkgKiB0ZXN0LiBJZiB0aGVzZSBkb24ndCBleGlzdCwgcGxlYXNlIGxlYXZlIHRoZSBmb2xsb3dpbmcgbGluZSBjb21tZW50ZWQsIG9yIHRoZQorCSAqIHRlc3Qgd2lsbCBmYWlsLgorCSAqIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgY2hhbmdlUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlkbWVhID0gIjExMDEiOworCQlTdHJpbmcgaWRwYXJhbXNldCA9ICIxMDAyIjsKKworCQlFbnRpdHlUeXBlIGV0bWVhc3VyZW1lbnQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShNZWFzdXJlbWVudC5jbGFzcyk7CisJCUVudGl0eVR5cGUgZXRwYXJhbXNldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFBhcmFtZXRlclNldC5jbGFzcyk7CisJCVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uOworCisJCXRyYW5zYWN0aW9uID0gZW50aXR5TWFuYWdlci5zdGFydFRyYW5zYWN0aW9uKCk7CisKKwkJdHJ5IHsKKwkJCUxpc3Q8TWVhc3VyZW1lbnQ+IG1lYWxpc3Q7CisJCQkvLyB3ZSB1c2UgdGhlIHNlYXJjaFNlcnZpY2UgdG8gZmV0Y2ggYSBtZWFzdXJlbWVudC4gUGxlYXNlIG5vdGUsIHRoYXQgd2UKKwkJCS8vIHVzZSB0aGUgcGVyIGRlZmF1bHQgZGVmaW5lZCBtZXRob2QgdG8gZmV0Y2ggdGhlIG1lYXN1cmVtZW50LgorCQkJLy8gVGhpcyBkb2VzIG5vdCBsb2FkIGFueSByZWxhdGVkIFBhcmFtZXRlclNldHMhIEJ1dAorCQkJLy8gd2UgZG9uJ3QgY2FyZSBhdCB0aGlzIHBvaW50LCBiZWNhdXNlIHdlIGp1c3Qgd2FudCB0byBjaGFuZ2UKKwkJCS8vIHRoZSByZWxhdGVkIFBhcmFtZXRlclNldCB0byBhIG5ldyBvbmUsIG5vdCBsb29rIGF0CisJCQkvLyB0aGUgZXhpc3RpbmcgcmVsYXRpb25zLgorCQkJbWVhbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goTWVhc3VyZW1lbnQuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXRtZWFzdXJlbWVudCwgaWRtZWEpKTsKKwkJCWFzc2VydEVxdWFscygxLCBtZWFsaXN0LnNpemUoKSk7CisJCQlNZWFzdXJlbWVudCBtZWEgPSBtZWFsaXN0LmdldCgwKTsKKworCQkJLy8gbG9hZCB0aGUgcGFyYW1ldGVyIHNldCB3aGljaCB3ZSB3YW50IHRvIHJlbGF0ZSB0byBvdXIgbWVhc3VybWVudC4KKwkJCS8vIGFnYWluIHdlIGRvbid0IGNhcmUgZm9yIGFueSBwcmVleGlzdGluZyByZWxhdGlvbnMuCisJCQlMaXN0PFBhcmFtZXRlclNldD4gcGFyYW1zZXRsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlQYXJhbWV0ZXJTZXQgcGFyYW1zZXQgPSBlbnRpdHlNYW5hZ2VyLmxvYWQoUGFyYW1ldGVyU2V0LmNsYXNzLCBpZHBhcmFtc2V0KTsKKwkJCXBhcmFtc2V0bGlzdC5hZGQocGFyYW1zZXQpOworCQkJLy8gTm90ZTogd2UgY2FuIG9ubHkgc2V0IHJlbGF0aW9ucyBpbiB0aGUgbXV0YWJsZSBzdG9yZSAod2hpY2gKKwkJCS8vIGRvZXNuJ3QgaW5jbHVkZSBwYXJlbnQtY2hpbGQtcmVsYXRpb25zKQorCQkJRW50aXR5U3RvcmUgc3RvcmUgPSBPRFNFbnRpdHlGYWN0b3J5LmdldE11dGFibGVTdG9yZShwYXJhbXNldCk7CisJCQlzdG9yZS5zZXQobWVhKTsKKwkJCWFzc2VydEVxdWFscyhzdG9yZS5nZXQoTWVhc3VyZW1lbnQuY2xhc3MpLCBtZWEpOworCisJCQl0cmFuc2FjdGlvbi51cGRhdGUocGFyYW1zZXRsaXN0KTsKKwkJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOworCisJCQkvLyByZWxvYWQgZnJvbSBkYXRhYmFzZSBhbmQgY2hlY2sgaWYgcmVsYXRpb24gaXMgY29uc2lzdGVudCB3aXRoCisJCQkvLyBleHBlY3RhdGlvbnMKKwkJCS8vIGZpcnN0IHdlIG5lZWQgdG8gYnVpbGQgb3VyIG93biBTZWFyY2hRdWVyeSwgYmVjYXVzZSB0aGUKKwkJCS8vIHByZWRlZmluZWQgb25lcyBkb24ndCBpbmNsdWRlIFBhcmFtZXRlclNldCBhcyBzdGF0ZWQgYWJvdmUuCisJCQlSZWxhdGlvblNlYXJjaFF1ZXJ5IG1xID0gbmV3IFJlbGF0aW9uU2VhcmNoUXVlcnkoKE9EU01vZGVsTWFuYWdlcikgbW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UpOworCQkJLy8gdGhlIFNlYXJjaFF1ZXJ5IGRlZmluZXMgaG93IHRvIGpvaW4gbWVhc3VyZW1lbnQgYW5kIHBhcmFtZXRlcnNldCwKKwkJCS8vIGJ1dCB3ZSBhbHNvIGhhdmUgdG8gZGVjbGFyZSB0aGF0IHdlIHdhbnQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQKKwkJCS8vIG1lYXN1cmVtZW50CisJCQlMaXN0PEVudGl0eVR5cGU+IGZldGNoTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJZmV0Y2hMaXN0LmFkZChldG1lYXN1cmVtZW50KTsKKwkJCUxpc3Q8UmVzdWx0PiBmZXRjaCA9IG1xLmZldGNoQ29tcGxldGUoZmV0Y2hMaXN0LCBGaWx0ZXIuaWRPbmx5KGV0cGFyYW1zZXQsIGlkcGFyYW1zZXQpKTsKKwkJCWFzc2VydEVxdWFscyhmZXRjaC5zaXplKCksIDEpOworCisJCQkvLyBub3cgd2UgY2FuIGNoZWNrIHRoYXQgdGhlIG5ldyByZWxhdGlvbiBpcyB0aGVyZSBhcyBleHBlY3RlZAorCQkJUmVjb3JkIHJlY29yZCA9IGZldGNoLmdldCgwKS5nZXRSZWNvcmQoZXRtZWFzdXJlbWVudCk7CisJCQlhc3NlcnROb3ROdWxsKHJlY29yZCk7CisJCQlhc3NlcnRFcXVhbHMocmVjb3JkLmdldElEKCksIGlkbWVhKTsKKworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCXRyYW5zYWN0aW9uLmFib3J0KCk7CisJCQl0aHJvdyBlOworCQl9CisKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvUGVha05vdGlmaWNhdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vcGVhay9QZWFrTm90aWZpY2F0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzRjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvUGVha05vdGlmaWNhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDMzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb24ucGVhazsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0U7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fVVNFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQUlETmFtZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQUlETmFtZVZhbHVlU2VxVW5pdElkOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsRWxlbUFjY2VzczsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQXBwbGljYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5hc2FtLm9kcy5UU19VbmlvblNlcTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVFNfVmFsdWVTZXE7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkVudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb24uT0RTTm90aWZpY2F0aW9uU2VydmljZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRDYXB0b3I7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIFRlc3Qgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisgKiAKKyAqIE5lZWRzIGEgcnVubmluZyBPRFMgYW5kIE5vdGlmaWNhdGlvbiBTZXJ2ZXIuIEFzc3VtZXMgYW4gZXhpc3RpbmcgVGVzdCB3aXRoCisgKiBuYW1lIGRlZmluZWQgaW4ge0BsaW5rIFBlYWtOb3RpZmljYXRpb25UZXN0I1BBUkVOVF9URVNUfSwgYW4gVW5pdFVuZGVyVGVzdAorICogd2l0aCBJRCAxMSBhbmQgYW4gVW5pdFVuZGVyVGVzdFBhcnQgd2l0aCBJRCAzNC4KKyAqIAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICoKKyAqLworQElnbm9yZQorLy8gRklYTUUgMTAuNy4yMDE3OiB0aGlzIHRlc3QgbmVlZHMgYSBydW5uaW5nIE9EUyBTZXJ2ZXIsIHRoYXQgaXMgbm90IHN1aXRhYmxlIGZvciBjb250aW5vdXMgYnVpbGQgaW4gSmVua2lucy4KKy8vIENvbW1lbnQgdGhpcyBpbiBmb3IgbG9jYWwgdGVzdHMgb25seS4KK3B1YmxpYyBjbGFzcyBQZWFrTm90aWZpY2F0aW9uVGVzdCB7CisKKwkvKgorCSAqIEFUVEVOVElPTjogPT09PT09PT09PQorCSAqCisJICogVG8gcnVuIHRoaXMgdGVzdCBtYWtlIHN1cmUgdGhlIHRhcmdldCBzZXJ2aWNlIGlzIHJ1bm5pbmcgYSBNRE0gZGVmYXVsdCBtb2RlbAorCSAqIGFuZCBhbnkgZGF0YWJhc2UgY29uc3RyYWludCB3aGljaCBlbmZvcmNlcyBhIHJlbGF0aW9uIG9mIFRlc3QgdG8gYSBwYXJlbnQKKwkgKiBlbnRpdHkgaXMgZGVhY3RpdmF0ZWQhCisJICovCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRXZlbnRQcm9jZXNzb3IuY2xhc3MpOworCisJLy8gVE9ETyBuYW1lIHNlcnZpY2U6IGNvcmJhbG9jOjoxLjJAPFNFUlZFUl9JUD46PFNFUlZFUl9QT1JUPi9OYW1lU2VydmljZQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFUlZJQ0UgPSAiY29yYmFsb2M6OjEuMkAxMjcuMC4wLjE6MjgwOS9OYW1lU2VydmljZSI7CisKKwkvLyBUT0RPIHNlcnZpY2UgbmFtZTogPFNFUlZJQ0VfTkFNRT4uQVNBTS1PRFMKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FID0gIk1ETU5WSC5BU0FNLU9EUyI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJzYSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInNhIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfVEVTVCA9ICJQQk5fVU5FQ0VfUjUxXzEzMDIyMDE0XzEzNDkiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9VUkwgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2FwaSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9SRUdJU1RSQVRJT05fTkFNRSA9ICJtZG0iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fVVNFUiA9ICJzYSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9QQVNTV09SRCA9ICJzYSI7CisKKwlwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dDsKKwlwcml2YXRlIHN0YXRpYyBFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXI7CisJcHJpdmF0ZSBzdGF0aWMgTm90aWZpY2F0aW9uU2VydmljZSBub3RpZmljYXRpb25NYW5hZ2VyOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQmVmb3JlQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gY29ubmVjdGlvblBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9OQU1FU0VSVklDRSwgTkFNRV9TRVJWSUNFKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1NFUlZJQ0VOQU1FLCBTRVJWSUNFX05BTUUpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fVVNFUiwgVVNFUik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9QQVNTV09SRCwgUEFTU1dPUkQpOworCisJCWNvbnRleHQgPSBuZXcgT0RTQ29udGV4dEZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG5vdGlmaWNhdGlvblBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCW5vdGlmaWNhdGlvblBhcmFtZXRlcnMucHV0KE9EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5LlBBUkFNX1NFUlZFUl9UWVBFLAorCQkJCU9EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5LlNFUlZFUl9UWVBFX1BFQUspOworCQlub3RpZmljYXRpb25QYXJhbWV0ZXJzLnB1dChPRFNOb3RpZmljYXRpb25TZXJ2aWNlRmFjdG9yeS5QQVJBTV9VUkwsIE5PVElGSUNBVElPTl9VUkwpOworCQlub3RpZmljYXRpb25QYXJhbWV0ZXJzLnB1dChPRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9VU0VSLCBOT1RJRklDQVRJT05fVVNFUik7CisJCW5vdGlmaWNhdGlvblBhcmFtZXRlcnMucHV0KE9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1BBU1NXT1JELCBOT1RJRklDQVRJT05fUEFTU1dPUkQpOworCisJCW5vdGlmaWNhdGlvbk1hbmFnZXIgPSBuZXcgT0RTTm90aWZpY2F0aW9uU2VydmljZUZhY3RvcnkoKS5jcmVhdGUoY29udGV4dCwgbm90aWZpY2F0aW9uUGFyYW1ldGVycyk7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25BZnRlckNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24sIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCWNvbnRleHQuY2xvc2UoKTsKKwkJfQorCisJCWlmIChub3RpZmljYXRpb25NYW5hZ2VyICE9IG51bGwpIHsKKwkJCW5vdGlmaWNhdGlvbk1hbmFnZXIuZGVyZWdpc3RlcihOT1RJRklDQVRJT05fUkVHSVNUUkFUSU9OX05BTUUpOworCQkJbm90aWZpY2F0aW9uTWFuYWdlci5jbG9zZSh0cnVlKTsKKwkJfQorCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUZXN0U3RlcCgpIHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24sIERhdGFBY2Nlc3NFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRlc3RTdGVwTmFtZSA9IFVTRVIgKyAiX1Rlc3RTdGVwIjsKKworCQlOb3RpZmljYXRpb25MaXN0ZW5lciBsID0gTW9ja2l0by5tb2NrKE5vdGlmaWNhdGlvbkxpc3RlbmVyLmNsYXNzKTsKKworCQlub3RpZmljYXRpb25NYW5hZ2VyLnJlZ2lzdGVyKE5PVElGSUNBVElPTl9SRUdJU1RSQVRJT05fTkFNRSwgbmV3IE5vdGlmaWNhdGlvbkZpbHRlcigpLCBsKTsKKworCQl0cnkgeworCQkJY3JlYXRlVGVzdFN0ZXAoUEFSRU5UX1RFU1QsIHRlc3RTdGVwTmFtZSk7CisKKwkJCS8vIG1ha2Ugc3VyZSBub3RpZmljYXRpb24gaGFzIHNvbWUgdGltZSB0byBiZSBwdXNoZWQKKwkJCVRocmVhZC5zbGVlcCgxMDAwTCk7CisKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKKwkJCUFyZ3VtZW50Q2FwdG9yPExpc3Q8VGVzdFN0ZXA+PiB0ZXN0U3RlcENhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKChDbGFzcykgTGlzdC5jbGFzcyk7CisJCQlBcmd1bWVudENhcHRvcjxVc2VyPiB1c2VyQ2FwdG9yID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoVXNlci5jbGFzcyk7CisKKwkJCXZlcmlmeShsLCB0aW1lcygxKSkuaW5zdGFuY2VDcmVhdGVkKHRlc3RTdGVwQ2FwdG9yLmNhcHR1cmUoKSwgdXNlckNhcHRvci5jYXB0dXJlKCkpOworCisJCQlhc3NlcnRUaGF0KHRlc3RTdGVwQ2FwdG9yLmdldFZhbHVlKCkuc2l6ZSgpLCBpcygxKSk7CisJCQlhc3NlcnRUaGF0KHRlc3RTdGVwQ2FwdG9yLmdldFZhbHVlKCkuZ2V0KDApLmdldE5hbWUoKSwgaXModGVzdFN0ZXBOYW1lKSk7CisJCQlhc3NlcnRUaGF0KHVzZXJDYXB0b3IuZ2V0VmFsdWUoKS5nZXROYW1lKCksIGlzKFVTRVIpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCW5vdGlmaWNhdGlvbk1hbmFnZXIuZGVyZWdpc3RlcihOT1RJRklDQVRJT05fUkVHSVNUUkFUSU9OX05BTUUpOworCQkJZGVsZXRlVGVzdFN0ZXAodGVzdFN0ZXBOYW1lKTsKKwkJfQorCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb250ZXh0Um9vdCgpCisJCQl0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlOb3RpZmljYXRpb25MaXN0ZW5lciBsID0gTW9ja2l0by5tb2NrKE5vdGlmaWNhdGlvbkxpc3RlbmVyLmNsYXNzKTsKKworCQlub3RpZmljYXRpb25NYW5hZ2VyLnJlZ2lzdGVyKE5PVElGSUNBVElPTl9SRUdJU1RSQVRJT05fTkFNRSwgbmV3IE5vdGlmaWNhdGlvbkZpbHRlcigpLCBsKTsKKworCQl0cnkgeworCQkJdXBkYXRlVVVUKDExLCAiYXBwbGljYXRpb24veC1hc2FtLmFvdW5pdHVuZGVydGVzdC51bml0dW5kZXJ0ZXN0Iik7CisKKwkJCS8vIG1ha2Ugc3VyZSBub3RpZmljYXRpb24gaGFzIHNvbWUgdGltZSB0byBiZSBwdXNoZWQKKwkJCVRocmVhZC5zbGVlcCgxMDAwTCk7CisKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKKwkJCUFyZ3VtZW50Q2FwdG9yPExpc3Q8RW50aXR5Pj4gZW50aXR5Q2FwdG9yID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoKENsYXNzKSBMaXN0LmNsYXNzKTsKKwkJCUFyZ3VtZW50Q2FwdG9yPFVzZXI+IHVzZXJDYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhVc2VyLmNsYXNzKTsKKworCQkJdmVyaWZ5KGwsIHRpbWVzKDEpKS5pbnN0YW5jZU1vZGlmaWVkKGVudGl0eUNhcHRvci5jYXB0dXJlKCksIHVzZXJDYXB0b3IuY2FwdHVyZSgpKTsKKworCQkJYXNzZXJ0VGhhdChlbnRpdHlDYXB0b3IuZ2V0VmFsdWUoKS5zaXplKCksIGlzKDEpKTsKKwkJCWFzc2VydFRoYXQoZW50aXR5Q2FwdG9yLmdldFZhbHVlKCkuZ2V0KDApLmdldE5hbWUoKSwgaXMoIlBCTl9VTkVDRV9SNTFfTGVmdF9BY2NWIikpOworCQkJYXNzZXJ0VGhhdCh1c2VyQ2FwdG9yLmdldFZhbHVlKCkuZ2V0TmFtZSgpLCBpcyhVU0VSKSk7CisJCX0gZmluYWxseSB7CisJCQlub3RpZmljYXRpb25NYW5hZ2VyLmRlcmVnaXN0ZXIoTk9USUZJQ0FUSU9OX1JFR0lTVFJBVElPTl9OQU1FKTsKKwkJfQorCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb250ZXh0Q29tcG9uZW50KCkKKwkJCXRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24sIERhdGFBY2Nlc3NFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCU5vdGlmaWNhdGlvbkxpc3RlbmVyIGwgPSBNb2NraXRvLm1vY2soTm90aWZpY2F0aW9uTGlzdGVuZXIuY2xhc3MpOworCisJCW5vdGlmaWNhdGlvbk1hbmFnZXIucmVnaXN0ZXIoTk9USUZJQ0FUSU9OX1JFR0lTVFJBVElPTl9OQU1FLCBuZXcgTm90aWZpY2F0aW9uRmlsdGVyKCksIGwpOworCisJCXRyeSB7CisJCQl1cGRhdGVVVVRQKDM0LCAidGVzdCIpOworCisJCQkvLyBtYWtlIHN1cmUgbm90aWZpY2F0aW9uIGhhcyBzb21lIHRpbWUgdG8gYmUgcHVzaGVkCisJCQlUaHJlYWQuc2xlZXAoMTAwMEwpOworCisJCQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCisJCQlBcmd1bWVudENhcHRvcjxMaXN0PEVudGl0eT4+IGVudGl0eUNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKChDbGFzcykgTGlzdC5jbGFzcyk7CisJCQlBcmd1bWVudENhcHRvcjxVc2VyPiB1c2VyQ2FwdG9yID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoVXNlci5jbGFzcyk7CisKKwkJCXZlcmlmeShsLCB0aW1lcygxKSkuaW5zdGFuY2VNb2RpZmllZChlbnRpdHlDYXB0b3IuY2FwdHVyZSgpLCB1c2VyQ2FwdG9yLmNhcHR1cmUoKSk7CisKKwkJCWFzc2VydFRoYXQoZW50aXR5Q2FwdG9yLmdldFZhbHVlKCkuc2l6ZSgpLCBpcygxKSk7CisJCQlhc3NlcnRUaGF0KGVudGl0eUNhcHRvci5nZXRWYWx1ZSgpLmdldCgwKS5nZXROYW1lKCksIGlzKCJQQk5fVU5FQ0VfUjUxX0xlZnRfU3RlYWR5ViIpKTsKKwkJCWFzc2VydFRoYXQodXNlckNhcHRvci5nZXRWYWx1ZSgpLmdldE5hbWUoKSwgaXMoVVNFUikpOworCQl9IGZpbmFsbHkgeworCQkJbm90aWZpY2F0aW9uTWFuYWdlci5kZXJlZ2lzdGVyKE5PVElGSUNBVElPTl9SRUdJU1RSQVRJT05fTkFNRSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN0ZXAoU3RyaW5nIHBhcmVudE5hbWUsIFN0cmluZyBuYW1lKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gZW50aXR5TWFuYWdlci5zdGFydFRyYW5zYWN0aW9uKCk7CisKKwkJTGlzdDxUZXN0PiB0ZXN0cyA9IGVudGl0eU1hbmFnZXIubG9hZEFsbChUZXN0LmNsYXNzLCBwYXJlbnROYW1lKTsKKworCQlhc3NlcnRUaGF0KCJQYXJlbnQgdGVzdCBub3QgZm91bmQhIiwgIXRlc3RzLmlzRW1wdHkoKSk7CisKKwkJT3B0aW9uYWw8PyBleHRlbmRzIEVudGl0eUZhY3Rvcnk+IGVudGl0eUZhY3RvcnkgPSBjb250ZXh0LmdldEVudGl0eUZhY3RvcnkoKTsKKwkJaWYgKCFlbnRpdHlGYWN0b3J5LmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnRpdHkgZmFjdG9yeSBub3QgcHJlc2VudCEiKTsKKwkJfQorCisJCVRlc3RTdGVwIHRlc3RTdGVwID0gZW50aXR5RmFjdG9yeS5nZXQoKS5jcmVhdGVUZXN0U3RlcChuYW1lLCB0ZXN0cy5nZXQoMCkpOworCQl0ZXN0U3RlcC5zZXRTb3J0SW5kZXgoMCk7CisKKwkJdHJhbnNhY3Rpb24uY3JlYXRlKEFycmF5cy5hc0xpc3QodGVzdFN0ZXApKTsKKworCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZXRlVGVzdFN0ZXAoU3RyaW5nIG5hbWUpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBlbnRpdHlNYW5hZ2VyLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKworCQlMaXN0PFRlc3RTdGVwPiB0ZXN0U3RlcHMgPSBlbnRpdHlNYW5hZ2VyLmxvYWRBbGwoVGVzdFN0ZXAuY2xhc3MsIG5hbWUpOworCisJCXRyYW5zYWN0aW9uLmRlbGV0ZSh0ZXN0U3RlcHMpOworCisJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVVVVQoaW50IHV1dElkLCBTdHJpbmcgbmV3VmFsdWUpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQlBb1Nlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisJCXRyeSB7CisJCQlzZXNzaW9uID0gKChPRFNDb250ZXh0KSBjb250ZXh0KS5nZXRBb1Nlc3Npb24oKS5jcmVhdGVDb1Nlc3Npb24oKTsKKworCQkJQXBwbGljYXRpb25FbGVtZW50IGFlVVVUID0gc2Vzc2lvbi5nZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmdldEVsZW1lbnRzQnlCYXNlVHlwZSgiQW9Vbml0VW5kZXJUZXN0IilbMF07CisKKwkJCWZpbmFsIEFwcGxFbGVtQWNjZXNzIGFlYSA9IHNlc3Npb24uZ2V0QXBwbEVsZW1BY2Nlc3MoKTsKKworCQkJVFNfVW5pb25TZXEgdUlkID0gbmV3IFRTX1VuaW9uU2VxKCk7CisJCQl1SWQubG9uZ2xvbmdWYWwobmV3IFRfTE9OR0xPTkdbXSB7IG5ldyBUX0xPTkdMT05HKDAsIHV1dElkKSB9KTsKKworCQkJVFNfVW5pb25TZXEgdU1hbnVmYWN0dXJlciA9IG5ldyBUU19VbmlvblNlcSgpOworCQkJdU1hbnVmYWN0dXJlci5zdHJpbmdWYWwobmV3IFN0cmluZ1tdIHsgbmV3VmFsdWUgfSk7CisKKwkJCUFJRE5hbWVWYWx1ZVNlcVVuaXRJZFtdIHZhbCA9IG5ldyBBSUROYW1lVmFsdWVTZXFVbml0SWRbXSB7CisJCQkJCW5ldyBBSUROYW1lVmFsdWVTZXFVbml0SWQobmV3IEFJRE5hbWUoYWVVVVQuZ2V0SWQoKSwgIklkIiksIG5ldyBUX0xPTkdMT05HKCksCisJCQkJCQkJbmV3IFRTX1ZhbHVlU2VxKHVJZCwgbmV3IHNob3J0W10geyAoc2hvcnQpIDE1IH0pKSwKKwkJCQkJbmV3IEFJRE5hbWVWYWx1ZVNlcVVuaXRJZChuZXcgQUlETmFtZShhZVVVVC5nZXRJZCgpLCAiTWltZXR5cGUiKSwgbmV3IFRfTE9OR0xPTkcoKSwKKwkJCQkJCQluZXcgVFNfVmFsdWVTZXEodU1hbnVmYWN0dXJlciwgbmV3IHNob3J0W10geyAoc2hvcnQpIDE1IH0pKSB9OworCQkJc2Vzc2lvbi5zdGFydFRyYW5zYWN0aW9uKCk7CisJCQlhZWEudXBkYXRlSW5zdGFuY2VzKHZhbCk7CisJCQlzZXNzaW9uLmNvbW1pdFRyYW5zYWN0aW9uKCk7CisKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oZS5yZWFzb24sIGUpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXNlc3Npb24uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQkJCUxPR0dFUi53YXJuKCJFeGNlcHRpb24gd2hlbiBjbG9zaW5nIHRoZSBvZHMgc2Vzc2lvbjogIiArIGUucmVhc29uLCBlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlVVVUUChpbnQgdHlyZUlkLCBTdHJpbmcgbmV3VmFsdWUpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQlBb1Nlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisJCXRyeSB7CisJCQlzZXNzaW9uID0gKChPRFNDb250ZXh0KSBjb250ZXh0KS5nZXRBb1Nlc3Npb24oKS5jcmVhdGVDb1Nlc3Npb24oKTsKKworCQkJQXBwbGljYXRpb25FbGVtZW50IGFlVHlyZSA9IHNlc3Npb24uZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5nZXRFbGVtZW50QnlOYW1lKCJ0eXJlIik7CisKKwkJCWZpbmFsIEFwcGxFbGVtQWNjZXNzIGFlYSA9IHNlc3Npb24uZ2V0QXBwbEVsZW1BY2Nlc3MoKTsKKworCQkJVFNfVW5pb25TZXEgdUlkID0gbmV3IFRTX1VuaW9uU2VxKCk7CisJCQl1SWQubG9uZ2xvbmdWYWwobmV3IFRfTE9OR0xPTkdbXSB7IG5ldyBUX0xPTkdMT05HKDAsIHR5cmVJZCkgfSk7CisKKwkJCVRTX1VuaW9uU2VxIHVNYW51ZmFjdHVyZXIgPSBuZXcgVFNfVW5pb25TZXEoKTsKKwkJCXVNYW51ZmFjdHVyZXIuc3RyaW5nVmFsKG5ldyBTdHJpbmdbXSB7IG5ld1ZhbHVlIH0pOworCisJCQlBSUROYW1lVmFsdWVTZXFVbml0SWRbXSB2YWwgPSBuZXcgQUlETmFtZVZhbHVlU2VxVW5pdElkW10geworCQkJCQluZXcgQUlETmFtZVZhbHVlU2VxVW5pdElkKG5ldyBBSUROYW1lKGFlVHlyZS5nZXRJZCgpLCAiSWQiKSwgbmV3IFRfTE9OR0xPTkcoKSwKKwkJCQkJCQluZXcgVFNfVmFsdWVTZXEodUlkLCBuZXcgc2hvcnRbXSB7IChzaG9ydCkgMTUgfSkpLAorCQkJCQluZXcgQUlETmFtZVZhbHVlU2VxVW5pdElkKG5ldyBBSUROYW1lKGFlVHlyZS5nZXRJZCgpLCAibWFudWZhY3R1cmVyIiksIG5ldyBUX0xPTkdMT05HKCksCisJCQkJCQkJbmV3IFRTX1ZhbHVlU2VxKHVNYW51ZmFjdHVyZXIsIG5ldyBzaG9ydFtdIHsgKHNob3J0KSAxNSB9KSkgfTsKKwkJCXNlc3Npb24uc3RhcnRUcmFuc2FjdGlvbigpOworCQkJYWVhLnVwZGF0ZUluc3RhbmNlcyh2YWwpOworCQkJc2Vzc2lvbi5jb21taXRUcmFuc2FjdGlvbigpOworCisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKGUucmVhc29uLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChzZXNzaW9uICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlzZXNzaW9uLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJCQlMT0dHRVIud2FybigiRXhjZXB0aW9uIHdoZW4gY2xvc2luZyB0aGUgb2RzIHNlc3Npb246ICIgKyBlLnJlYXNvbiwgZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvT0RTRnJlZVRleHRTZWFyY2hUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU0ZyZWVUZXh0U2VhcmNoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjI2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU0ZyZWVUZXh0U2VhcmNoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlDb2xsZWN0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUNvbGxlY3Rpb25PZjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ0VzY2FwZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guY29tbW9uLnNldHRpbmdzLlNldHRpbmdzOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLm5vZGUuTm9kZTsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5ub2RlLk5vZGVCdWlsZGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CisKK3B1YmxpYyBjbGFzcyBPRFNGcmVlVGV4dFNlYXJjaFRlc3QgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gImh0dHA6Ly9sb2NhbGhvc3Q6OTMwMSI7CisJcHJpdmF0ZSBFbnRpdHlMb2FkZXIgbG9hZGVyOworCXByaXZhdGUgT0RTRnJlZVRleHRTZWFyY2ggZnRzOworCXByaXZhdGUgRW50aXR5IHRzOworCisJcHJpdmF0ZSBzdGF0aWMgTm9kZSBlbGFzdGljU2VhcmNoTm9kZTsKKworCXByaXZhdGUgc3RhdGljIENsaWVudCBjbGllbnQ7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZSB0ZW1wRGlyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZWxhc3RpY3NlYXJjaC10ZW1wIiwgTG9uZy50b1N0cmluZyhTeXN0ZW0ubmFub1RpbWUoKSkpOworCQl0ZW1wRGlyLmRlbGV0ZSgpOworCQl0ZW1wRGlyLm1rZGlyKCk7CisKKwkJU3RyaW5nIGNsdXN0ZXJOYW1lID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJZWxhc3RpY1NlYXJjaE5vZGUgPSBOb2RlQnVpbGRlci5ub2RlQnVpbGRlcigpLmxvY2FsKHRydWUpLmNsdXN0ZXJOYW1lKGNsdXN0ZXJOYW1lKQorCQkJCS5zZXR0aW5ncyhTZXR0aW5ncy5zZXR0aW5nc0J1aWxkZXIoKQorCQkJCQkJLnB1dCgicGF0aC5ob21lIiwgRmlsZS5jcmVhdGVUZW1wRmlsZSgiZWxhc3RpY3NlYXJjaCIsICIiKS5nZXRQYXJlbnQoKSkKKwkJCQkJCS5wdXQoImluZGV4Lm51bWJlcl9vZl9zaGFyZHMiLCAxKS5wdXQoImluZGV4Lm51bWJlcl9vZl9yZXBsaWNhcyIsIDApLnB1dCgiaHR0cC5wb3J0IiwgOTMwMSkpCisJCQkJLm5vZGUoKTsKKwkJZWxhc3RpY1NlYXJjaE5vZGUuc3RhcnQoKTsKKwkJY2xpZW50ID0gZWxhc3RpY1NlYXJjaE5vZGUuY2xpZW50KCk7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXRzID0gbW9jayhUZXN0U3RlcC5jbGFzcyk7CisJCWxvYWRlciA9IG1vY2soRW50aXR5TG9hZGVyLmNsYXNzKTsKKwkJTGlzdDxFbnRpdHk+IHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl0c0xpc3QuYWRkKHRzKTsKKwkJd2hlbihsb2FkZXIubG9hZEFsbChhbnkoS2V5LmNsYXNzKSwgYW55Q29sbGVjdGlvbigpKSkudGhlbkFuc3dlcihuZXcgQW5zd2VyPExpc3Q8RW50aXR5Pj4oKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIExpc3Q8RW50aXR5PiBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKKwkJCQlDb2xsZWN0aW9uPExvbmc+IG9iamVjdCA9IChDb2xsZWN0aW9uPExvbmc+KSBpbnZvY2F0aW9uLmdldEFyZ3VtZW50cygpWzFdOworCisJCQkJTGlzdDxFbnRpdHk+IHJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0LnNpemUoKTsgaSsrKSB7CisJCQkJCXJlcy5hZGQodHMpOworCQkJCX0KKworCQkJCXJldHVybiByZXM7CisJCQl9CisJCX0pOworCisJCWZ0cyA9IG5ldyBPRFNGcmVlVGV4dFNlYXJjaChsb2FkZXIsICJtZG0iLCBIT1NUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG5vSW5kZXhfZW1wdHlSZXN1bHQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU9EU0ZyZWVUZXh0U2VhcmNoIGZ0c090aGVySW5kZXggPSBuZXcgT0RTRnJlZVRleHRTZWFyY2gobG9hZGVyLCAiVU5LTk9XTl9JTkRFWCIsIEhPU1QpOworCisJCU1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxFbnRpdHk+PiBtYXAgPSBmdHNPdGhlckluZGV4LnNlYXJjaCgiVkFHXzAwMiIpOworCQlhc3NlcnRUcnVlKG1hcC5pc0VtcHR5KCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZXhhbXBsZUluZGV4X3F1ZXJ5U3VjY2Vzc2Z1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlRXhhbXBsZUluZGV4KCJUZXN0U3RlcCIsICJtZG0iLCAiYXNkZiIpOworCisJCU1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxFbnRpdHk+PiBzZWFyY2ggPSBmdHMuc2VhcmNoKCJhc2RmIik7CisJCWFzc2VydEVxdWFscyh0cywgc2VhcmNoLmdldChUZXN0U3RlcC5jbGFzcykuZ2V0KDApKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNwZWNpYWxDaGFyYWN0ZXJzX2NvcnJlY3RseUVzY2FwZWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQljcmVhdGVFeGFtcGxlSW5kZXgoIk1lYXN1cmVtZW50IiwgIm1kbSIsICJoYWxsb1wiIcKnIik7CisKKwkJTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PEVudGl0eT4+IHNlYXJjaCA9IGZ0cy5zZWFyY2goImhhbGxvXCIhwqciKTsKKwkJYXNzZXJ0RXF1YWxzKHRzLCBzZWFyY2guZ2V0KE1lYXN1cmVtZW50LmNsYXNzKS5nZXQoMCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbm9uTWRtUmVzdWx0c19pZ25vcmVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJY3JlYXRlRXhhbXBsZUluZGV4KCJOT05NRE1TdHVmZiIsICJtZG0iLCAidGVzdCIpOworCisJCU1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxFbnRpdHk+PiBzZWFyY2ggPSBmdHMuc2VhcmNoKCJ0ZXN0Iik7CisJCWFzc2VydFRydWUoc2VhcmNoLmlzRW1wdHkoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0d29SZXN1bHRzX3R3b1Jlc3VsdHNSZXR1bmVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJY3JlYXRlRXhhbXBsZUluZGV4KCJUZXN0IiwgIm1kbSIsICJ1bmljb3JuIEFTREYiLCAiMCIpOworCQljcmVhdGVFeGFtcGxlSW5kZXgoIlRlc3QiLCAibWRtIiwgInVuaWNvcm4gWFlaIiwgIjEiKTsKKworCQlNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIExpc3Q8RW50aXR5Pj4gc2VhcmNoID0gZnRzLnNlYXJjaCgidW5pY29ybiIpOworCQlhc3NlcnRFcXVhbHMoMiwgc2VhcmNoLmdldChvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdC5jbGFzcykuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBpbGxlZ2FsTG9hZFJlcXVlc3RfbmljZUV4Y2VwdGlvbklzVGhyb3duKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJbG9hZGVyID0gbW9jayhFbnRpdHlMb2FkZXIuY2xhc3MpOworCQl3aGVuKGxvYWRlci5sb2FkQWxsKGFueSgpLCBhbnlDb2xsZWN0aW9uT2YoU3RyaW5nLmNsYXNzKSkpLnRoZW5UaHJvdyhuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiIikpOworCQljcmVhdGVFeGFtcGxlSW5kZXgoIlRlc3RTdGVwIiwgIm1kbTIiLCAiYXNkZiIpOworCQlPRFNGcmVlVGV4dFNlYXJjaCBmdHMyID0gbmV3IE9EU0ZyZWVUZXh0U2VhcmNoKGxvYWRlciwgIm1kbTIiLCBIT1NUKTsKKworCQlmdHMyLnNlYXJjaCgiYXNkZiIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVFeGFtcGxlSW5kZXgoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUV4YW1wbGVJbmRleCh0eXBlLCBuYW1lLCB2YWx1ZSwgIjAiKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlRXhhbXBsZUluZGV4KFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgaWQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCVN0cmluZyBqc29uID0gIntcImF0dHJcIjpcIiIgKyBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVKc29uKHZhbHVlKSArICJcIn0iOworCisJCWNsaWVudC5wcmVwYXJlSW5kZXgobmFtZSwgdHlwZSwgaWQpLnNldFNvdXJjZShqc29uKS5nZXQoKTsKKworCQlUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIGxldCB0aGUgaW5kZXggc29tZSB0aW1lIHRvIHBvcHVsYXRlCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU1NlYXJjaFNlcnZpY2VJVC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNTZWFyY2hTZXJ2aWNlSVQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWE1NDIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNTZWFyY2hTZXJ2aWNlSVQuamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLnR1cGxlOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0U7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fVVNFUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5pdGVyYWJsZS5FeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5ncm91cHMuVHVwbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLk1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUGFyYW1ldGVyU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQm9vbGVhbk9wZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5CcmFja2V0T3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkNvbXBhcmlzb25PcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5Kb2luVHJlZS5Kb2luQ29uZmlnOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworQElnbm9yZQorLy8gRklYTUUgMTAuNy4yMDE3OiB0aGlzIHRlc3QgbmVlZHMgYSBydW5uaW5nIE9EUyBTZXJ2ZXIsIHRoYXQgaXMgbm90IHN1aXRhYmxlIGZvciBjb250aW5vdXMgYnVpbGQgaW4gSmVua2lucy4KKy8vIENvbW1lbnQgdGhpcyBpbiBmb3IgbG9jYWwgdGVzdHMgb25seS4KK3B1YmxpYyBjbGFzcyBPRFNTZWFyY2hTZXJ2aWNlSVQgeworCisJLyoKKwkgKiBBVFRFTlRJT046ID09PT09PT09PT0KKwkgKgorCSAqIFRvIHJ1biB0aGlzIHRlc3QgbWFrZSBzdXJlIHRoZSB0YXJnZXQgc2VydmljZSBpcyBydW5uaW5nIGEgTURNIGRlZmF1bHQgbW9kZWwKKwkgKiBhbmQgYW55IGRhdGFiYXNlIGNvbnN0cmFpbnQgd2hpY2ggZW5mb3JjZXMgYSByZWxhdGlvbiBvZiBUZXN0IHRvIGEgcGFyZW50CisJICogZW50aXR5IGlzIGRlYWN0aXZhdGVkIQorCSAqLworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU0VSVklDRSA9ICJjb3JiYWxvYzo6MS4yQCVzOiVzL05hbWVTZXJ2aWNlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSID0gInNhIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAic2EiOworCisJcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7CisJcHJpdmF0ZSBzdGF0aWMgTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwlwcml2YXRlIHN0YXRpYyBTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2U7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBCZWZvcmVDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlSG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaG9zdCIpOworCQlTdHJpbmcgbmFtZVNlcnZpY2VQb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJwb3J0Iik7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic2VydmljZSIpOworCisJCWlmIChuYW1lU2VydmljZUhvc3QgPT0gbnVsbCB8fCBuYW1lU2VydmljZUhvc3QuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuYW1lIHNlcnZpY2UgaG9zdCBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdob3N0JyIpOworCQl9CisKKwkJbmFtZVNlcnZpY2VQb3J0ID0gbmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSA/IFN0cmluZy52YWx1ZU9mKDI4MDkpIDogbmFtZVNlcnZpY2VQb3J0OworCQlpZiAobmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIHBvcnQgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAncG9ydCciKTsKKwkJfQorCisJCWlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VOYW1lLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBuYW1lIGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3NlcnZpY2UnIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fTkFNRVNFUlZJQ0UsIFN0cmluZy5mb3JtYXQoTkFNRV9TRVJWSUNFLCBuYW1lU2VydmljZUhvc3QsIG5hbWVTZXJ2aWNlUG9ydCkpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fU0VSVklDRU5BTUUsIHNlcnZpY2VOYW1lICsgIi5BU0FNLU9EUyIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fVVNFUiwgVVNFUik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9QQVNTV09SRCwgUEFTU1dPUkQpOworCisJCWNvbnRleHQgPSBuZXcgT0RTQ29udGV4dEZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKwkJbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKE1vZGVsTWFuYWdlci5jbGFzcykpOworCQlzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2VhcmNoIHNlcnZpY2Ugbm90IGF2YWlsYWJsZS4iKSk7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25BZnRlckNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQljb250ZXh0LmNsb3NlKCk7CisJCX0KKwl9CisKKwlmaW5hbCBjbGFzcyBNZWFzdXJlbWVudFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBsb2FkIHtAbGluayBFbnRpdHlUeXBlfXMuCisJCSAqIEBwYXJhbSBjb250ZXh0U3RhdGUgVGhlIHtAbGluayBDb250ZXh0U3RhdGV9LgorCQkgKi8KKwkJTWVhc3VyZW1lbnRTZWFyY2hRdWVyeShPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBDb250ZXh0U3RhdGUgY29udGV4dFN0YXRlKSB7CisJCQlzdXBlcihtb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSwgUGFyYW1ldGVyU2V0LmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkJLy8gbGF5ZXJzCisJCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoUG9vbC5jbGFzcywgUHJvamVjdC5jbGFzcykpOworCQkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3QuY2xhc3MsIFBvb2wuY2xhc3MpKTsKKwkJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChUZXN0U3RlcC5jbGFzcywgVGVzdC5jbGFzcykpOworCQkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKE1lYXN1cmVtZW50LmNsYXNzLCBUZXN0U3RlcC5jbGFzcykpOworCQkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBhcmFtZXRlclNldC5jbGFzcywgTWVhc3VyZW1lbnQuY2xhc3MpKTsKKwkJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKE1lYXN1cmVtZW50LmNsYXNzLCBDaGFubmVsLmNsYXNzKSk7CisJCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbEdyb3VwLmNsYXNzKSk7CisKKwkJCS8vIGNvbnRleHQKKwkJCWFkZEpvaW5Db25maWcoY29udGV4dFN0YXRlKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBFeHRyYWN0b3I8RmlsdGVySXRlbSwgVHVwbGU+IGZpbHRlckV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yPEZpbHRlckl0ZW0sIFR1cGxlPigpIHsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFR1cGxlIGV4dHJhY3QoRmlsdGVySXRlbSBmKSB7CisJCQlyZXR1cm4gdHVwbGUoZi5pc0Jvb2xlYW5PcGVyYXRvcigpID8gZi5nZXRCb29sZWFuT3BlcmF0b3IoKSA6IG51bGwsCisJCQkJCWYuaXNDb25kaXRpb24oKSA/IGYuZ2V0Q29uZGl0aW9uKCkuZ2V0QXR0cmlidXRlKCkuZ2V0TmFtZSgpIDogbnVsbCwKKwkJCQkJZi5pc0NvbmRpdGlvbigpID8gZi5nZXRDb25kaXRpb24oKS5nZXRDb21wYXJpc29uT3BlcmF0b3IoKSA6IG51bGwsCisJCQkJCWYuaXNDb25kaXRpb24oKSA/IGYuZ2V0Q29uZGl0aW9uKCkuZ2V0VmFsdWUoKS5leHRyYWN0KCkgOiBudWxsLAorCQkJCQlmLmlzQnJhY2tldE9wZXJhdG9yKCkgPyBmLmdldEJyYWNrZXRPcGVyYXRvcigpIDogbnVsbCk7CisJCX0KKwl9OworCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldE1lcmdlZEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCU9EU1NlYXJjaFNlcnZpY2Ugc2VydmljZSA9IE1vY2tpdG8uc3B5KChPRFNTZWFyY2hTZXJ2aWNlKSBzZWFyY2hTZXJ2aWNlKTsKKworCQlNb2NraXRvLmRvUmV0dXJuKEltbXV0YWJsZU1hcC5vZihUZXN0U3RlcC5jbGFzcywgQXJyYXlzLmFzTGlzdCgiMTAiKSkpLndoZW4oc2VydmljZSkKKwkJCQkuZmV0Y2hJZHMoTW9ja2l0by5hbnlTdHJpbmcoKSk7CisKKwkJRW50aXR5VHlwZSB0ZXN0U3RlcCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKworCQlhc3NlcnRUaGF0KHNlcnZpY2UuZ2V0TWVyZ2VkRmlsdGVyKEZpbHRlci5pZE9ubHkodGVzdFN0ZXAsICIxMSIpLCAicXVlcnkiKSkuaGFzU2l6ZSg3KQorCQkJCS5leHRyYWN0aW5nKGZpbHRlckV4dHJhY3RvcnMpLmNvbnRhaW5zRXhhY3RseSh0dXBsZShudWxsLCBudWxsLCBudWxsLCBudWxsLCBCcmFja2V0T3BlcmF0b3IuT1BFTiksCisJCQkJCQl0dXBsZShudWxsLCAiSWQiLCBDb21wYXJpc29uT3BlcmF0b3IuRVFVQUwsICIxMCIpLAorCQkJCQkJdHVwbGUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgQnJhY2tldE9wZXJhdG9yLkNMT1NFKSwKKwkJCQkJCXR1cGxlKEJvb2xlYW5PcGVyYXRvci5BTkQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLAorCQkJCQkJdHVwbGUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgQnJhY2tldE9wZXJhdG9yLk9QRU4pLAorCQkJCQkJdHVwbGUobnVsbCwgIklkIiwgQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVCwgbmV3IFN0cmluZ1tdIHsgIjEwIiB9LCBudWxsKSwKKwkJCQkJCXR1cGxlKG51bGwsIG51bGwsIG51bGwsIG51bGwsIEJyYWNrZXRPcGVyYXRvci5DTE9TRSkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXJnZWRGaWx0ZXJOb0F0dHJpYnV0ZUZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNTZWFyY2hTZXJ2aWNlIHNlcnZpY2UgPSBNb2NraXRvLnNweSgoT0RTU2VhcmNoU2VydmljZSkgc2VhcmNoU2VydmljZSk7CisKKwkJTW9ja2l0by5kb1JldHVybihJbW11dGFibGVNYXAub2YoVGVzdFN0ZXAuY2xhc3MsIEFycmF5cy5hc0xpc3QoIjEwIikpKS53aGVuKHNlcnZpY2UpCisJCQkJLmZldGNoSWRzKE1vY2tpdG8uYW55U3RyaW5nKCkpOworCisJCWFzc2VydFRoYXQoc2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmFuZCgpLCAicXVlcnkiKSkuZXh0cmFjdGluZyhmaWx0ZXJFeHRyYWN0b3JzKQorCQkJCS5jb250YWluc0V4YWN0bHkodHVwbGUobnVsbCwgIklkIiwgQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVCwgbmV3IFN0cmluZ1tdIHsgIjEwIiB9KSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldE1lcmdlZEZpbHRlck5vRnJlZXRleHRSZXN1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT0RTU2VhcmNoU2VydmljZSBzZXJ2aWNlID0gTW9ja2l0by5zcHkoKE9EU1NlYXJjaFNlcnZpY2UpIHNlYXJjaFNlcnZpY2UpOworCisJCU1vY2tpdG8uZG9SZXR1cm4oQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkud2hlbihzZXJ2aWNlKS5mZXRjaElkcyhNb2NraXRvLmFueVN0cmluZygpKTsKKworCQlFbnRpdHlUeXBlIHRlc3RTdGVwID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVGVzdFN0ZXAuY2xhc3MpOworCisJCWFzc2VydFRoYXQoc2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmlkT25seSh0ZXN0U3RlcCwgIjExIiksICIiKSkuZXh0cmFjdGluZyhmaWx0ZXJFeHRyYWN0b3JzKQorCQkJCS5jb250YWluc0V4YWN0bHkodHVwbGUobnVsbCwgIklkIiwgQ29tcGFyaXNvbk9wZXJhdG9yLkVRVUFMLCAiMTEiKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldE1lcmdlZEZpbHRlck5vQXR0cmlidXRlRmlsdGVyQW5kTm9GcmVldGV4dFJlc3VsdCgpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNTZWFyY2hTZXJ2aWNlIHNlcnZpY2UgPSBNb2NraXRvLnNweSgoT0RTU2VhcmNoU2VydmljZSkgc2VhcmNoU2VydmljZSk7CisKKwkJTW9ja2l0by5kb1JldHVybihDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKS53aGVuKHNlcnZpY2UpLmZldGNoSWRzKE1vY2tpdG8uYW55U3RyaW5nKCkpOworCisJCWFzc2VydFRoYXQoc2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmFuZCgpLCBudWxsKSkuaXNFbXB0eSgpOworCisJCWFzc2VydFRoYXQoc2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmFuZCgpLCAiIikpLmlzRW1wdHkoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU1NlYXJjaFNlcnZpY2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU1NlYXJjaFNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1ZDc5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvT0RTU2VhcmNoU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIE9EU1NlYXJjaFNlcnZpY2VUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldE1lcmdlZEZpbHRlcigpIHsKKwkJRW50aXR5VHlwZSB0ZXN0RW50aXR5ID0gbW9ja0VudGl0eVR5cGUoKTsKKwkJT0RTU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gbW9ja09EU1NlYXJjaFNlcnZpY2UodGVzdEVudGl0eSk7CisKKwkJLy8gTm8gZnJlZXRleHQgcXVlcnkgLT4gb3JpZ2luYWwgZmlsdGVyIGlzIHJldHVybmVkCisJCWFzc2VydFRoYXQoc2VhcmNoU2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmlkT25seSh0ZXN0RW50aXR5LCAiMSIpLCAiIikpCisJCQkJLmlzRXF1YWxUbyhGaWx0ZXIuYW5kKCkuaWQodGVzdEVudGl0eSwgIjEiKSk7CisKKwkJLy8gRnJlZXRleHQgcXVlcnkgd2l0aCByZXN1bHQgLT4gY29uanVjdGlvbiBvZiBvbGQgZmlsdGVyIGFuZCBmaWx0ZXIgZ2VuZXJhdGVkCisJCS8vIGJ5IGZyZWV0ZXh0IHJlc3VsdAorCQlhc3NlcnRUaGF0KHNlYXJjaFNlcnZpY2UuZ2V0TWVyZ2VkRmlsdGVyKEZpbHRlci5pZE9ubHkodGVzdEVudGl0eSwgIjEiKSwgImV4aXN0aW5nIikpCisJCQkJLmlzRXF1YWxUbyhGaWx0ZXIuYW5kKCkuaWQodGVzdEVudGl0eSwgIjEiKS5tZXJnZShGaWx0ZXIub3IoKS5pZCh0ZXN0RW50aXR5LCAiNSIpKSk7CisKKwkJLy8gRnJlZXRleHQgcXVlcnkgd2l0aCBubyByZXN1bHQgLT4gZW1wdHkgZmlsdGVyIGlzIHJldHVybmVkCisJCWFzc2VydFRoYXQoc2VhcmNoU2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmlkT25seSh0ZXN0RW50aXR5LCAiMSIpLCAibm90IGV4aXN0aW5nIikpCisJCQkJLmlzRXF1YWxUbyhGaWx0ZXIub3IoKSk7CisKKwkJLy8gTm8gZmlsdGVyIC0+IGZpbHRlciBnZW5lcmF0ZWQgYnkgZnJlZXRleHQgcmVzdWx0IGlzIHJldHVybmVkCisJCWFzc2VydFRoYXQoc2VhcmNoU2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLm9yKCksICJleGlzdGluZyIpKS5pc0VxdWFsVG8oRmlsdGVyLm9yKCkuaWQodGVzdEVudGl0eSwgIjUiKSk7CisJfQorCisJcHJpdmF0ZSBPRFNTZWFyY2hTZXJ2aWNlIG1vY2tPRFNTZWFyY2hTZXJ2aWNlKEVudGl0eVR5cGUgdGVzdEVudGl0eSkgeworCQlPRFNTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBtb2NrKE9EU1NlYXJjaFNlcnZpY2UuY2xhc3MpOworCQl3aGVuKHNlYXJjaFNlcnZpY2UuZ2V0TWVyZ2VkRmlsdGVyKGFueSgpLCBhbnkoKSkpLnRoZW5DYWxsUmVhbE1ldGhvZCgpOworCisJCUZpbHRlciBmID0gRmlsdGVyLm9yKCkuaWQodGVzdEVudGl0eSwgIjUiKTsKKwkJd2hlbihzZWFyY2hTZXJ2aWNlLmdldEZpbHRlckZvckZyZWV0ZXh0UXVlcnkoImV4aXN0aW5nIikpLnRoZW5SZXR1cm4oZik7CisJCXdoZW4oc2VhcmNoU2VydmljZS5nZXRGaWx0ZXJGb3JGcmVldGV4dFF1ZXJ5KCJub3QgZXhpc3RpbmciKSkudGhlblJldHVybihudWxsKTsKKwkJd2hlbihzZWFyY2hTZXJ2aWNlLmdldEZpbHRlckZvckZyZWV0ZXh0UXVlcnkoIiIpKS50aGVuUmV0dXJuKEZpbHRlci5vcigpKTsKKwkJcmV0dXJuIHNlYXJjaFNlcnZpY2U7CisJfQorCisJcHJpdmF0ZSBFbnRpdHlUeXBlIG1vY2tFbnRpdHlUeXBlKCkgeworCQlBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBtb2NrKEF0dHJpYnV0ZS5jbGFzcyk7CisJCXdoZW4oaWRBdHRyaWJ1dGUuZ2V0TmFtZSgpKS50aGVuUmV0dXJuKCJJZCIpOworCQl3aGVuKGlkQXR0cmlidXRlLmNyZWF0ZVZhbHVlKCIiLCAiMSIpKS50aGVuUmV0dXJuKFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJJZCIsICIxIikpOworCisJCUVudGl0eVR5cGUgdGVzdEVudGl0eSA9IG1vY2soRW50aXR5VHlwZS5jbGFzcyk7CisJCXdoZW4odGVzdEVudGl0eS5nZXROYW1lKCkpLnRoZW5SZXR1cm4oIlRlc3RFbnRpdHkiKTsKKwkJd2hlbih0ZXN0RW50aXR5LmdldElEQXR0cmlidXRlKCkpLnRoZW5SZXR1cm4oaWRBdHRyaWJ1dGUpOworCQl3aGVuKGlkQXR0cmlidXRlLmdldEVudGl0eVR5cGUoKSkudGhlblJldHVybih0ZXN0RW50aXR5KTsKKwkJcmV0dXJuIHRlc3RFbnRpdHk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9SZWxhdGlvblNlYXJjaFF1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1JlbGF0aW9uU2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDMxNjhhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9SZWxhdGlvblNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5QYXJhbWV0ZXJTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoLkpvaW5UcmVlLkpvaW5Db25maWc7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgaGVscGVyIHRvIHRoZSB0ZXN0cyBpbgorICogb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLlJlbGF0aW9uVGVzdCBJdCBuZWVkcyB0byBiZSBoZXJlLCBiZWNhdXNlCisgKiBCYXNlRW50aXR5U2VhcmNoUXVlcnkgaXMgZGVjbGFyZWQgYXMgcHJvdGVjdGVkIGluIHRoZQorICogb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaCBwYWNrYWdlLiBJdCBtYWtlcyBzb21lIHNlbnNlIHRvIGxlYXZlCisgKiBpdCBwcm90ZWN0ZWQgaW4gdGhhdCB3YXksIGJlY2F1c2UgaW1wbGVtZW50aW5nIGEgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5CisgKiByZXF1aXJlcyB1bmRlcnN0YW5kaW5nIG9mIHRoZSB1bmRlcmx5aW5nIGRhdGEgbW9kZWwgd2hpY2ggVGhlIFJlbGF0aW9uVGVzdAorICogcmVxdWlyZXMgdGhhdCB0aGUgcmVsYXRlZCBwYXJhbWV0ZXJzZXRzIHRvIGEgbWVhc3VyZW1lbnQgYXJlIGxvYWRlZC4gVGhpcworICogY2xhc3MgcHJvdmlkZXMgYSBKb2luQ29uZmlnIHdoaWNoIGFsbG93cyB0aGlzIHRvIGhhcHBlbiBieSBkZWZpbmluZyB0aGUgd2F5CisgKiB0aGUgZW50aXRpZXMgaW4gcXVlc3Rpb24gaGF2ZSB0byBiZSBqb2luZWQuIElmIHdlIHdvdWxkbid0IGpvaW4gdGhlCisgKiBQYXJhbWV0ZXJTZXQgaW4sIHRoZSByZWxhdGVkIGVudGl0aWVzIHdvdWxkIG5vdCBiZSBsb2FkZWQsIGFuZCBpdCB3b3VsZCBiZQorICogaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbGF0ZWQgUGFyYW1ldGVyU2V0cyBvciBub3QuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVsYXRpb25TZWFyY2hRdWVyeSBleHRlbmRzIEJhc2VFbnRpdHlTZWFyY2hRdWVyeSB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBsb2FkIHtAbGluayBFbnRpdHlUeXBlfXMuCisJICogQHBhcmFtIGNvbnRleHRTdGF0ZSBUaGUge0BsaW5rIENvbnRleHRTdGF0ZX0uCisJICovCisJcHVibGljIFJlbGF0aW9uU2VhcmNoUXVlcnkoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSkgeworCQlzdXBlcihtb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSwgUGFyYW1ldGVyU2V0LmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkvLyBsYXllcnMKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBvb2wuY2xhc3MsIFByb2plY3QuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3QuY2xhc3MsIFBvb2wuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3RTdGVwLmNsYXNzLCBUZXN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChNZWFzdXJlbWVudC5jbGFzcywgVGVzdFN0ZXAuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBhcmFtZXRlclNldC5jbGFzcywgTWVhc3VyZW1lbnQuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWwuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWxHcm91cC5jbGFzcykpOworCisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0NvbnZlcnRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNDb252ZXJ0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmMDI5YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNDb252ZXJ0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLlRTX1VuaW9uU2VxOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UU19WYWx1ZVNlcTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIE9EU0NvbnZlcnRlclRlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxT0RTRGF0ZVllYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT0RTQXR0cmlidXRlIGF0dHIgPSBtb2NrKE9EU0F0dHJpYnV0ZS5jbGFzcyk7CisKKwkJT0RTQ29udmVydGVyLmZyb21PRFNWYWx1ZVNlcShhdHRyLCBBZ2dyZWdhdGlvbi5OT05FLCAiIiwgZ2V0VFNfVmFsdWVTZXFGcm9tRGF0ZXMoIjIwMTciKSk7CisKKwkJdmVyaWZ5KGF0dHIpLmNyZWF0ZVZhbHVlKGVxKCIiKSwgZXEodHJ1ZSksIGVxKExvY2FsRGF0ZVRpbWUub2YoMjAxNywgMSwgMSwgMCwgMCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGcm9tT0RTVmFsdWVTZXFPRFNEYXRlTW9udGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT0RTQXR0cmlidXRlIGF0dHIgPSBtb2NrKE9EU0F0dHJpYnV0ZS5jbGFzcyk7CisKKwkJT0RTQ29udmVydGVyLmZyb21PRFNWYWx1ZVNlcShhdHRyLCBBZ2dyZWdhdGlvbi5OT05FLCAiIiwgZ2V0VFNfVmFsdWVTZXFGcm9tRGF0ZXMoIjIwMTcxMCIpKTsKKworCQl2ZXJpZnkoYXR0cikuY3JlYXRlVmFsdWUoZXEoIiIpLCBlcSh0cnVlKSwgZXEoTG9jYWxEYXRlVGltZS5vZigyMDE3LCAxMCwgMSwgMCwgMCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGcm9tT0RTVmFsdWVTZXFPRFNEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9EU0F0dHJpYnV0ZSBhdHRyID0gbW9jayhPRFNBdHRyaWJ1dGUuY2xhc3MpOworCisJCU9EU0NvbnZlcnRlci5mcm9tT0RTVmFsdWVTZXEoYXR0ciwgQWdncmVnYXRpb24uTk9ORSwgIiIsIGdldFRTX1ZhbHVlU2VxRnJvbURhdGVzKCIyMDE3MTAwNCIpKTsKKworCQl2ZXJpZnkoYXR0cikuY3JlYXRlVmFsdWUoZXEoIiIpLCBlcSh0cnVlKSwgZXEoTG9jYWxEYXRlVGltZS5vZigyMDE3LCAxMCwgNCwgMCwgMCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGcm9tT0RTVmFsdWVTZXFPRFNEYXRlSG91cigpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNBdHRyaWJ1dGUgYXR0ciA9IG1vY2soT0RTQXR0cmlidXRlLmNsYXNzKTsKKworCQlPRFNDb252ZXJ0ZXIuZnJvbU9EU1ZhbHVlU2VxKGF0dHIsIEFnZ3JlZ2F0aW9uLk5PTkUsICIiLCBnZXRUU19WYWx1ZVNlcUZyb21EYXRlcygiMjAxNzEwMDQxMiIpKTsKKworCQl2ZXJpZnkoYXR0cikuY3JlYXRlVmFsdWUoZXEoIiIpLCBlcSh0cnVlKSwgZXEoTG9jYWxEYXRlVGltZS5vZigyMDE3LCAxMCwgNCwgMTIsIDApKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxT0RTRGF0ZU1pbnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNBdHRyaWJ1dGUgYXR0ciA9IG1vY2soT0RTQXR0cmlidXRlLmNsYXNzKTsKKworCQlPRFNDb252ZXJ0ZXIuZnJvbU9EU1ZhbHVlU2VxKGF0dHIsIEFnZ3JlZ2F0aW9uLk5PTkUsICIiLCBnZXRUU19WYWx1ZVNlcUZyb21EYXRlcygiMjAxNzEwMDQxMjEzIikpOworCisJCXZlcmlmeShhdHRyKS5jcmVhdGVWYWx1ZShlcSgiIiksIGVxKHRydWUpLCBlcShMb2NhbERhdGVUaW1lLm9mKDIwMTcsIDEwLCA0LCAxMiwgMTMpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxT0RTRGF0ZVNlY29uZCgpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNBdHRyaWJ1dGUgYXR0ciA9IG1vY2soT0RTQXR0cmlidXRlLmNsYXNzKTsKKworCQlPRFNDb252ZXJ0ZXIuZnJvbU9EU1ZhbHVlU2VxKGF0dHIsIEFnZ3JlZ2F0aW9uLk5PTkUsICIiLCBnZXRUU19WYWx1ZVNlcUZyb21EYXRlcygiMjAxNzEwMDQxMjEzMTQiKSk7CisKKwkJdmVyaWZ5KGF0dHIpLmNyZWF0ZVZhbHVlKGVxKCIiKSwgZXEodHJ1ZSksIGVxKExvY2FsRGF0ZVRpbWUub2YoMjAxNywgMTAsIDQsIDEyLCAxMywgMTQsIDApKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxT0RTRGF0ZU1pbGxpc2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9EU0F0dHJpYnV0ZSBhdHRyID0gbW9jayhPRFNBdHRyaWJ1dGUuY2xhc3MpOworCisJCU9EU0NvbnZlcnRlci5mcm9tT0RTVmFsdWVTZXEoYXR0ciwgQWdncmVnYXRpb24uTk9ORSwgIiIsIGdldFRTX1ZhbHVlU2VxRnJvbURhdGVzKCIyMDE3MTAwNDEyMTMxNDEyMyIpKTsKKworCQl2ZXJpZnkoYXR0cikuY3JlYXRlVmFsdWUoZXEoIiIpLCBlcSh0cnVlKSwgZXEoTG9jYWxEYXRlVGltZS5vZigyMDE3LCAxMCwgNCwgMTIsIDEzLCAxNCwgMTIzXzAwMF8wMDApKSk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdEZyb21PRFNWYWx1ZVNlcUludmFsaWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT0RTQXR0cmlidXRlIGF0dHIgPSBtb2NrKE9EU0F0dHJpYnV0ZS5jbGFzcyk7CisKKwkJT0RTQ29udmVydGVyLmZyb21PRFNWYWx1ZVNlcShhdHRyLCBBZ2dyZWdhdGlvbi5OT05FLCAiIiwgZ2V0VFNfVmFsdWVTZXFGcm9tRGF0ZXMoIjIwMTcxMDA0MSIpKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxSW52YWxpZE1vbnRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9EU0F0dHJpYnV0ZSBhdHRyID0gbW9jayhPRFNBdHRyaWJ1dGUuY2xhc3MpOworCisJCU9EU0NvbnZlcnRlci5mcm9tT0RTVmFsdWVTZXEoYXR0ciwgQWdncmVnYXRpb24uTk9ORSwgIiIsIGdldFRTX1ZhbHVlU2VxRnJvbURhdGVzKCIyMDE3MTMwNCIpKTsKKwl9CisKKwlwcml2YXRlIFRTX1ZhbHVlU2VxIGdldFRTX1ZhbHVlU2VxRnJvbURhdGVzKFN0cmluZy4uLiBkYXRlcykgeworCQlUU19VbmlvblNlcSB1ID0gbmV3IFRTX1VuaW9uU2VxKCk7CisJCXUuZGF0ZVZhbChkYXRlcyk7CisJCXJldHVybiBuZXcgVFNfVmFsdWVTZXEodSwgbmV3IHNob3J0W10geyAxNSB9KTsKKwl9Cit9Cg==